SMTP - Simple Mail Transfer Protocol
SMTP ist ein Kommunikationsprotokoll für die Übertragung von E-Mails. Die Kommunikation erfolgt zwischen einem E-Mail-Client und einem SMTP-Server (Postausgangsserver) oder zwischen zwei SMTP-Server.
Für den Austausch der E-Mails sind die Mail Transfer Agents (MTAs) zuständig. Untereinander verständigen sich die MTAs mit Kommandos. Dabei sendet der SMTP-Client dem SMTP-Server ein Kommando, und dieser antwortet mit einem Status-Code und einer Klartext-Meldung.
Neben SMTP gibt mit POP und IMAP noch zwei weitere Protokolle für den E-Mail-Austausch. Diese beiden Protokoll dienen jedoch nur dazu, um E-Mail abzuholen oder online zu verwalten. SMTP dagegen ist ein Kommunikationsprotokoll, das E-Mails entgegennehmen und weiterleiten kann.
E-Mail-Routing über SMTP und DNS
Nachdem der SMTP-Server eine E-Mail von einem E-Mail-Client (SMTP-Client) entgegengenommen hat, ist er für das Weiterleiten an den Ziel-SMTP-Server verantwortlich. Das DNS spielt wie bei den Protokollen HTTP und FTP eine zentrale Rolle. Im DNS sind spezielle Einträge für die elektronische Post vorhanden. Das sind die Mail Exchange Records (MX-Records). Über diese Einträge identifiziert der SMTP-Server den Ziel-SMTP-Server der Domain, die in der E-Mail-Adresse des Empfängers angegeben ist.
Der Ablauf des E-Mail-Routings sieht in etwa so aus: Der SMTP-Server fragt einen DNS-Server ab und erhält eine Aufstellung von Mail-Servern, die E-Mails für den Ziel-SMTP-Server entgegennehmen. Jeder dieser Mail-Server (Mail Exchanger) ist mit einer Priorität versehen. Der SMTP-Server versucht die Mail-Server in der vorgegebenen Reihenfolge zu kontaktieren, um die E-Mail zu übermitteln.
Theoretisch ist es möglich, das eine E-Mail über mehrere dieser Mail Exchanger läuft. Die MX-Records sollen das Entstehen dieser Mail-Schleifen verhindern. Trotzdem kann es zu Mail-Schleifen kommen, wenn die MX-Records unvollständig sind oder die Domain zu einem anderen Hoster oder Provider umgezogen ist.
Nachteile von SMTP
SMTP hat mehrere große Nachteile. Zum einen wird für versendete E-Mails keine Versandbestätigung zurückgeliefert. Geht eine E-Mail verloren, werden weder Sender noch Empfänger darüber informiert.
Kann eine E-Mail nicht zugestellt werden, sieht die SMTP-Spezifikation die Benachrichtigung des Senders vor. Es gibt zwar eine SMTP-Erweiterung für standardisierte Fehlermeldungen, allerdings unterstützen nicht alle SMTP-Server diese Erweiterung. Die meisten unzustellbaren E-Mails enthalten nur eine mehr oder weniger verständliche Fehlermeldung in englischer Sprache und den Header der gesendeten E-Mail.
Ein weiteres Problem von SMTP ist die nicht vorhandene Authentisierung des Benutzers beim Verbindungsaufbau zwischen SMTP-Client und SMTP-Server. Das führt dazu, dass eine beliebige Absenderadresse beim Versand einer E-Mail angegeben werden kann. In der Praxis sieht das dann so aus, dass über offene SMTP-Server massenhaft Werbe-E-Mails, der sogenannte Spam, versendet wird. Aufgrund der gefälschten Absender-Adressen kann der eigentliche Urheber nur mit viel Mühe ermittelt werden.
Aufbau einer E-Mail
Eine E-Mail besteht aus drei Teilen. Der Envelope beinhaltet Sender-Adresse und Empfänger-Adresse, die der MTA benötigt. Es folgt der Header mit Informationen über den E-Mail-Client und die Message-ID. Diese besteht aus einer Zahlen-/Buchstaben-Kombination, gefolgt von der Host-Adresse (Domain) des Senders. Der Body enthält den Nachrichten-Text der E-Mail.
Beispiel einer E-Mail
Die hier dargestellte E-Mail wurde von sender@beispiel.org an empfaenger@beispiel.org versendet.
Return-path: <sender@beispiel.org> Envelope-to: <empfaenger@beispiel.org> Delivery-date: Mon, 08 Mar 2004 21:30:15 +0100 Received: from [212.227.126.205] (helo=mail.beispiel.org) by mail.beispiel.org with esmtp (Exim 3.35 #1) id 1B0ROB-0002PO-00 for empfaenger@beispiel.org; Mon, 08 Mar 2004 21:30:15 +0100 Received: from [80.138.34.215] (helo=INTERN) by mail.beispiel.org with asmtp (Exim 3.35 #1) id 1B0ROB-0005zH-00 for empfaenger@beispiel.org; Mon, 08 Mar 2004 21:30:15 +0100 Message-ID: <000501c4054c$2b1f4720$0ca8a8c0@INTERN> From: "Name" <sender@beispiel.org> To: <empfaenger@beispiel.org> Subject: Text in der Betreffzeile Date: Mon, 8 Mar 2004 21:30:06 +0100 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-15" Content-Transfer-Encoding: 8bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2800.1158 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165 X-Provags-ID: beispiel.org <abuse@beispiel.org> auth:0a897c3f2fd8d0ba166f9ea6c6001711 Hallo, das ist eine kurze Nachricht. Mit freundlichen Grüßen
Protokoll einer abgebrochenen E-Mail-Übertragung
In diesem Kommunikationsprotokoll wird die Verbindung abgebrochen, weil der Benutzername beim Empfangsserver nicht existiert.
Wed 2008-01-09 11:15:07: Parsing message <xxxxxxxxxxxxxxxxxxxxxxxx\pd50013101218.msg> Wed 2008-01-09 11:15:07: * From: sender@beispiel.de Wed 2008-01-09 11:15:07: * To: empfaenger@beispiel.de Wed 2008-01-09 11:15:07: * Subject: Nachricht Wed 2008-01-09 11:15:07: * Message-ID: <E1JCXxQ-0001@mail.beispiel.net> Wed 2008-01-09 11:15:07: * Route slip host: 10.0.0.1 Wed 2008-01-09 11:15:07: * Route slip port: 25 Wed 2008-01-09 11:15:07: Attempting SMTP connection to [10.0.0.1] Wed 2008-01-09 11:15:07: Attempting SMTP connection to [10.0.0.1:25] Wed 2008-01-09 11:15:07: Waiting for socket connection... Wed 2008-01-09 11:15:07: * Connection established (10.0.0.1:3019 -> 10.0.0.2:25) Wed 2008-01-09 11:15:07: Waiting for protocol to start... Wed 2008-01-09 11:15:07: <-- 220 Beispiel SMTP Service. Ready for action at Wed, 9 Jan 2008 11:15:08 +0100 Wed 2008-01-09 11:15:07: --> EHLO mail.beispiel.de Wed 2008-01-09 11:15:07: <-- 250-mail.beispiel.de Hello mail.beispiel.de ([10.0.0.1]), pleased to meet you Wed 2008-01-09 11:15:07: <-- 250-SIZE 32768000 Wed 2008-01-09 11:15:07: <-- 250-8BITMIME Wed 2008-01-09 11:15:07: <-- 250 PIPELINING Wed 2008-01-09 11:15:07: --> MAIL From:<sender@beispiel.de> SIZE=12001 Wed 2008-01-09 11:15:07: <-- 250 sender@beispiel.de... Sender OK Wed 2008-01-09 11:15:07: --> RCPT To:<empfaenger@beispiel.de> Wed 2008-01-09 11:15:07: <-- 550 empfaenger@beispiel.de... No such user Wed 2008-01-09 11:15:07: --> QUIT
SMTP-Befehle
Die Kommunikation zwischen SMTP-Client und SMTP-Server basiert auf ASCII-Kommandos. Laut SMTP-Spezifikation muss eine SMTP-Implementierung mindestens die folgenden acht Kommandos unterstützen.
SMTP-Kommando | Beschreibung |
---|---|
HELO/EHLO (Hello/Extended Hello) |
HELO bzw. EHLO startet die SMTP-Sitzung und identifiziert den Client am Server. |
MAIL leitet die Mailübertragung ein und liefert gleich die Absender-Adresse mit. | |
RCPT (Recipient) | RCPT gibt die Adresse eines oder mehrere Empfänger an. Dieses Kommando kann mehrmals ausgeführt werden. |
DATA | Mit DATA wird die Übermittlung der E-Mail-Nachricht eingeleitet. Das Ende der E-Mail-Nachricht wird mit "CRLF.CRLF" gekennzeichnet. |
RSET (Reset) | Mit RSET wird die bereits eingeleitete Mailübertragung abgebrochen. Die Verbindung zwischen Client und Server bleibt bestehen. |
VRTY (Verify) | Mit VRFY kann die Empfänger-Adresse überprüft werden. |
EXPN (Expand) | Die meisten MTAs behandeln EXPN wie VRFY. |
NOOP | NOOP bewirkt eine Antwort vom Server. Damit wird die Verbindungstrennung durch einen Timeout verhindert. |
QUIT | QUIT beendet die Verbindung zum SMTP-Server. Der Server liefert eine letzte Antwort zurück. |
SMTP-Status-Code
Auf jedes Kommando vom SMTP-Client an den SMTP-Server schickt der Server einen 3-stelligen Status-Code mit Klartext-Meldung zurück.
Status-Code | Beschreibung Englisch | Beschreibung Deutsch |
---|---|---|
211 | System status, or system help reply. | System-Status oder System-Hilfe. |
214 | Help message. | Hilfe - Informationen zum Ausführen eines Kommandos. |
220 | Domain service ready. Ready to start TLS. | Server bereit. |
221 | Domain service closing transmission channel. | Server beendet Verbindung. |
250 | OK, queuing for node node started. Requested mail action okay, completed. | Kommando ausgeführt. |
251 | OK, no messages waiting for node node. User not local, will forward to forwardpath. | Keine lokale Mailbox; Weiterleitung an "forward-path". |
252 | OK, pending messages for node node started. Cannot VRFY user (e.g., info is not local), but will take message for this user and attempt delivery. | Überprüfung der Empfängeradresse nicht möglich; Die Nachricht wird dennoch versendet. |
253 | OK, messages pending messages for node node started. | |
354 | Start mail input; end with <CRLF>.<CRLF>. | Starte Empfang der Mail; Beenden mit "CRLF". "CRLF". |
355 | Octet-offset is the transaction offset. | |
421 | Domain service not available, closing transmission channel. | Service nicht verfügbar; Verbindung wird beendet. |
432 | A password transition is needed. | |
450 | Requested mail action not taken: mailbox unavailable. ATRN request refused. | Aktion nicht ausgeführt - Mailbox nicht verfügbar. |
451 | Requested action aborted: local error in processing. Unable to process ATRN request now | Aktion abgebrochen - Fehler beim Ausführen. |
452 | Requested action not taken: insufficient system storage. | Aktion abgebrochen - Nicht genügend System-Speicher. |
453 | You have no mail. | |
454 | TLS not available due to temporary reason. Encryption required for requested authentication mechanism. | |
458 | Unable to queue messages for node node. | |
459 | Node node not allowed: reason. | |
500 | Command not recognized: command. Syntax error. | Syntax-Fehler - Kommando unbekannt. |
501 | Syntax error, no parameters allowed. | Syntax-Fehler - Parameter oder Argument falsch. |
502 | Command not implemented. | Kommando unbekannt / nicht implementiert. |
503 | Bad sequence of commands. | Falsche Reihenfolge der Kommandos. |
504 | Command parameter not implemented. | Parameter unbekannt / nicht implementiert. |
521 | Machine does not accept mail. | |
530 | Must issue a STARTTLS command first. Encryption required for requested authentication mechanism. | |
534 | Authentication mechanism is too weak. | |
538 | Encryption required for requested authentication mechanism. | |
550 | Requested action not taken: mailbox unavailable. | Syntax-Fehler - Kommando unbekannt. |
551 | User not local; please try forwardpath. | Mailbox nicht lokal; "forward-path" versuchen. |
552 | Requested mail action aborted: exceeded storage allocation. | Aktion abgebrochen - Fehler bei der Speicherzuweisung. |
553 | Requested action not taken: mailbox name not allowed. | Aktion nicht ausgeführt - Mailbox-Name nicht erlaubt (Syntax inkorrekt). |
554 | Transaction failed. | Transaktion fehlgeschlagen (beim Verbindungsaufbau: Kein SMTP-Service verfügbar). |
Ablauf beim Versand einer E-Mail
1: > 220 mail.example.com SMTP Foo Mailserver 2: < HELO mail.example.org 3: > 250 Ok 4: < MAIL FROM: hans.muster@example.org 5: > 250 Ok 6: < RCPT TO: foo@example.com 7: > 250 Ok 8: < DATA 9: > 354 End data with . 10: < From: hans.muster@example.org 11: < To: foo@example.com 12: < Subject: Testmail 13: < 14: < Testmail 15: < . 16: > 250 Ok 17: < QUIT 18: > 221 Bye
Analyse des E-Mail-Versands
- Direkt nach dem Verbindungsaufbau über TCP meldet sich der SMTP-Server.
- Der SMTP-Client meldet sich mit seinem Computernamen an.
- Der Server bestätigt den Erhalt und erwartet die Fortführung der Verbindung.
- Der Client meldet die Absender-Adresse für den MTA.
- Der Server bestätigt den Erhalt und erwartet die Fortführung der Verbindung.
- Der Client meldet die Empfänger-Adresse für den MTA.
- Der Server bestätigt den Erhalt und erwartet die Fortführung der Verbindung.
- Mit DATA leitet der Client das Senden der E-Mail ein.
- Der Server teilt dem Client mit, dass er die E-Mail mit einem Punkt (.) abgeschlossen haben will.
- 1. E-Mail-Zeile
- 2. E-Mail-Zeile
- 3. E-Mail-Zeile
- Der Client signalisiert mit zweimal Zeilenumbruch den eigentlichen Nachrichtentext der E-Mail in der 4. E-Mail-Zeile.
- 5. E-Mail-Zeile
- Die E-Mail wird mit dem Punkt (.) abgeschlossen.
- Der Server quittiert den erfolgreichen Empfang der E-Mail.
- Der Client beendet die Verbindung zum Server.
- Der Server sagt "Auf Wiedersehen".
ESMTP - Extended SMTP
ESMTP ist die Erweiterung von SMTP. Nutzt ein E-Mail-Client die Erweiterungen von ESMTP, meldet er sich beim SMTP-Server mit dem Kommando EHLO an. Antwortet der Server mit einer Fehlermeldung kennt er ESMTP nicht und der Client muss sich mit HELO anmelden. Beherrscht der SMTP-Server die ESMTP-Erweiterungen meldet er mehrere Antwortzeilen mit dem Status-Code 250. Der Status-Code und die Meldung sind durch einen Bindestrich voneinander getrennt. In jeder Zeile steht eine spezifizierte Erweiterung, die der SMTP-Server unterstützt.
ESMTP-Befehle
Im folgenden sind einige ESMTP-Befehle beschrieben, die sehr häufig benutzt werden. Die Tabelle ist also nicht vollständig.
ESMTP-Kommando | Beschreibung |
---|---|
8BITMIME | Mit 8BITMIME gibt der Server an, dass er die Verwendung des 8-Bit-ASCII-Zeichensatzes im E-Mail-Nachrichtentext erlaubt. |
SIZE | Mit SIZE gibt der SMTP-Server die maximale E-Mail-Größe in Byte an, die er akzeptiert. |
EHLO | Mit EHLO meldet sich der ESMTP-Client an den SMTP-Server an und teilt ihm auf diese Weise mit, dass er die ESMTP-Erweiterungen beherrscht. |
STARTTLS | Mit STARTTLS teilt der Server dem Client mit, dass er die Verschlüsselung nach TLS beherrscht. Mit dem Kommando STARTTLS leitet der Client dann die Verschlüsselung ein. |