Mail ist eine Internetbibliothek für Ruby, die so konzipiert ist, dass sie die E -Mail -Erzeugung, die Parsen und das Senden von Rubyesque -Art und Weise behandelt.
Der Zweck dieser Bibliothek besteht darin, einen einzigen Zugriffspunkt für die Bearbeitung aller E -Mail -Funktionen zu ermöglichen, einschließlich Senden und Empfangen von E -Mails. Alle Netzwerktypaktionen erfolgen durch Proxy -Methoden zu net :: SMTP, net :: pop3 usw.
Aus meiner Erfahrung mit TMAIL wurde es als reine Ruby -Implementierung entwickelt, die das Generieren, Senden und Parsen von E -Mails zu einem Kinderspiel macht.
Es ist auch von Grund auf, mit den moderneren Versionen von Ruby zu arbeiten. Moderne Rubies behandeln Textcodierungen viel mehr wunderbarer als zuvor, sodass diese Funktionen in dieser Bibliothek voll ausgenutzt wurden, sodass E -Mails viel mehr sauberer als Tmail verarbeiten können.
Schließlich wurde Mail mit einem sehr einfachen objektorientierten System entwickelt, das die E -Mail -Nachrichten, die Sie analysieren, wirklich öffnet. Wenn Sie wissen, was Sie tun, können Sie mit jedem letzten Teil Ihrer E -Mail direkt herumgespielt werden.
Ja, du! Mail wird in unzähligen Apps von Menschen auf der ganzen Welt verwendet. Es ist wie alle Open -Source -Software eine Liebesarbeit aus unserer Freizeit. Wenn Sie sich bedanken möchten, gehen Sie bitte ein und tragen Sie zusammen mit uns bei! Triage und Behebung von Github -Problemen, Verbesserung unserer Dokumentation, fügen Sie neue Funktionen hinzu - UP! Danke, dass du einmacht hast.
Mail wird getestet gegen:
Da neue Versionen von Ruby veröffentlicht werden, ist die Mail mit der Unterstützung für die "Vorschau" und alle "normalen Wartung", "Sicherheitstart" und die beiden neuesten "End of Life" -Versionen, die auf der Seite "Ruby Maintenance" aufgeführt sind, kompatibel. Pull -Anfragen zur Unterstützung des Hinzufügens von Unterstützung für neue Vorschau -Veröffentlichungen sind mehr als willkommen.
Jedes Mail -Commit wird von Github -Aktionen auf allen unterstützten Ruby -Versionen getestet.
Wenn Sie die Post mit gleichgesinnten Personen besprechen möchten, abonnieren Sie bitte die Google -Gruppe.
Mail ist jetzt RFC5322 und RFC6532-konform, dh sie kann US-ASCII- und UTF-8-E-Mail analysieren und US-Ascii-E-Mails generieren. Es gibt einige veraltete E -Mail -Syntax, mit der sie Probleme haben wird, aber es ist auch ziemlich robust, dh wenn es etwas findet, das nicht versteht, dass es nicht abstürzt, wird das Problem übersprungen und analysiert. Bei einem Header, den es nicht versteht, wird der Header als optionales unstrukturiertes Feld initialisiert und analysiert.
Dies bedeutet, dass Mail Ihre Daten (glaube ich) nicht (jemals) knirschen wird.
Sie können auch MIME -E -Mails erstellen. Es gibt Helfermethoden, um eine mehrteilige/alternative E -Mail für Text/Ebene und Text/HTML (das häufigste Paar) zu erstellen, und Sie können jede andere Art von MIME -E -Mail manuell erstellen.
Neben Todo:
Grundsätzlich ... wir machen BDD per Post. Keine Methode wird in Mail ohne entsprechende oder abdeckende Spezifikation geschrieben. Wir erwarten eine mindestens 100% ige Abdeckung, gemessen von RCOV. Dies ist zwar in keiner Weise perfekt, aber es ist ziemlich gut. Zusätzlich sollen alle Funktionstests von Tmail bestehen, bevor das Edelstein veröffentlicht wird.
Es bedeutet auch, dass Sie sicher sein können, dass sich die Mail korrekt verhalten wird.
Sie können Tests lokal ausführen, indem Sie bundle exec rspec
ausführen.
Sie können Tests auf allen unterstützten Ruby -Versionen mithilfe von ACT durchführen.
Keine API -Entfernung innerhalb einer einzigen Punktfreisetzung. Alle Entfernungen, die vor dem Entfernen mit Warnungen für mindestens eine kleine Punktfreisetzung abgeschrieben werden sollen.
Außerdem sind alle privaten oder geschützten Methoden als solche - obwohl dies immer noch I/P ist.
Die Installation ist ziemlich einfach, ich habe Mail auf Rubygemems hoste, damit Sie es einfach tun können:
# gem install mail
Wenn Sie es nicht wussten, ist es nicht so einfach, Codierungen in E -Mails zu behandeln, wie Sie es sich erhoffen.
Ich habe versucht, es einige zu vereinfachen:
Alle Objekte, die zu einer E -Mail gerendert werden können, haben eine #encoded
-Methode. Coded gibt das Objekt als vollständige Zeichenfolge zurück, die zum Senden des Mail -Systems bereit ist, dh das Header -Feld und den Wert und das CRLF am Ende und eingewickelt nach Bedarf.
Alle Objekte, die zu einer E -Mail gerendern können, haben eine #decoded
Methode. Decoded gibt den "Wert" des Objekts nur als Zeichenfolge zurück. Dies bedeutet, dass es die Headerfelder nicht enthalten (wie "zu:" oder "Subjekt").
Standardmäßig wird das Aufrufen #to_s
in einem Containerobjekt seine codierte Methode aufruft, während #to_s
in einem Feldobjekt seine dekodierte Methode aufruft. Wenn Sie #to_s
in einem Mail -Objekt aufrufen, gibt die E -Mails die E -Mail zurück, alle codiert bereit zu senden, während Sie #to_s
auf dem Feld aus dem Feld oder in der Stelle den dekodierten Wert des Objekts zurückrufen. Das Header -Mail -Objekt wird als Container angesehen. Wenn Sie Zweifel haben, rufen Sie #encoded
an oder #decoded
explizit, dies ist sicherer, wenn Sie sich nicht sicher sind.
Strukturierte Felder mit Parameterwerten, die codiert werden können (EG-Inhaltstyp), liefern dekodierte Parameterwerte, wenn Sie die Parameternamen als Methoden gegen das Objekt aufrufen.
Strukturierte Felder mit Parameterwerten, die codiert werden können (EG-Inhaltstyp), liefern codierte Parameterwerte, wenn Sie die Parameternamen über das object.parameters['<parameter_name>']
aufrufen.
Bitte! Der Beitrag ist einfach in Post. Bitte lesen Sie das Dokument für die Mitarbeiterin.md für weitere Informationen.
Alle wichtigen E -Mail -Funktionen sollten aus dem Mail -Modul auftreten können. Sie sollten also in der Lage sein, nur require 'mail'
, um loszulegen.
mail
ist in seinem Ruby -Code ziemlich gut dokumentiert. Sie können nach Rubydoc.info nachschlagen.
mail = Mail . new do
from '[email protected]'
to '[email protected]'
subject 'This is a test email'
body File . read ( 'body.txt' )
end
mail . to_s #=> "From: [email protected]: you@...
mail = Mail . new do
body File . read ( 'body.txt' )
end
mail [ 'from' ] = '[email protected]'
mail [ :to ] = '[email protected]'
mail . subject = 'This is a test email'
mail . header [ 'X-Custom-Header' ] = 'custom value'
mail . to_s #=> "From: [email protected]: you@...
mail = Mail . new do
to '[email protected]'
body 'Some simple body'
end
mail . to_s =~ /Message - ID: <[ d w _]+@.+.mail/ #=> 27
Mail fügt automatisch ein Nachrichten-ID-Feld hinzu, wenn es fehlt, und gibt ihm eine eindeutige, zufällige Nachrichten-ID in den Zeilen von:
mail = Mail . new do
to '[email protected]'
message_id '<[email protected]>'
body 'Some simple body'
end
mail . to_s =~ /Message - ID: <[email protected]>/ #=> 27
Mail nimmt die Message_id, die Sie ihm zuweisen und vertrauen, dass Sie wissen, was Sie tun.
E -Mail -Standards zum Senden über SMTP an den lokalen Host -Port 25. Wenn Sie über einen Sendmail- oder Postfix -Daemon auf diesem Port ausgeführt werden, ist das Senden von E -Mails so einfach wie:
Mail . deliver do
from '[email protected]'
to '[email protected]'
subject 'Here is the image you wanted'
body File . read ( 'body.txt' )
add_file '/full/path/to/somefile.png'
end
oder
mail = Mail . new do
from '[email protected]'
to '[email protected]'
subject 'Here is the image you wanted'
body File . read ( 'body.txt' )
add_file :filename => 'somefile.png' , :content => File . read ( '/somefile.png' )
end
mail . deliver!
Das Senden über Sendmail kann wie SO erfolgen:
mail = Mail . new do
from '[email protected]'
to '[email protected]'
subject 'Here is the image you wanted'
body File . read ( 'body.txt' )
add_file :filename => 'somefile.png' , :content => File . read ( '/somefile.png' )
end
mail . delivery_method :sendmail
mail . deliver
Senden über SMTP (z. B. an Mailcatcher)
Mail . defaults do
delivery_method :smtp , address : "localhost" , port : 1025
end
EXIM benötigt einen eigenen Liefermanager und kann so verwendet werden:
mail . delivery_method :exim , :location => "/usr/bin/exim"
mail . deliver
Die Mail kann auch an eine Protokolldatei "geliefert" werden, um sich zu entwickeln und zu testen:
# Delivers by logging the encoded message to $stdout
mail . delivery_method :logger
# Delivers to an existing logger at :debug severity
mail . delivery_method :logger , logger : other_logger , severity : :debug
Sie können E -Mails so konfigurieren, dass E -Mails mit retriever_method
in Mail.defaults
mithilfe von Retriever_Method empfangen werden:
# e.g. POP3
Mail . defaults do
retriever_method :pop3 , :address => "pop.gmail.com" ,
:port => 995 ,
:user_name => '<username>' ,
:password => '<password>' ,
:enable_ssl => true
end
# IMAP
Mail . defaults do
retriever_method :imap , :address => "imap.mailbox.org" ,
:port => 993 ,
:user_name => '<username>' ,
:password => '<password>' ,
:enable_ssl => true
end
Sie können auf eingehende E -Mails auf verschiedene Weise zugreifen.
Die neueste E -Mail:
Mail . all #=> Returns an array of all emails
Mail . first #=> Returns the first unread email
Mail . last #=> Returns the last unread email
Die ersten 10 E -Mails sortiert nach Datum in aufsteigender Reihenfolge:
emails = Mail . find ( :what => :first , :count => 10 , :order => :asc )
emails . length #=> 10
Oder sogar alle E -Mails:
emails = Mail . all
emails . length #=> LOTS!
mail = Mail . read ( '/path/to/message.eml' )
mail . envelope_from #=> '[email protected]'
mail . from . addresses #=> ['[email protected]', '[email protected]']
mail . sender . address #=> '[email protected]'
mail . to #=> '[email protected]'
mail . cc #=> '[email protected]'
mail . subject #=> "This is the subject"
mail . date . to_s #=> '21 Nov 1997 09:55:06 -0600'
mail . message_id #=> '<[email protected]>'
mail . decoded #=> 'This is the body of the email...
Viele weitere Methoden verfügbar.
mail = Mail . read ( 'multipart_email' )
mail . multipart? #=> true
mail . parts . length #=> 2
mail . body . preamble #=> "Text before the first part"
mail . body . epilogue #=> "Text after the last part"
mail . parts . map { | p | p . content_type } #=> ['text/plain', 'application/pdf']
mail . parts . map { | p | p . class } #=> [Mail::Message, Mail::Message]
mail . parts [ 0 ] . content_type_parameters #=> {'charset' => 'ISO-8859-1'}
mail . parts [ 1 ] . content_type_parameters #=> {'name' => 'my.pdf'}
Mail erzeugt einen Teilebaum. Jede Nachricht hat viele oder keine Teile. Jeder Teil ist eine andere Nachricht, die viele oder keine Teile haben kann.
Eine Nachricht hat nur Teile, wenn es sich um einen mehrteiligen/gemischten oder mehrteiligen/verwandten Inhaltstyp handelt und eine Grenze definiert ist.
mail . attachments . each do | attachment |
# Attachments is an AttachmentsList object containing a
# number of Part objects
if ( attachment . content_type . start_with? ( 'image/' ) )
# extracting images for example...
filename = attachment . filename
begin
File . open ( images_dir + filename , "w+b" , 0644 ) { | f | f . write attachment . decoded }
rescue => e
puts "Unable to save data for #{ filename } because #{ e . message } "
end
end
end
Mail macht einige grundlegende Annahmen und macht das gemeinsame Ding so einfach wie möglich ... (fragt viel aus einer Mail -Bibliothek)
mail = Mail . deliver do
part :content_type => "multipart/mixed" do | p1 |
p1 . part :content_type => "multipart/related" do | p2 |
p2 . part :content_type => "multipart/alternative" ,
:content_disposition => "inline" do | p3 |
p3 . part :content_type => "text/plain; charset=utf-8" ,
:body => "Here is the attachment you wanted n "
p3 . part :content_type => "text/html; charset=utf-8" ,
:body => "<h1>Funky Title</h1><p>Here is the attachment you wanted</p> n "
end
end
add_file '/path/to/myfile.pdf'
end
from "Mikel Lindsaar <[email protected]>"
to "[email protected]"
subject "First multipart email sent with Mail"
end
Mail liefert dann die E -Mail am Ende des Blocks und gibt das resultierende Mail :: message -Objekt zurück, das Sie dann überprüfen können, wenn Sie dies wünschen ...
puts mail.to_s #=>
Date: Tue, 26 Apr 2022 20:12:07 +0200
From: Mikel Lindsaar <[email protected]>
To: [email protected]
Message-ID: <[email protected]>
Subject: First multipart email sent with Mail
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="--==_mimepart_626835f733867_10873fdfa3c2ffd494636";
charset=UTF-8
Content-Transfer-Encoding: 7bit
----==_mimepart_626835f733867_10873fdfa3c2ffd494636
Content-Type: multipart/mixed;
boundary="--==_mimepart_626835f73382a_10873fdfa3c2ffd494518";
charset=UTF-8
Content-Transfer-Encoding: 7bit
----==_mimepart_626835f73382a_10873fdfa3c2ffd494518
Content-Type: multipart/related;
boundary="--==_mimepart_626835f7337f5_10873fdfa3c2ffd494438";
charset=UTF-8
Content-Transfer-Encoding: 7bit
----==_mimepart_626835f7337f5_10873fdfa3c2ffd494438
Content-Type: multipart/alternative;
boundary="--==_mimepart_626835f733702_10873fdfa3c2ffd494376";
charset=UTF-8
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
Content-ID: <[email protected]>
----==_mimepart_626835f733702_10873fdfa3c2ffd494376
Content-Type: text/plain;
charset=utf-8
Content-Transfer-Encoding: 7bit
Here is the attachment you wanted
----==_mimepart_626835f733702_10873fdfa3c2ffd494376
Content-Type: text/html;
charset=utf-8
Content-Transfer-Encoding: 7bit
<h1>Funky Title</h1><p>Here is the attachment you wanted</p>
----==_mimepart_626835f733702_10873fdfa3c2ffd494376--
----==_mimepart_626835f7337f5_10873fdfa3c2ffd494438--
----==_mimepart_626835f73382a_10873fdfa3c2ffd494518--
----==_mimepart_626835f733867_10873fdfa3c2ffd494636
Content-Type: text/plain;
charset=UTF-8;
filename=myfile.txt
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename=myfile.txt
Content-ID: <6
[email protected]>
Hallo,
Test
End
----==_mimepart_626835f733867_10873fdfa3c2ffd494636--
E-Mail fügt die Inhaltsübertragungscodierung, die MIME-Version, die Inhalts-IDs ein und verarbeitet den Inhaltstyp und die Grenze.
Mail geht davon aus, dass Ihre Übertragungscodierung, wenn Ihr Text im Körper nur US-ASCII ist, 7bit ist und Text/Ebene ist. Sie können dies überschreiben, indem Sie es explizit deklarieren.
Sie müssen keinen Block mit dem Text und dem HTML -Teil verwenden, können ihn einfach deklarativ tun. Sie müssen jedoch einer E -Mail Mail :: Teile hinzufügen, nicht Mail :: Nachrichten.
mail = Mail . new do
to '[email protected]'
from 'Mikel Lindsaar <[email protected]>'
subject 'First multipart email sent with Mail'
end
text_part = Mail :: Part . new do
body 'This is plain text'
end
html_part = Mail :: Part . new do
content_type 'text/html; charset=UTF-8'
body '<h1>This is HTML</h1>'
end
mail . text_part = text_part
mail . html_part = html_part
Führt zu derselben E -Mail wie mit dem Blockformular
@mail = Mail . read ( '/path/to/bounce_message.eml' )
@mail . bounced? #=> true
@mail . final_recipient #=> rfc822;[email protected]
@mail . action #=> failed
@mail . error_status #=> 5.5.0
@mail . diagnostic_code #=> smtp;550 Requested action not taken: mailbox unavailable
@mail . retryable? #=> false
Sie können die Datei einfach von einem absoluten Pfad lesen, Mail wird versuchen, den mime_type zu erraten und die Datei in Base64 für Sie zu codieren.
@mail = Mail . new
@mail . add_file ( "/path/to/file.jpg" )
@mail . parts . first . attachment? #=> true
@mail . parts . first . content_transfer_encoding . to_s #=> 'base64'
@mail . attachments . first . mime_type #=> 'image/jpg'
@mail . attachments . first . filename #=> 'file.jpg'
@mail . attachments . first . decoded == File . read ( '/path/to/file.jpg' ) #=> true
Oder Sie können in File_Data übergeben und ihm einen Dateinamen geben. Wieder wird Mail versuchen, den mime_type für Sie zu erraten.
@mail = Mail . new
@mail . attachments [ 'myfile.pdf' ] = File . read ( 'path/to/myfile.pdf' )
@mail . parts . first . attachment? #=> true
@mail . attachments . first . mime_type #=> 'application/pdf'
@mail . attachments . first . decoded == File . read ( 'path/to/myfile.pdf' ) #=> true
Sie können auch den erratenen MIME -Medientyp überschreiben, wenn Sie es wirklich besser wissen als Mail (dies sollte selten benötigt werden).
@mail = Mail . new
@mail . attachments [ 'myfile.pdf' ] = { :mime_type => 'application/x-pdf' ,
:content => File . read ( 'path/to/myfile.pdf' ) }
@mail . parts . first . mime_type #=> 'application/x-pdf'
Natürlich ... Mail wird auch einen Anhang rundumt
@mail = Mail . new do
to '[email protected]'
from 'Mikel Lindsaar <[email protected]>'
subject 'First multipart email sent with Mail'
text_part do
body 'Here is the attachment you wanted'
end
html_part do
content_type 'text/html; charset=UTF-8'
body '<h1>Funky Title</h1><p>Here is the attachment you wanted</p>'
end
add_file '/path/to/myfile.pdf'
end
@round_tripped_mail = Mail . new ( @mail . encoded )
@round_tripped_mail . attachments . length #=> 1
@round_tripped_mail . attachments . first . filename #=> 'myfile.pdf'
Weitere Informationen "Testen und Extrahieren von Anhängen" oben.
Wenn Mail Teil Ihres Systems ist, benötigen Sie eine Möglichkeit, sie zu testen, ohne tatsächlich E -Mails zu senden, der Testmailer kann dies für Sie tun.
require 'mail'
=> true
Mail . defaults do
delivery_method :test
end
=> #<Mail::Configuration:0x19345a8 @delivery_method=Mail::TestMailer>
Mail :: TestMailer . deliveries
=> [ ]
Mail . deliver do
to '[email protected]'
from '[email protected]'
subject 'testing'
body 'hello'
end
=> #<Mail::Message:0x19284ec ...
Mail :: TestMailer . deliveries . length
=> 1
Mail :: TestMailer . deliveries . first
=> #<Mail::Message:0x19284ec ...
Mail :: TestMailer . deliveries . clear
=> [ ]
Es gibt auch eine Reihe von RSPEC -Spielern, die von den Actionmailer -Matchern von SHOTA gestohlen/inspiriert wurden (Sie möchten auch delivery_method
wie oben festgelegt):
Mail . defaults do
delivery_method :test # in practice you'd do this in spec_helper.rb
end
RSpec . describe "sending an email" do
include Mail :: Matchers
before ( :each ) do
Mail :: TestMailer . deliveries . clear
Mail . deliver do
to [ '[email protected]' , '[email protected]' ]
from '[email protected]'
subject 'testing'
body 'hello'
end
end
it { is_expected . to have_sent_email } # passes if any email at all was sent
it { is_expected . to have_sent_email . from ( '[email protected]' ) }
it { is_expected . to have_sent_email . to ( '[email protected]' ) }
# can specify a list of recipients...
it { is_expected . to have_sent_email . to ( [ '[email protected]' , '[email protected]' ] ) }
# ...or chain recipients together
it { is_expected . to have_sent_email . to ( '[email protected]' ) . to ( '[email protected]' ) }
it { is_expected . to have_sent_email . with_subject ( 'testing' ) }
it { is_expected . to have_sent_email . with_body ( 'hello' ) }
# Can match subject or body with a regex
# (or anything that responds_to? :match)
it { is_expected . to have_sent_email . matching_subject ( /test(ing)?/ ) }
it { is_expected . to have_sent_email . matching_body ( /h(a|e)llo/ ) }
# Can chain together modifiers
# Note that apart from recipients, repeating a modifier overwrites old value.
it { is_expected . to have_sent_email . from ( '[email protected]' ) . to ( '[email protected]' ) . matching_body ( /hell/ )
# test for attachments
# ... by specific attachment
it { is_expected . to have_sent_email . with_attachments ( my_attachment ) }
# ... or any attachment
it { is_expected . to have_sent_email . with_attachments ( any_attachment ) }
# ... or attachment with filename
it { is_expected . to have_sent_email . with_attachments ( an_attachment_with_filename ( 'file.txt' ) ) }
# ... or attachment with mime_type
it { is_expected . to have_sent_email . with_attachments ( an_attachment_with_mime_type ( 'application/pdf' ) ) }
# ... by array of attachments
it { is_expected . to have_sent_email . with_attachments ( [ my_attachment1 , my_attachment2 ] ) } #note that order is important
#... by presence
it { is_expected . to have_sent_email . with_any_attachments }
#... or by absence
it { is_expected . to have_sent_email . with_no_attachments }
end
Die Spezifikationsfixierdateien in Spec/Fixes/E -Mails/von_trec_2005 stammen aus dem 2005 TREC Public Spam Corpus. Sie bleiben im Rahmen der Bedingungen dieses Projekt- und Lizenzvertrags urheberrechtlich geschützt. Sie werden in diesem Projekt verwendet, um die Entwicklung dieser E -Mail -Parser -Implementierung zu überprüfen und zu beschreiben.
http://plg.uwaterloo.ca/~gvcormac/treccorpus/
Sie werden wie "zulässige Verwendungszwecke, Klausel 3" verwendet:
"Small excerpts of the information may be displayed to others
or published in a scientific or technical context, solely for
the purpose of describing the research and development and
related issues."
-- http://plg.uwaterloo.ca/~gvcormac/treccorpus/
(Die MIT -Lizenz)
Copyright (C) 2009-2016 Mikel Lindsaar
Die Erlaubnis wird hiermit kostenlos an eine Person erteilt, die eine Kopie dieser Software und zugehörigen Dokumentationsdateien (der 'Software') erhält, um die Software ohne Einschränkung zu behandeln, einschließlich ohne Einschränkung der Rechte zu verwenden, zu kopieren, zu modifizieren, zu verschmelzen, verschmelzen , veröffentlichen, vertreiben, unterlizenzieren und/oder Kopien der Software verkaufen und Personen, denen die Software dazu bereitgestellt wird, unter den folgenden Bedingungen ermöglicht:
Die oben genannte Copyright -Mitteilung und diese Erlaubnisbekanntmachung müssen in alle Kopien oder wesentlichen Teile der Software enthalten sein.
Die Software wird "wie ist" ohne Garantie jeglicher Art, ausdrücklich oder stillschweigend bereitgestellt, einschließlich, aber nicht beschränkt auf die Gewährleistung der Handelsfähigkeit, die Eignung für einen bestimmten Zweck und die Nichtverletzung. In keinem Fall haftet die Autoren oder Urheberrechtsinhaber für Ansprüche, Schäden oder andere Haftungen, sei es in einer Vertragsklage, unerlaubter Handlung oder anderweitig, aus oder im Zusammenhang mit der Software oder anderen Geschäften in der SOFTWARE.