Versandt einer EMail
Der Artikel beschreibt den Aufbau einer EMail und Versand über SMTP. Es geht nicht um die JavaMail-API, sondern um die Basis der Nachrichtenversendung.
Zunächst sollten wir uns um den Aufbau der E-Mail kümmern. Sie besteht aus zwei Teilen, dem Envelope, der Informationen über die Weiterleitung enthält, und dem Content, also dem Inhalt. Der Content gliedert sich wiederum in Header (=Adresse) und Body (=Inhaltauf. Der Envelope enthält ein Feld From, in dem der Absender eingetragen ist. Der zweite Teil des Kopfes besteht aus einem To, mit dem der Empfänger angesprochen wird. SMTP arbeitet rein textbasiert und binäre Daten müssen in 7 -Bit-Form codiert werden. Ganz anders ist dies bei X.400. Hier sind alle Daten kodiert und im ASN.1-Format ist beschrieben, wie genau Envelope, Header und Body zu füllen sind. Durch die Kodierung lassen sich auch Daten verschicken, die nicht aus Text bestehen.
Verschicken einer E-Mail über Telnet
Bevor wir mit einer praktischen Bibliothek E-Mail versenden, gehen wir auf die unterste Protokollebene und schauen uns eine Telnet-Sitzung an. Anschließend erklären wir die einzelnen Befehle:
$ telnet mail 25 Trying 131.234.22.30... Connected to uni-paderborn.de. Escape character is '^]'. 220 uni-paderborn.de ZMailer Server 2.99.49p9 #1 ESMTP+IDENT\ ready at Wed, 6 May 1998 22:52:47 +0200 HELO max.uni-paderborn.de 250 uni-paderborn.de Hello max.uni-paderborn.de MAIL FROM: <ulliull@hni.uni-paderborn.de> 250 Ok (verified) Ok RCPT TO: <ulliull> 250 Ok (verified) Ok DATA 354 Start mail input; end with <CRLF>.<CRLF> Subject: Huh, endlich geschafft Lass knacken Alter . 250 Ok
Verbindung zum SMTP-Server
Telnet baut eine Verbindung zum SMTP-Server auf. In einem Java-Programm hieße dies, eine Socket-Verbindung zu einem SMTP-Server öffnen. (Dieser muss auf unserem Server installiert sein, falls es von einem Applet laufen soll). Dann einen OutputStream/InputStream zum SMTP-Server holen und anschließend die E-Mail (nach RFC 821/822) in den Stream schreiben.
Neben dem Namen des SMTP-Servers ist die Port-Nummer wichtig. 25 ist der Standard-Port, an dem die meisten SMTP-Servers arbeiten. Nach der Verbindung können wir nun Kommandos abschicken, die im RFC 821 beschrieben sind. Diese Kommandos sind der Schlüssel zur Kommunikation.
Das Ergebnis der Operation erfragen
Direkt nach dem erfolgreichen Anmelden haben wir eine Ausgabe ähnlich dieser:
220 uni-paderborn.de ZMailer Server 2.99.49p9\ #1 ESMTP+IDENT ready at Wed, 6 May 1998 22:52:47 +0200
Wir erhalten eine Nachricht und jede Antwort (Reply) vom SMTP-Server beginnt mit einer Nummer. Dies sind die SMTP Server Reply Codes (beschrieben unter Kapitel 4.2.2. NUMERIC ORDER LIST OF REPLY CODES des RFCs 821). Diese Nummern haben dieselbe Bedeutung wie die Reply-Codes beim FTP. So bedeutet 200 alles OK, und 421 heißt: geht nicht. Neben den Reply-Codes werden auch Texte versendet. Diese sind aber nur "human readable", also für uns Menschen gemacht.
Alle Reply-Codes lassen sich in drei Klassen einteilen: success (S), failure (F), and error (E). Diese Unterteilung haben wir auch schon bei FTP kennen gelernt.
Die Ameldung
Um weitere Operationen loszuschicken, müssen wir uns erst brav anmelden: So senden wir nach dem Anmelden ein HELO max.uni-paderborn.de. Halten wir uns nicht an die Abmachung, melden einige Server "Polite users say HELO first". Da die Mails über DNS geroutet werden, verlangt SMTP keine Authentifizierung. Zwar ist beim HELO der Name des sendenden Rechners anzugeben, dieser Name muss nicht korrekt sein und ein Passwort wird auch nicht verlangt. Also könnte grundsätzlich jeder eine beliebige Adresse (sowohl im Envelope als auch im Header) angeben (forging). Neuere Versionen von Sendmail können allerdings feststellen, woher die Verbindung wirklich kommt. Dabei wird das Sprungbrett TCP/IP benutzt.
Nun liefert der Server eine Antwort (die von einem Programm dann geholt werden müsste). Er liefert etwa bei unserem HELO
250 uni-paderborn.de Hello max.uni-paderborn.de
Hier ist es wichtig, dass der Reply Code mit 250 beginnt. Eine andere Begrüßung ist etwa "Pleased to meet you pc19f8f43.dip.t-dialin.net" bei T-Online.
Beschäftigen wir uns an dieser Stelle noch etwas mit den Kommandos. Unser erstes Kommando ist HELO und natürlich gibt es noch einige mehr. Alle Befehle bestehen aus vier Buchstaben (four-letter commands). Sie sind hier in Großbuchstaben geschrieben, müssen aber nicht. Wir machen dies nur zur Unterscheidung. Der SMTP-Server erkennt die Kommandos auch bei gemischter Groß/Kleinschreibung (also anstatt HELO, auch helo oder HeLo). Dies ist bei FTP oder dem POP3-Server, den wir noch kennen lernen werden, auch so.
Die Identifizierung
Bevor die E-Mail gesandt wird, informieren wir den Server über uns. Dies geschieht mit dem Kommando MAIL FROM. So zum Beispiel in folgendem Codestück:
MAIL FROM: <Ulli@a.b.com>
Hier sollte Ulli@a.b.com natürlich durch die eigene Adresse ersetzt werden (wenn wir auch der Sender sind). Der String sollte immer die Zeichen < und > enthalten. Alte Mail-Server erlauben auch keine eckigen Klammern zu setzen, mittlerweile sind diese jedoch Pflicht.
Nach dieser Identifizierung sollte der Server anerkennend mit 250 antworten, etwa
250 Ok (verified) Ok oder 250 ... Sender ok
Den Absender bestimmen
Nun weiß der Server, von wem die E-Mail kommt, und der Empfänger bzw. die Empfänger können angegeben werden. Für jeden Empfänger werden die Zeilen
RCPT TO: Empfänger
angelegt. Wir können jedem, der eine E-Mail Adresse besitzt, eine Nachricht schicken. Dann sollte die Adresse in recipient stehen. Die Antwort, die der Server dann liefert, ist hoffentlich wieder mit dem Reply-Code 250 (alles OK).
250 whomever@wherever.com... Recipient ok
Im oberen Beispiel war ich selbst der Empfänger - so belästigen wir durch unsere Spielerei keine Freunde.
Die Daten
Nachdem Absender und Empfänger angegeben sind, können jetzt die Daten spezifiziert werden. Dies funktioniert aber wirklich nur dann, wenn mindestens ein Empfänger vom SMTP-Server als korrekt erkannt wurde. Der Körper der Nachricht folgt hinter einer DATA-Anweisung. Sie verlangt keine weiteren Angaben. Direkt danach sollte DATA vom Server eine Botschaft der Form
354 Enter mail, end with "." on a line by itself
entlocken. Jetzt kann die Nachricht verschickt werden. Sie endet mit einem Punkt in einer einzelnen Zeile.
In den oberen Zeilen liegt eine kleine Schwierigkeit, denn der Server produziert so lange keine Meldungen, bis die Nachricht abgeschlossen ist. Wir müssen also drauf hoffen, dass alles gut läuft und dass nach dem Abschluss der Server sein OK gib. Dies bedeutet, dass die Mail gesendet wurde. Eine explizites "Jetzt losschicken" gibt es nicht. Nun können weitere MAIL FROM:-Anweisungen kommen.