Ich versuche zu verstehen, wie genau eine E-Mail von Postfix verarbeitet wird - und einige der feineren Details von SMTP-Mail-Transaktionen. Mein kurzfristiges Ziel ist das Debuggen eines proprietären (binären, geschlossenen Quell-) SMTP-Clients, aber ich dachte zuerst, ich würde untersuchen, was bei einer erfolgreichen SMTP-Transaktion passiert.
Ich habe vor, ausgehendes SMTP (Port 25) an unserer LAN-Firewall zu blockieren. Daher habe ich Postfix als internen Mailserver konfiguriert, um E-Mails von (primitiver) lokaler Client-Software zu akzeptieren, die E-Mails nur über nicht authentifiziertes SMTP (über Port 25) senden kann.
Ich habe das Debuggen des Postfix- smtpd
Prozesses aktiviert , indem ich das -v
ausführliche Flag angehängt habe, master.cf
wie unter Fehlerbehebung mit Postfix-Protokollen beschrieben . Ich habe dann eine E-Mail von meiner eigenen Workstation mit Cygwin Mutt mit sSMTP gesendet (eine minimale Implementierung von sendmail
).
Die Postfix-Protokolle zeigen, dass RCPT TO:
Postfix smtpd
der Transaktion nach erfolgreicher Verarbeitung der Leitung und akzeptabler Empfängeradresse eine Warteschlangen-ID zugewiesen und dem SMTP-Client (sSMTP) mit a geantwortet hat 250 OK
.
Anstatt jedoch einen DATA
Befehl auszugeben , gab der SMTP-Client einen aus RSET
, um die aktuelle Mail-Transaktion zurückzusetzen / abzubrechen, und Postfix antwortete mit einem 250 OK
.
Ich habe einige Nachforschungen angestellt, was dieser Befehl bewirkt, und es überrascht nicht, dass das Simple Mail Transfer Protocol, RFC 2821 , die umfassendsten Informationen lieferte:
Dieser Befehl gibt an, dass die aktuelle Mail-Transaktion abgebrochen wird. Alle gespeicherten Absender-, Empfänger- und E-Mail-Daten MÜSSEN verworfen und alle Puffer und Statustabellen gelöscht werden. Der Empfänger MUSS eine Antwort "250 OK" auf einen RSET-Befehl ohne Argumente senden. Ein Rücksetzbefehl kann vom Client jederzeit ausgegeben werden. Es entspricht effektiv einem NOOP (dh wenn es keine Wirkung hat), wenn es unmittelbar nach EHLO ausgegeben wird, bevor EHLO in der Sitzung ausgegeben wird, nachdem ein Datenende-Indikator gesendet und bestätigt wurde oder unmittelbar vor einem QUIT. Ein SMTP-Server darf die Verbindung NICHT als Ergebnis des Empfangs eines RSET schließen. Diese Aktion ist für QUIT reserviert (siehe Abschnitt 4.1.1.10).
Da EHLO eine zusätzliche Verarbeitung und Antwort durch den Server impliziert, ist RSET normalerweise effizienter als die erneute Ausgabe dieses Befehls, obwohl die formale Semantik dieselbe ist.
Entgegen der Absicht dieser Spezifikation gibt es Umstände, unter denen ein SMTP-Server möglicherweise einen Hinweis erhält, dass die zugrunde liegende TCP-Verbindung geschlossen oder zurückgesetzt wurde. Um die Robustheit des Mailsystems zu gewährleisten, MÜSSEN SMTP-Server auf diesen Zustand vorbereitet sein und ihn so behandeln, als ob vor dem Verschwinden der Verbindung ein QUIT empfangen worden wäre.
All dies geschah innerhalb einer Sekunde, sodass es keine Probleme mit Timeouts geben sollte.
In der nächsten Sekunde hat der Client einen weiteren gesendet, RSET
aber der Client hat dann ganze 10 Sekunden gewartet, bevor er mit neu gestartet MAIL FROM:
hat. RCPT TO:
Diesmal folgt er jedoch und gibt den DATA
Befehl aus und die Transaktion wird abgeschlossen (alle innerhalb derselben Sekunde gemäß den Protokollen).
Im Wesentlichen frage ich mich, warum ein SMTP-Client seine eigene Transaktion unterbricht, indem er RSET
Befehle anstelle eines DATA
Befehls ausgibt.
Anmerkungen:
Ich kann die Frage so bearbeiten, dass sie einen Auszug aus der E-Mail-Protokolldatei enthält, aber beim
-v
Debuggen sind sie sehr ausführlich und ich möchte die Leute nicht mit einer Menge irrelevanter Daten überwältigen.Ich habe den sSMTP-Quellcode durchsucht, aber keine Erwähnung gefunden
RSET
.