So funktioniert SMTP / ESMTP

Was ist SMTP/ ESMTP?

Das „simple mail transfer protocol“ ist ein standardisiertes Anwendungsprotokoll, welches die Kommunikation zum Versenden von E-Mails regelt. Mailserver nutzen und bieten Funktionen aus diesen Standards, was ermöglicht, dass auch voneinander verschiedene Systeme miteinander kommunizieren können.

Bei der Kommunikation gibt es einen Client, der die Verbindung aufbaut, und einen Server, der die Anfrage beantwortet. Der Client kann z.B. ein Mailprogramm wie Outlook sein, oder ein anderer Server, der eine Mail übertragen möchte. Manche Maschinen, z.B. Kopierer, können ebenfalls E-Mails verschicken – auch sie arbeiten dann als Mail-Client und verbinden sich dazu mit einem Mailserver.

SMTP ist ein Klartext-Protokoll, d.h. die Übertragung der Nutzdaten erfolgt unverschlüsselt im Klartext.
Der Client sendet die für den Mailversand nötigen Befehle an den Server; der Server reagiert jeweils mit einer (positiven oder negativen) Bestätigung.

ESMTP bietet einen erweiterten Befehlsumfang. ESMTP Server listen dem Client weitere Funktionen auf, mit denen dann Authentifizierung oder Verschlüsselung eingeleitet werden können.

Verwendete Ports für SMTP/ ESMTP

Port #25 / tcp Standardport
Port #587 / tcp Authentifizierter Versand, z.B. für Kunden eines Providers.
Port #465 / tcp Separater Port für verschlüsselte Verbindungen (veraltet, wird heute i.d.R. anders gelöst)

SMTP-Befehle

Im SMTP Standard sind einige Befehle definiert (siehe RFC dazu); minimal sind das die Folgenden:

Befehl Bedeutung
HELO <fqdn> Client begrüßt den Server, Start einer Standard SMTP Session
MAIL FROM: <absender-adr.> Absender der E-Mail
RCPT TO: <empfänger-adr.> Empfänger der E-Mail (kann auch mehrmals angegeben werden)
DATA Übertragung des Mail-Inhalts starten
QUIT Beenden der Verbindung
NOOP (keinen Befehl ausführen)
RSET „Reset“ – Absender-, Empfängerliste und Maildaten zurücksetzen
VRFY <empfänger-adr.> „Verify“ – Empfänger bestätigen

 

SMTP Statuscodes

Auf die SMTP Befehle reagiert der Server mit Rückmeldungen, welche einen Statuscode beinhalten:

1yz positive Antwort, Server wartet auf „continue“/“abort“
2yz Erfolg
3yz positive Antwort, Server wartet auf weitere Infos vom Client
4yz temporärer Fehler
5yz permanenter Fehler

Die zweite Ziffer beschreibt die Kategorie

x0z Syntax
x1z Information
x2z Verbindung
x5z Mail System / Statusmeldung

Die dritte Ziffer beschreibt die Meldung genauer.

erweiterte Meldungen

Evtl. folgt im Text der Meldung nochmals ein Statuscode, z.B. „2.1.5“. Die Bedeutung kann man in der RFC zu den erweiterten Status Codes nachlesen. „2.1.5“ bedeutet demnach z.B., dass die Zieladresse in Ordnung ist.

Beispiele: smtp Meldungen

Fehlermeldung aus einem Unzustellbarkeitsbericht:

550 5.1.1 <user@example.com>: Recipient address rejected: User unknown in local recipient table

550“ ist der SMTP Code vom empfangenden Server, er besagt dass das ein permanenter Fehler beim Mail System ist. Der Absender-mailserver würde daher keine weitere Zustellung versuchen.

Aus dem erweiterten Code „5.1.1“ und natürlich aus dem Klartext kann man herauslesen, dass es den Empfänger nicht gibt und die E-Mail deshalb abgelehnt worden ist.

Ähnliche Beispiele anderer Mailsysteme:

