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-VersandBeim 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 |