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.
E-Mail-Kommunikation
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-KommandoBeschreibung
HELO/EHLO
(Hello/Extended Hello)
HELO bzw. EHLO startet die SMTP-Sitzung und identifiziert den Client am Server.
MAIL 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

  1. Direkt nach dem Verbindungsaufbau über TCP meldet sich der SMTP-Server.
  2. Der SMTP-Client meldet sich mit seinem Computernamen an.
  3. Der Server bestätigt den Erhalt und erwartet die Fortführung der Verbindung.
  4. Der Client meldet die Absender-Adresse für den MTA.
  5. Der Server bestätigt den Erhalt und erwartet die Fortführung der Verbindung.
  6. Der Client meldet die Empfänger-Adresse für den MTA.
  7. Der Server bestätigt den Erhalt und erwartet die Fortführung der Verbindung.
  8. Mit DATA leitet der Client das Senden der E-Mail ein.
  9. Der Server teilt dem Client mit, dass er die E-Mail mit einem Punkt (.) abgeschlossen haben will.
  10. 1. E-Mail-Zeile
  11. 2. E-Mail-Zeile
  12. 3. E-Mail-Zeile
  13. Der Client signalisiert mit zweimal Zeilenumbruch den eigentlichen Nachrichtentext der E-Mail in der 4. E-Mail-Zeile.
  14. 5. E-Mail-Zeile
  15. Die E-Mail wird mit dem Punkt (.) abgeschlossen.
  16. Der Server quittiert den erfolgreichen Empfang der E-Mail.
  17. Der Client beendet die Verbindung zum Server.
  18. 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-KommandoBeschreibung
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.