550 sorry, no mailbox here by that name (#5.1.1)
550 Mailbox quota exceeded

Hier sieht man, dass der Klartext der Meldungen abweichen kann. Das erschwert es Benutzern manchmal, herauslesen zu können, wo das Problem liegt.

Beispiel von unserem Mailsystem, das gerade eine Spam Mail ablehnt:

554 Your email is considered spam (20.90 spam-hits)

Im folgenden Beispiel wurde die E-Mail temporär abgelehnt (Fehlermeldung „4xy“), weil die Mailbox des Empfängers voll ist:

452 <user@example.com> Mailbox size limit exceeded

So kann man eine SMTP-Anbindung testen

„Telnet“

Man kann mit „Telnet“ eine E-Mail von Hand versenden. Telnet ist dabei lediglich das Programm, welches Ihre Eingaben entgegen nimmt und die Antworten des Servers anzeigt, nicht das „telnet“ Protokoll.
Im einfachsten Fall kann man mit

telnet mail.example.com 25

Eine Verbindung zum Port #25 / tcp des Mailservers herstellen. Sie können dann die Kommunikation wie im Beispiel auf dieser Seite abwickeln.
Beim Telnet auf Win200x und XP Systemen ist das „lokale echo“ standardmäßig deaktiviert – man sieht die eigenen Benutzereingaben nicht.

C:\>telnet mail.example.com 25     
Verbindungsaufbau zu mail.example.com...     
220 mail.example.com SMTP service ready     
helo ichbins     
250 mail.example.com - Nice to meet you!     
mail from: <absender@example.org>     
250 ok     
rcpt to: <empfaenger@example.com>     
250 ok     
data     
354 go ahead     
Hallo, das ist ein Test     
.     
250 ok message accepted     
quit     
221 mail.example.com - Goodbye!     
Verbindung zu Host verloren.

smtpexplorer

Mit dem Freeware Tool smtpexplorer geht’s deutlich einfacher :-)

Outlook Express (oder anderes Mailprogramm)

Zum Testen mit OE muss ein E-Mail-Konto eingerichtet werden.

In OE kann man über „Extras“ – „Optionen…“ – „Wartung“ eine E-Mail-Protokollierung aktivieren.
Die Logdatei „smtp.log“ ist dann zu finden in:

%USERPROFILE%\Lokale Einstellungen\Anwendungsdaten\Identities\{.....}\Microsoft\Outlook Express

bzw. in dem Ordner, in welchen man seine OE E-Mails verschoben hat (Extras-Optionen-Wartung-Speicherordner)

 

Beispiel: Versand einer E-Mail mit SMTP

Die Kommunikation findet zwischen einem SMTP-Client (Absender) und einem SMTP-Server (Empfänger) statt. Der Absender kann natürlich auch selbst ein Server sein, z.B. Exchange Server – für die Kommunikation agiert er beim Versenden jedoch als SMTP Client.

