Zum Hauptinhalt springen

4. SMTP-Spezifikationen (The SMTP Specifications)

Dieser Abschnitt enthält detaillierte Spezifikationen für SMTP-Befehle, Antworten, Sequenzen, Trace-Informationen und Implementierungsfragen.

4.1. SMTP-Befehle (SMTP Commands)

SMTP-Befehle sind Groß-/Kleinschreibung-insensitive ASCII-Wörter mit vier Zeichen (einige auf acht Zeichen erweitert), optional gefolgt von Parametern.

4.1.1. Befehlssemantik und -syntax (Command Semantics and Syntax)

Die Befehle EHLO und HELO eröffnen eine SMTP-Sitzung; EHLO fordert zusätzlich Dienst-Erweiterungen an, während HELO als Fallback für Server ohne Erweiterungsunterstützung dient. MAIL FROM startet eine Mail-Transaktion und gibt den Reverse-Path an. RCPT TO identifiziert jeweils einen Empfänger; mehrere RCPT-Befehle können für dieselbe Nachricht verwendet werden. DATA leitet den Nachrichtentext ein und endet mit der Sequenz <CRLF>.<CRLF>. RSET bricht die aktuelle Mail-Transaktion ab und setzt die Puffer zurück. VRFY prüft, ob eine Mailbox existiert, und EXPN erweitert eine Mailingliste; viele Server beschränken diese Befehle aus Sicherheitsgründen. HELP liefert Hilfetext, NOOP hält die Verbindung aktiv, und QUIT beendet die Sitzung.

4.1.2. Befehlsargument-Syntax (Command Argument Syntax)

Befehle folgen strengen Syntaxregeln, die in ABNF (RFC 5234) definiert sind. Mailbox-Format: local-part@domain (local-part max. 64 Zeichen, domain max. 255 Zeichen).

4.1.3. Adressliterale (Address Literals)

  • IPv4: [192.0.2.1]
  • IPv6: [IPv6:2001:db8::1]

4.1.4. Befehlsreihenfolge (Order of Commands)

Gültige Befehlssequenz: Verbindung → EHLO/HELO → MAIL → RCPT (ein oder mehr) → DATA → QUIT

4.1.5. Private-Use-Befehle (Private-Use Commands)

Befehle, die mit X beginnen, sind für private Verwendung und Experimente reserviert.

4.2. SMTP-Antworten (SMTP Replies)

4.2.1. Antwortschweregrade und Theorie (Reply Code Severities and Theory)

Antwortcodes sind dreistellige Zahlen:

  • 2yz: Positiver Abschluss
  • 3yz: Positive Zwischenantwort
  • 4yz: Vorübergehender negativer Abschluss (wiederholbar)
  • 5yz: Permanenter negativer Abschluss (nicht wiederholen)

4.2.2. Antwortcodes nach Funktionsgruppen (Reply Codes by Function Groups)

Wichtige Codes: 220 (Dienst bereit), 250 (Ok), 354 (Daten starten), 421 (Dienst nicht verfügbar), 450/550 (Mailbox nicht verfügbar), 500 (Syntaxfehler), 554 (Transaktion fehlgeschlagen).

4.2.3. Antwortcodes in numerischer Reihenfolge (Reply Codes in Numeric Order)

  • 211: Systemstatus.
  • 214: Hilfemeldung.
  • 220: Dienst bereit.
  • 221: Verbindung wird geschlossen.
  • 250: OK.
  • 251: Benutzer nicht lokal; Weiterleitung erfolgt.
  • 252: Benutzer kann nicht mit VRFY geprüft werden, wird aber akzeptiert.
  • 354: Beginn der Mail-Eingabe.
  • 421: Dienst nicht verfügbar.
  • 450: Mailbox nicht verfügbar.
  • 451: lokaler Fehler.
  • 452: unzureichender Speicher.
  • 455: Server kann Parameter nicht verarbeiten.
  • 500: Syntaxfehler.
  • 501: Syntaxfehler in Parametern.
  • 502: Befehl nicht implementiert.
  • 503: falsche Befehlssequenz.
  • 504: Befehlsparameter nicht implementiert.
  • 550: Mailbox nicht verfügbar.
  • 551: Benutzer nicht lokal.
  • 552: Speicherzuweisung überschritten.
  • 553: Mailboxname nicht erlaubt.
  • 554: Transaktion fehlgeschlagen.
  • 555: Parameter nicht erkannt.