SMTP-Kommunikation Bedeutung
(Server wartet auf Verbindungsaufbau zu seinem Port #25 / tcp)
(Client baut Verbindung auf zum Port #25 / tcp des Servers)
220 mail.example.com SMTP service ready Server meldet sich
HELO client.example.org Client sendet ein SMTP-„Hello“ und seinen FQDN
250 mail.example.com – Hello, nice to meet you! Server akzeptiert diese Verbindung
MAIL FROM: <absender@example.org> Die E-Mail kommt von …
250 ok Server akzeptiert diesen Absender
RCPT TO: <empfaenger@example.com> Die E-Mail soll an … gesendet werden
250 ok Server akzeptiert diesen Empfänger
DATA Client möchte nun den Inhalt der Mail senden
354 Start mail input; end with <CRLF>.<CRLF> Server wartet nun auf Daten
From: „Susi Sonnenschein“ <sonnenschein@example.org>
To: <willy.wichtig@example.com>
Subject: TestmailDies ist eine Testmail :-)
.
Client sendet die eigentliche E-Mail und schließt das Senden mit einem „.“ ab.
250 Requested mail action okay, completed Server hat diese Mail angenommen.
QUIT Client verabschiedet sich
221 mail.example.com – Goodbye! Server verabschiedet sich
(Server beendet die Verbindung)

 

ESMTP

ESMTP („extended SMTP“) bietet zahlreiche Funktions-Erweiterungen an.
ESMTP ist ebenfalls ein Klartext-Protokoll, jedoch mit erweitertem Befehlssatz. Denkbar sind z.B. Authentifizierung des Client, ein optimierter Mailversand oder SSL-Verschlüsselung der Verbindung. Authentifizierung kann auch so eingerichtet werden, dass Benutzername/Kennwort nicht übertragen werden müssen (z.B. bei CRAM-MD5, sofern Client und Server das unterstützen). Nach dem Verbindungsaufbau informiert der Server den Client über die verfügbaren Funktionen.

SMTP-Verbindungen werden mit einem „HELO“ eingeleitet, ESMTP-Verbindungen hingegen mit einem „EHLO“. Unterstützt der Mailserver kein ESMTP, versteht er auch den „EHLO“ Befehl nicht und wird zunächst eine Fehlermeldung an den Client senden. Der Client kann dann mit „HELO“ eine Standard SMTP-Verbindung herstellen.

Beispiel: Versand einer E-Mail mit ESMTP

 

ESMTP-Kommunikation Bedeutung
220 mail.example.com SMTP service ready Server meldet sich
EHLO client.example.org Client sendet ein ESMTP-„Hello“ und seinen FQDN
250 mail.example.com – Hello, nice to meet you!
250-AUTH LOGIN CRAM-MD5 PLAIN
250-AUTH=LOGIN CRAM-MD5 PLAIN
250-PIPELINING
250 SIZE 31457280
Server versteht „EHLO“, kann also ESMTP
Server gibt Liste unterstützter Befehle/ Optionen aus
MAIL FROM: <absender@example.org> Die E-Mail kommt von …
250 ok
(und so weiter)

 

smtp auth – Authentifizierter Versand per ESMTP

Mailserver bieten nach der Verbindung per ESMTP ggf. mehrere Authentifizierungsmechanismen an, z.B. „PLAIN“, „LOGIN“ oder „CRAM-MD5“. Der Client kann dann den bestmöglichen Mechanismus auswählen, um eine E-Mail authentifiziert zu versenden.

Beispiel: Authentifizierter E-Mail-Versand

Beim AUTH LOGIN werden Benutzername und Kennwort quasi im Klartext übertragen (lediglich base64-kodiert).

 

SMTP-Kommunikation Bedeutung
220 mail.example.com SMTP service ready Server meldet: bin bereit zum Empfang von smtp Befehlen
EHLO client.example.org.de Client möchte ESMTP-Kommunikation herstellen
250-mail.example.com – Hello, nice to meet you!
250-AUTH LOGIN CRAM-MD5 PLAIN
250-AUTH=LOGIN CRAM-MD5 PLAIN
250-PIPELINING
250 SIZE 31457280
Server versteht ESMTP
und bietet die genannten Authentifizierungsarten anPipelining wird ebenfalls angeboten
und die max. E-Mail-größe ist 30 MB
AUTH LOGIN Client möchte sich gerne authentifizieren
334 VXNlcm5hbWU6 Server fragt (base64-kodiert): „Username:
TWVpbiBVc2VybmFtZSA6LSk= Client sendet base64-kodiert den Benutzernamen
334 UGFzc3dvcmQ6 Server fragt (base64-kodiert): „Password:
TWVpbktlbm53b3J0 Client sendet base64-kodiert das Kennwort
235 ok, go ahead Server akzeptiert diese Authentifizierung
MAIL FROM: <absender@example.org> Die E-Mail kommt von …
250 ok Server akzeptiert diesen Absender
(und so weiter)

 

Exchange Server nutzen eine rfc-konforme Möglichkeit, die Kommunikation hierbei zu optimieren. Statt den Server erst noch nach dem Benutzernamen fragen zu lassen, schickt Exchange den Benutzernamen gleich im AUTH Befehl mit. So kann auf das Warten der Serverantwort (die Frage nach „Username:“) verzichtet werden, was etwas Zeit spart.

SMTP-Kommunikation Bedeutung
AUTH LOGIN TWVpbiBVc2VybmFtZSA6LSk= Client möchte sich gerne als Benutzer xyz authentifizieren
334 UGFzc3dvcmQ6 Server fragt (base64-kodiert): „Password:
TWVpbktlbm53b3J0 Client sendet base64-kodiert das Kennwort
235 ok, go ahead Server akzeptiert diese Authentifizierung

Weitere Informationen