4.2.4. Antwortcode 502 (Reply Code 502)

502 zeigt an, dass der Befehl nicht implementiert ist. Clients sollten nicht versuchen, nicht implementierte Befehle erneut auszuführen.

4.2.5. Antwortcodes nach DATA und dem anschließenden <CRLF>.<CRLF>

Nach Abschluss von DATA:

  • 250: Nachricht angenommen.
  • 450/550: Mailbox nicht verfügbar.
  • 451/551: Verarbeitungsfehler.
  • 452/552: unzureichender Speicher.
  • 554: Transaktion fehlgeschlagen.

4.3. Sequenzierung von Befehlen und Antworten (Sequencing of Commands and Replies)

SMTP ist Lock-Step: Client sendet Befehl, wartet auf Antwort, sendet dann nächsten Befehl. Ausnahme: PIPELINING-Erweiterung erlaubt Batch-Verarbeitung.

4.3.2. Befehls-Antwort-Sequenzen (Command-Reply Sequences)

Minimale Implementierung:

S: 220
C: EHLO
S: 250
C: MAIL FROM
S: 250
C: RCPT TO
S: 250
C: DATA
S: 354
C: (message data)
C: .
S: 250
C: QUIT
S: 221

4.4. Trace-Informationen (Trace Information)

Jeder SMTP-Server fügt bei Annahme einer Nachricht ein Received-Header-Feld hinzu:

Received: from sender.example.com (host.example.com [192.0.2.1])
by receiver.example.com (Postfix) with ESMTP id 12345
for `<[email protected]>`; Mon, 24 Dec 2024 10:00:00 +0000 (UTC)

4.5. Zusätzliche Implementierungsfragen (Additional Implementation Issues)

4.5.1. Minimale Implementierung (Minimum Implementation)

Ein voll funktionsfähiges SMTP MUSS (MUST) unterstützen: EHLO, MAIL, RCPT, DATA, RSET, NOOP, QUIT-Befehle, alle Standard-Antwortcodes, Warteschlangen- und Wiederholungslogik, ordnungsgemäße Fehlerbehandlung.

4.5.2. Transparenz (Transparency)

Server MÜSSEN (MUST) Dot-Stuffing handhaben: Zeilen, die mit . beginnen, müssen während DATA-Übertragung als .. escaped werden.

4.5.3. Größen und Timeouts (Sizes and Timeouts)

Mindestanforderungen: Local-part 64 Oktette, Domain 255 Oktette, Path 256 Oktette, Befehlszeile 512 Oktette, Antwortzeile 512 Oktette, Textzeile 1000 Oktette, Empfängerpuffer 100 Empfänger.

Timeouts: Initiale 220-Nachricht 5 Minuten, MAIL-Befehl 5 Minuten, RCPT-Befehl 5 Minuten, DATA-Initiation 2 Minuten, DATA-Block 3 Minuten, DATA-Beendigung 10 Minuten.

4.5.4. Wiederholungsstrategien (Retry Strategies)

Bei vorübergehenden Fehlern (4yz-Codes): Mindestens alle 30 Minuten wiederholen, mindestens 4-5 Tage lang versuchen, Absender in Intervallen warnen, nach endgültigem Fehler Bounce generieren.

4.5.5. Nachrichten mit Null-Rückwärtspfad (Messages with a Null Reverse-Path)

Bounce-Nachrichten verwenden MAIL FROM:<> (Null-Rückwärtspfad), um Mail-Schleifen zu vermeiden. Server MÜSSEN (MUST) Null-Rückwärtspfad akzeptieren, DÜRFEN ABER NICHT (MUST NOT) Bounces dafür generieren.