Autor: warlord
April 17, 2006, 23:53:48
Das Envelope
Am Betrieb des Internet Dienstes E-Mail sind drei verschiedene "Arten" von Software beteiligt. Die Fachleute sprechen von drei verschiedenen Agenten, oder eben auf Englisch von Agents: da gibt es den Mail User Agent (MUA), den Mail Transfer Agent (MTA) und den Mail Delivery Agent (MDA).
Allerdings ist diese Dreiteilung der Funktionalität etwas theoretisch. Real existierende Software beinhaltet meist die Funktionalität von zwei Agents. So muss unsere E-Mail Software auf unserem Mac sowohl die Aufgaben eines MUA, wie auch die eines MTA beherrschen. Und die bei den Providern eingesetzte Mail Server Software kombiniert meist die Funktionalität eines MTA und MDA in einer einzigen Software. Etwas vereinfacht wird daher häufig (auch hier nachfolgend) bei clientseitiger Software von einem Mail User Agent (MUA) und bei serverseitiger Software von einem Mail Transfer Agent (MTA) gesprochen.
Der Transport eines E-Mails vom erstellenden MUA über (allenfalls mehrere) MTA bis ins Postfach des Empfängers erfolgt mit dem SMTP Protokoll (Simply Mail Transfer Protocol). (Einzig den letzten Teil seiner Reise, nämlich vom Postfach in den MUA des Empfängers, absolviert ein Mail nicht mit SMTP, sondern mit POP oder IMAP. Diese beiden Protokolle sind jedoch nicht Gegenstand dieses Artikels.) Bei SMTP handelt es sich um ein sogenanntes "store-and-forward" Protokoll. Das heisst, das Mail kann bis zu seiner Zustellung ins Bestimmungs-Postfach eine ganze Kette von Servern durchreisen. Jeder dieser Server speichert das eingegangene Mail in einer Art Warteschlange, in welcher es die Versuche des Servers abwartet, das Mail an den nächsten Server weiter zu reichen. Gelingt dies nicht sofort, weil der nächste Server nicht erreichbar oder überlastet ist, verbleibt das Mail in dieser Warteschlange, bis der nächste Server wieder erreichbar ist und das Mail an ihn weiter gereicht werden kann. (Wobei natürlich kein Mail ewig in der Warteschlange verbleibt. Nach einer gewissen Zeit gibt ein Server seine Versuche auf, das Mail an den nächsten Server weiter zu reichen. Diese Zeitspanne ist unterschiedlich und hängt von der Konfiguration des Servers ab. Sie beträgt aber meistens mehrere Tage.)
Ein Server (sowie auch unser eigenes E-Mail Programm) "verpackt" ein Mail für den Transfer zum nächsten Server in ein Envelope, vergleichbar mit einem Umschlag bei einem papierenen Brief. Wie auch beim papierenen Brief trägt bei der elektronischen Post dieses Envelope die für die Beförderung und Zustellung notwendigen und massgeblichen Absender- und Bestimmungsangaben. Entsprechende Angaben im Brief bzw. im E-Mail selbst haben auf die Zustellung keinen Einfluss. So wird insbesondere das To Feld in einem Mail Header von einem MTA nicht beachtet.
Eine detaillierte Beschreibung von SMTP würde den Rahmen dieses Artikels sprengen. Wir schauen uns nun aber in stark vereinfachter Form an, wie unser E-Mail Programm das von uns erstellte Mail an den SMTP-Server unseres Providers weiterleitet, nachdem wir auf den "Senden" Knopf gedrückt haben. Praktisch das selbe wird dann auch der SMTP-Server des Providers tun, um das Mail an die nächste Station weiter zu reichen. Der Server muss sich einfach im Gegensatz zu unserem E-Mail Programm, das sich immer nur an "seinen" immer gleichen Server zu wenden braucht, zusätzlich noch "Gedanken" darüber machen, an welchen Server es das Mail weiterreichen muss. Dieser Prozess liegt jedoch definitiv jenseits des Rahmens dieses Artikels.
SMTP ist ein text-orientiertes, kommando-basiertes Protokoll. Der Client sendet ein Kommando, der Server verarbeitet es und sendet dann seine Antwort. Die Antwort des Servers besteht aus einem maschinenlesbaren Code aus 3 Ziffern und einem zur menschlichen Lektüre bestimmten ergänzenden Kommentar:
250 Requested mail action okay, completed
Die erste Ziffer des Antwortcodes gibt dabei letztlich über Erfolg oder Misserfolg Auskunft: 1 steht für eine vorläufige positive Antwort, 2 für eine definitiv positive Antwort (Aktion ausgeführt), 3 für einen positiven Zwischenbericht, 4 für einen negativen Zwischenbericht (Server probiert weiter) und 5 für eine definitive negative Antwort (Server hat aufgegeben).
Nach dem Drücken des "Senden" Knopfes kontaktiert unser E-Mail Programm den eingestellten SMTP-Server unseres Providers (in der Regel) auf TCP Port 25. Ist der Server zur Erbringung seiner Dienste bereit, antwortet er mit einer Begrüssung, in welcher er sich selbst vorstellt:
220 smtp.beispiel.de Service ready
Unser E-Mail Programm sendet nun seinerseits eine Begrüssung, in welcher es sich vorstellt:
helo 1-1-168-192.beispiel.de
Der Server quittiert:
250 smtp.beispiel.de
Unser E-Mail Programm muss nun mit dem Befehl mail den ersten Teil des Envelopes übertragen, nämlich die Absenderangaben:
mail from:<john.doe@beispiel.de>
Diese Angabe entnimmt es in der Regel dem From Feld im Header bzw. den Einstellungen, die wir für den betreffenden Mail Account gemacht haben. An die hier angegebene Adresse werden Probleme bei der Zustellung zurück gemeldet. (Ein Programm zum Versenden von Spam verhält sich natürlich etwas anders. Es wird hier in der Regel nicht die Adresse des tatsächlichen Absenders, sondern eine fremde oder nicht existierende Adresse eintragen.)
Ist der Server bereit, Mails von diesem Benutzer entgegen zu nehmen, antwortet er:
250 ok
Nun muss unser E-Mail Programm mit dem Befehl rcpt den zweiten Teil des Envelopes, nämlich die Bestimmungsangaben übermitteln:
rcpt to:<steve@apple.com>
Der Server bestätigt:
250 ok
Unser E-Mail Programm wiederholt den Befehl nun für jeden Empfänger, an den das Mail geschickt werden soll. Die Empfängerangaben übernimmt unser E-Mail Programm logischerweise aus den von uns ausgefüllten Headerfeldern To, Cc und Bcc. (Auch hier verhält sich ein Programm zum Versenden von Spam oder auch ein sich selbst reproduzierender Virus etwas anders. Diese entnehmen die Adressaten ihren Datenbanken und angefertigten Listen und die Angaben im Mail Header stimmen häufig nicht damit überein.) Gemäss Standard muss ein SMTP-Server in seinem forward-path mindestens 100 Mailboxen speichern können. Somit müsste der rcpt Befehl bei Bedarf mindestens 100 mal wiederholt werden können. Allerdings verletzen viele Provider diesen Standard und beschränken den forward-path und damit die gleichzeitig mögliche Anzahl Empfänger auf weniger als 100. Ein MUA müsste in solchen Fällen den Versand auf mehrere SMTP Sessions aufteilen, was die meisten normalen (nicht auf Serienversand spezialisierten) MUA überfordert.
Sind alle Empfänger übermittelt, teilt unser E-Mail Programm dem Server mit dem Befehl data mit, dass es nun das eigentliche Mail (inkl. Header) senden möchte:
data
Der Server antwortet darauf:
354 Start mail input; end with >CRLF>.<CRLF>
Nun kann unser MUA das eigentliche Mail übermitteln. Das Ende der Übermittlung zeigt es mit einem einzigen Punkt auf einer Zeile an. Der Server quittiert sodann:
250 ok
Das Ende der Session zeigt unser E-Mail Programm mit dem Befehl quit an:
quit
Der Server quittiert und bricht die Verbindung ab:
221 smtp.beispiel.de Service closing transmission channel
Was der Server nun tut, unterscheidet sich (hoffentlich
) von dem, was die Post bei papierenen Briefen tut. Der Server "öffnet" nämlich das Envelope und "entnimmt" ihm das darin enthaltene Mail. Mehr noch, er fügt dem Mail sogar etwas hinzu. Wir haben im Abschnitt über den Header bereits kurz die Received Felder kennen gelernt. Der Server fügt nun im Header des E-Mails ein solches Received Feld ein, in welchem er seine Behandlung des Mails protokolliert. Das schaut zum Beispiel so aus:
Received: from smtp.beispiel.de by smtp.apple.com with SMTP id HAA197482 for <steve@apple.com>; Mon, 4 Oct 1999 08:33:45 -0700
Jeder MTA, welcher das E-Mail entgegen nimmt, muss im Header ein solches Feld einfügen. Und da diese Felder für die Diagnose von E-Mail Problemen meist der wichtigste Ansatzpunkt sind, werden wir uns gleich noch etwas intensiver damit beschäftigen.
Befindet sich das Postfach des Empfänger nicht auf dem Server, so "verpackt" er das mit einem Received Feld ergänzte Mail wieder in ein Envelope und reicht es an den nächsten Server weiter. Befindet sich das Postfach auf dem Server (bzw. verlässt das Mail aus einem anderen Grund die SMTP-Welt), so fügt jener dem Header des Mails ein weiteres Feld bei:
Return-Path: <john.doe@beispiel.de>
Darin gibt der Server die auf dem Envelope angegebene Absenderadresse (also die im SMTP mail Befehl angegebene Adresse; mail from:<john.doe@beispiel.de) an. Anschliessend legt der Server das Mail ohne das Envelope ins Postfach des Empfängers.
Daraus ergibt sich, was viele Benutzer immer wieder verwirrt: das Envelope, den Umschlag, der die Angaben über Absender und vor allem Empfänger enthält, kriegt ein Benutzer gar nie zu Gesicht. Hingegen sind die dort vermerkten Absenderangaben in der Regel im Return-Path Feld ersichtlich. Die Empfängerangaben sind für den Endempfänger nicht mehr ersichtlich. Eines ist jedoch klar, mindestens unsere korrekte E-Mail Adresse muss da vermerkt gewesen sein, sonst wäre das Mail nicht in unserem Postfach gelandet.
Die Received Felder
Diese Felder verdienen eine spezielle Aufmerksamkeit, weil sie meist die einzigen Anhaltspunkte bezüglich Herkunft, eingeschlagenenem Weg und allfälligen Zustellproblemen sind. Das Feld kann folgende Unterfelder enthalten: from, by, via, with, id, for und die Zeit und das Datum. Ausser Zeit und Datum sind alle Unterfelder optional, müssen also nicht zwingend enthalten sein. Schauen wir sie uns etwas näher an:
From
Dieses Unterfeld enthält den Namen des übergebenden (sendenden) Computers. Dabei wird jener Name übernommen, mit welchem sich der Computer im helo SMTP Befehl vorgestellt hat. Die meisten MTA fügen jedoch in Klammern noch zusätzliche Informationen, wie die IP Adresse und das Resultat eines damit vorgenommenen DNS Lookups, ein:
from 1-1-168-192.beispiel.de (1-1-168-192.beispiel.de [192.168.1.1])
Diese zusätzlichen Angaben können beim Aufspüren und Beheben von E-Mail Problemen sehr hilfreich und nützlich sein.
By
Gibt den Namen des empfangenden Computers an. (Er ist also derjenige, welcher das betreffende Received Feld eingefügt hat.)
Via
Dieses Unterfeld war ursprünglich dafür vorgesehen, das physikalische Netz zu bezeichnen, über welches die Übermittlung erfolgt, z.B. ARPANET oder Phonenet. Im heutigen Internet wäre UUCP eigentlich der einzige gültige Wert für dieses Unterfeld. Wenn es denn überhaupt Verwendung findet, wird es heute jedoch meist zur Angabe der verwendeten Serversoftware genutzt.
With
Gibt das verwendete Protokoll an, das für die Übermittlung zwischen den zwei Computern verwendet worden ist. Das wird also meist SMTP bzw. ESMTP sein.
Id
Enthält eine eindeutige Bezeichnung, welche der MTA dem Mail zugeordnet hat. Die Information kann nützlich sein, da die meisten MTAs Logdateien führen und es diese ID somit erlaubt, das Mail den Logeinträgen zuzuordnen.
For
In diesem Unterfeld wird (bzw. werden) die im (in den) rcpt SMTP Befehl(en) angegebene(n) Empfängeradresse(n) aufgeführt.
Häufig fügen MTAs zudem als Kommentar in Klammern noch weitere Informationen ein, die bei der Analyse von Problemen hilfreich sein können.
Wozu können die Informationen in den Received Felder dienlich sein? Zum einen können sie bei der Aufklärung von Zustellverzögerungen hilfreich sein. Nehmen wir als Beispiel an, wir würden uns darüber wundern, dass E-Mails von einer bestimmten Stelle immer ausserordentlich lange benötigen, um bei uns anzukommen. Da die Received Felder jeweils einen „Zeitstempel“ enthalten, dürften wir darin ein paar Antworten auf unsere Fragen finden. Unser angenommenes Beispiel enthält vier Received Felder von den folgenden Maschinen mit den jeweilen Zeitstempeln:
oboe.beispiel.de Mon, 17 Apr 2006 12:56:24 -0000
tuba.beispiel.de Mon, 17 Apr 2006 12:51:02 -0000
exthub.beispiel.de Sun, 16 Apr 2006 06:26:41 -0000
wilber.extern.de Sun, 16 Apr 2006 06:25:10 -0000
Die Zeitspanne zwischen unseren beiden Maschinen exthub und tuba war also weitaus am Grössten. Das heisst, wir müssten nun bei unserer Suche nach den möglichen Ursachen der Verzögerungen primär diese beiden Maschinen näher unter die Lupe nehmen.
Allerdings gilt es bei solchen Analysen immer zu berücksichtigen, dass es keine Garantie gibt, dass die Zeitstempel auch tatsächlich korrekt sind. Es kann durchaus sein, dass auf einem Server die Zeit und oder die Zeitzone nicht korrekt eingestellt ist und das Gerät somit irreführende Zeitstempel anbringt.
Weiter können die Received Felder Hinweise auf E-Mail Spoofing geben. Der Internet Dienst E-Mail beinhaltet keine eingebaute Authentifizierung. Wie wir schon gesehen haben, ist es somit möglich, die Absenderangaben in E-Mails beliebig zu fälschen. Man nennt dies Spoofing. Trivialere (und damit die meistens verwendeten) Spoofing Techniken können anhand der Received Felder erkannt werden. Nehmen wir z.B. an, der Header eines erhaltenen E-Mails beinhalte die folgenden Felder:
Received: from ictus.beispiel.de (ictus.beispiel.de [10.2.3.1]) by tuba.beispiel.de
with ESMTP id BAA64342 for <bob@tuba.beispiel.de>; Sun, 16 Apr 2006 12:13:14 -0000
Received: from bells.beispiel.de (bubezleeb@heim13.unixy.de) by ictus.beispiel.de
id DAA45365; Sun, 16 Apr 2006 12:12:50 -0000
Interessant sind hier die vom MTA zusätzlich eingefügten Angaben in Klammern. Im oberen Received Feld wurde zusätzlich die IP Adresse der sendenden Maschine und deren (Reverse-) DNS Auflösung eingefügt. Diese Informationen in den Klammern stimmen mit den im helo Befehl gemachten Angaben überein. Hier scheint somit alles in Ordnung zu sein.
Eine etwas andere Geschichte sind die Angaben im unteren Received Feld. Hier hatte der einfügende Server (ictus.beispiel.de) ein anderes Bild von der sendenden Maschine, als ihm im helo Befehl präsentiert worden war. Ein Indiz dafür, dass hier etwas faul sein könnte.
Beim unteren Received Feld fällt auf, dass der in Klammer eingefügte Hostname eher wie eine E-Mail Adresse aussieht. Das ist ein Hinweis darauf, dass hier das ident Protokoll benutzt wurde, das dazu dient, den Benutzernamen auf der anderen Seite der Verbindung herauszufinden. Es ist eher selten implementiert. In unserem Beispiel war es allerdings implementiert und die dadurch gewonnenen Informationen bestätigen die Wahrscheinlichkeit, dass es sich um Spoofing handelt.
Sind in den Received Feldern die Unterfelder from und by jeweils vorhanden, dann müssten diese Angaben eigentlich eine konsistente ununterbrochene Kette bilden. D.h. die Maschine im by Unterfeld des ersten (untersten) Received Feldes müsste im from Unterfeld des zweiten Received Feldes erscheinen, die Maschine im by Unterfeld des zweiten Received Feldes im from Unterfeld des dritten Received Feldes usw. Gibt es Lücken in dieser Kette, ist dies ein Indiz dafür, dass zusätzliche unechte Received Felder eingefügt worden sind, um die Herkunft des Mails zu verschleiern. Nachfolgend ein (real existierendes) Beispiel aus meinem Spam Mail Ordner:
Received: (qmail 98205 invoked from network); 16 Apr 2006 02:45:26 -0000
Received: from unknown (HELO t-online.de) (66.10.10.146)
by warlord.li with SMTP; 16 Apr 2006 02:45:26 -0000
Received: from unknown (32.33.11.32)
by mail.naihautsui.co.kr with ASMTP; Sat, 15 Apr 2006 17:30:17 -1000
Received: from 128.80.13.212 ([128.80.13.212]) by mtu23.bigping.com with ESMTP; Sat, 15 Apr 2006 17:17:16 -1000
Received: from unknown (HELO qnx.mdrost.com) (74.44.127.221)
by rly04.hottestmile.com with ASMTP; Sat, 15 Apr 2006 17:05:39 -1000
Received: from 23.130.108.157 ([23.130.108.157]) by snmp.otwaloow.com with QMQP; Sat, 15 Apr 2006 16:49:55 -1000
Received: from unknown (HELO nntp.pinxodet.net) (53.8.27.146)
by smtp.mixedthings.net with ESMTP; Sat, 15 Apr 2006 16:40:54 -1000
Der Absender dieses Mails hat sich offensichtlich die Mühe gemacht, sich fünf Received Felder aus dem Finger zu saugen und in sein Mail einzufügen. Allzu grosses Geschick hat er dabei allerdings nicht bewiesen. Nach der Lektüre des Artikels fallen uns da doch zumindest einige der vielen Fehler auf, die ihm unterlaufen sind (wenn er damit denn wirklich die Herkunft zu verschleiern versucht hat), oder?
Am Betrieb des Internet Dienstes E-Mail sind drei verschiedene "Arten" von Software beteiligt. Die Fachleute sprechen von drei verschiedenen Agenten, oder eben auf Englisch von Agents: da gibt es den Mail User Agent (MUA), den Mail Transfer Agent (MTA) und den Mail Delivery Agent (MDA).
Allerdings ist diese Dreiteilung der Funktionalität etwas theoretisch. Real existierende Software beinhaltet meist die Funktionalität von zwei Agents. So muss unsere E-Mail Software auf unserem Mac sowohl die Aufgaben eines MUA, wie auch die eines MTA beherrschen. Und die bei den Providern eingesetzte Mail Server Software kombiniert meist die Funktionalität eines MTA und MDA in einer einzigen Software. Etwas vereinfacht wird daher häufig (auch hier nachfolgend) bei clientseitiger Software von einem Mail User Agent (MUA) und bei serverseitiger Software von einem Mail Transfer Agent (MTA) gesprochen.
Der Transport eines E-Mails vom erstellenden MUA über (allenfalls mehrere) MTA bis ins Postfach des Empfängers erfolgt mit dem SMTP Protokoll (Simply Mail Transfer Protocol). (Einzig den letzten Teil seiner Reise, nämlich vom Postfach in den MUA des Empfängers, absolviert ein Mail nicht mit SMTP, sondern mit POP oder IMAP. Diese beiden Protokolle sind jedoch nicht Gegenstand dieses Artikels.) Bei SMTP handelt es sich um ein sogenanntes "store-and-forward" Protokoll. Das heisst, das Mail kann bis zu seiner Zustellung ins Bestimmungs-Postfach eine ganze Kette von Servern durchreisen. Jeder dieser Server speichert das eingegangene Mail in einer Art Warteschlange, in welcher es die Versuche des Servers abwartet, das Mail an den nächsten Server weiter zu reichen. Gelingt dies nicht sofort, weil der nächste Server nicht erreichbar oder überlastet ist, verbleibt das Mail in dieser Warteschlange, bis der nächste Server wieder erreichbar ist und das Mail an ihn weiter gereicht werden kann. (Wobei natürlich kein Mail ewig in der Warteschlange verbleibt. Nach einer gewissen Zeit gibt ein Server seine Versuche auf, das Mail an den nächsten Server weiter zu reichen. Diese Zeitspanne ist unterschiedlich und hängt von der Konfiguration des Servers ab. Sie beträgt aber meistens mehrere Tage.)
Ein Server (sowie auch unser eigenes E-Mail Programm) "verpackt" ein Mail für den Transfer zum nächsten Server in ein Envelope, vergleichbar mit einem Umschlag bei einem papierenen Brief. Wie auch beim papierenen Brief trägt bei der elektronischen Post dieses Envelope die für die Beförderung und Zustellung notwendigen und massgeblichen Absender- und Bestimmungsangaben. Entsprechende Angaben im Brief bzw. im E-Mail selbst haben auf die Zustellung keinen Einfluss. So wird insbesondere das To Feld in einem Mail Header von einem MTA nicht beachtet.
Eine detaillierte Beschreibung von SMTP würde den Rahmen dieses Artikels sprengen. Wir schauen uns nun aber in stark vereinfachter Form an, wie unser E-Mail Programm das von uns erstellte Mail an den SMTP-Server unseres Providers weiterleitet, nachdem wir auf den "Senden" Knopf gedrückt haben. Praktisch das selbe wird dann auch der SMTP-Server des Providers tun, um das Mail an die nächste Station weiter zu reichen. Der Server muss sich einfach im Gegensatz zu unserem E-Mail Programm, das sich immer nur an "seinen" immer gleichen Server zu wenden braucht, zusätzlich noch "Gedanken" darüber machen, an welchen Server es das Mail weiterreichen muss. Dieser Prozess liegt jedoch definitiv jenseits des Rahmens dieses Artikels.
SMTP ist ein text-orientiertes, kommando-basiertes Protokoll. Der Client sendet ein Kommando, der Server verarbeitet es und sendet dann seine Antwort. Die Antwort des Servers besteht aus einem maschinenlesbaren Code aus 3 Ziffern und einem zur menschlichen Lektüre bestimmten ergänzenden Kommentar:
250 Requested mail action okay, completed
Die erste Ziffer des Antwortcodes gibt dabei letztlich über Erfolg oder Misserfolg Auskunft: 1 steht für eine vorläufige positive Antwort, 2 für eine definitiv positive Antwort (Aktion ausgeführt), 3 für einen positiven Zwischenbericht, 4 für einen negativen Zwischenbericht (Server probiert weiter) und 5 für eine definitive negative Antwort (Server hat aufgegeben).
Nach dem Drücken des "Senden" Knopfes kontaktiert unser E-Mail Programm den eingestellten SMTP-Server unseres Providers (in der Regel) auf TCP Port 25. Ist der Server zur Erbringung seiner Dienste bereit, antwortet er mit einer Begrüssung, in welcher er sich selbst vorstellt:
220 smtp.beispiel.de Service ready
Unser E-Mail Programm sendet nun seinerseits eine Begrüssung, in welcher es sich vorstellt:
helo 1-1-168-192.beispiel.de
Der Server quittiert:
250 smtp.beispiel.de
Unser E-Mail Programm muss nun mit dem Befehl mail den ersten Teil des Envelopes übertragen, nämlich die Absenderangaben:
mail from:<john.doe@beispiel.de>
Diese Angabe entnimmt es in der Regel dem From Feld im Header bzw. den Einstellungen, die wir für den betreffenden Mail Account gemacht haben. An die hier angegebene Adresse werden Probleme bei der Zustellung zurück gemeldet. (Ein Programm zum Versenden von Spam verhält sich natürlich etwas anders. Es wird hier in der Regel nicht die Adresse des tatsächlichen Absenders, sondern eine fremde oder nicht existierende Adresse eintragen.)
Ist der Server bereit, Mails von diesem Benutzer entgegen zu nehmen, antwortet er:
250 ok
Nun muss unser E-Mail Programm mit dem Befehl rcpt den zweiten Teil des Envelopes, nämlich die Bestimmungsangaben übermitteln:
rcpt to:<steve@apple.com>
Der Server bestätigt:
250 ok
Unser E-Mail Programm wiederholt den Befehl nun für jeden Empfänger, an den das Mail geschickt werden soll. Die Empfängerangaben übernimmt unser E-Mail Programm logischerweise aus den von uns ausgefüllten Headerfeldern To, Cc und Bcc. (Auch hier verhält sich ein Programm zum Versenden von Spam oder auch ein sich selbst reproduzierender Virus etwas anders. Diese entnehmen die Adressaten ihren Datenbanken und angefertigten Listen und die Angaben im Mail Header stimmen häufig nicht damit überein.) Gemäss Standard muss ein SMTP-Server in seinem forward-path mindestens 100 Mailboxen speichern können. Somit müsste der rcpt Befehl bei Bedarf mindestens 100 mal wiederholt werden können. Allerdings verletzen viele Provider diesen Standard und beschränken den forward-path und damit die gleichzeitig mögliche Anzahl Empfänger auf weniger als 100. Ein MUA müsste in solchen Fällen den Versand auf mehrere SMTP Sessions aufteilen, was die meisten normalen (nicht auf Serienversand spezialisierten) MUA überfordert.
Sind alle Empfänger übermittelt, teilt unser E-Mail Programm dem Server mit dem Befehl data mit, dass es nun das eigentliche Mail (inkl. Header) senden möchte:
data
Der Server antwortet darauf:
354 Start mail input; end with >CRLF>.<CRLF>
Nun kann unser MUA das eigentliche Mail übermitteln. Das Ende der Übermittlung zeigt es mit einem einzigen Punkt auf einer Zeile an. Der Server quittiert sodann:
250 ok
Das Ende der Session zeigt unser E-Mail Programm mit dem Befehl quit an:
quit
Der Server quittiert und bricht die Verbindung ab:
221 smtp.beispiel.de Service closing transmission channel
Was der Server nun tut, unterscheidet sich (hoffentlich

Received: from smtp.beispiel.de by smtp.apple.com with SMTP id HAA197482 for <steve@apple.com>; Mon, 4 Oct 1999 08:33:45 -0700
Jeder MTA, welcher das E-Mail entgegen nimmt, muss im Header ein solches Feld einfügen. Und da diese Felder für die Diagnose von E-Mail Problemen meist der wichtigste Ansatzpunkt sind, werden wir uns gleich noch etwas intensiver damit beschäftigen.
Befindet sich das Postfach des Empfänger nicht auf dem Server, so "verpackt" er das mit einem Received Feld ergänzte Mail wieder in ein Envelope und reicht es an den nächsten Server weiter. Befindet sich das Postfach auf dem Server (bzw. verlässt das Mail aus einem anderen Grund die SMTP-Welt), so fügt jener dem Header des Mails ein weiteres Feld bei:
Return-Path: <john.doe@beispiel.de>
Darin gibt der Server die auf dem Envelope angegebene Absenderadresse (also die im SMTP mail Befehl angegebene Adresse; mail from:<john.doe@beispiel.de) an. Anschliessend legt der Server das Mail ohne das Envelope ins Postfach des Empfängers.
Daraus ergibt sich, was viele Benutzer immer wieder verwirrt: das Envelope, den Umschlag, der die Angaben über Absender und vor allem Empfänger enthält, kriegt ein Benutzer gar nie zu Gesicht. Hingegen sind die dort vermerkten Absenderangaben in der Regel im Return-Path Feld ersichtlich. Die Empfängerangaben sind für den Endempfänger nicht mehr ersichtlich. Eines ist jedoch klar, mindestens unsere korrekte E-Mail Adresse muss da vermerkt gewesen sein, sonst wäre das Mail nicht in unserem Postfach gelandet.
Die Received Felder
Diese Felder verdienen eine spezielle Aufmerksamkeit, weil sie meist die einzigen Anhaltspunkte bezüglich Herkunft, eingeschlagenenem Weg und allfälligen Zustellproblemen sind. Das Feld kann folgende Unterfelder enthalten: from, by, via, with, id, for und die Zeit und das Datum. Ausser Zeit und Datum sind alle Unterfelder optional, müssen also nicht zwingend enthalten sein. Schauen wir sie uns etwas näher an:
From
Dieses Unterfeld enthält den Namen des übergebenden (sendenden) Computers. Dabei wird jener Name übernommen, mit welchem sich der Computer im helo SMTP Befehl vorgestellt hat. Die meisten MTA fügen jedoch in Klammern noch zusätzliche Informationen, wie die IP Adresse und das Resultat eines damit vorgenommenen DNS Lookups, ein:
from 1-1-168-192.beispiel.de (1-1-168-192.beispiel.de [192.168.1.1])
Diese zusätzlichen Angaben können beim Aufspüren und Beheben von E-Mail Problemen sehr hilfreich und nützlich sein.
By
Gibt den Namen des empfangenden Computers an. (Er ist also derjenige, welcher das betreffende Received Feld eingefügt hat.)
Via
Dieses Unterfeld war ursprünglich dafür vorgesehen, das physikalische Netz zu bezeichnen, über welches die Übermittlung erfolgt, z.B. ARPANET oder Phonenet. Im heutigen Internet wäre UUCP eigentlich der einzige gültige Wert für dieses Unterfeld. Wenn es denn überhaupt Verwendung findet, wird es heute jedoch meist zur Angabe der verwendeten Serversoftware genutzt.
With
Gibt das verwendete Protokoll an, das für die Übermittlung zwischen den zwei Computern verwendet worden ist. Das wird also meist SMTP bzw. ESMTP sein.
Id
Enthält eine eindeutige Bezeichnung, welche der MTA dem Mail zugeordnet hat. Die Information kann nützlich sein, da die meisten MTAs Logdateien führen und es diese ID somit erlaubt, das Mail den Logeinträgen zuzuordnen.
For
In diesem Unterfeld wird (bzw. werden) die im (in den) rcpt SMTP Befehl(en) angegebene(n) Empfängeradresse(n) aufgeführt.
Häufig fügen MTAs zudem als Kommentar in Klammern noch weitere Informationen ein, die bei der Analyse von Problemen hilfreich sein können.
Wozu können die Informationen in den Received Felder dienlich sein? Zum einen können sie bei der Aufklärung von Zustellverzögerungen hilfreich sein. Nehmen wir als Beispiel an, wir würden uns darüber wundern, dass E-Mails von einer bestimmten Stelle immer ausserordentlich lange benötigen, um bei uns anzukommen. Da die Received Felder jeweils einen „Zeitstempel“ enthalten, dürften wir darin ein paar Antworten auf unsere Fragen finden. Unser angenommenes Beispiel enthält vier Received Felder von den folgenden Maschinen mit den jeweilen Zeitstempeln:
oboe.beispiel.de Mon, 17 Apr 2006 12:56:24 -0000
tuba.beispiel.de Mon, 17 Apr 2006 12:51:02 -0000
exthub.beispiel.de Sun, 16 Apr 2006 06:26:41 -0000
wilber.extern.de Sun, 16 Apr 2006 06:25:10 -0000
Die Zeitspanne zwischen unseren beiden Maschinen exthub und tuba war also weitaus am Grössten. Das heisst, wir müssten nun bei unserer Suche nach den möglichen Ursachen der Verzögerungen primär diese beiden Maschinen näher unter die Lupe nehmen.
Allerdings gilt es bei solchen Analysen immer zu berücksichtigen, dass es keine Garantie gibt, dass die Zeitstempel auch tatsächlich korrekt sind. Es kann durchaus sein, dass auf einem Server die Zeit und oder die Zeitzone nicht korrekt eingestellt ist und das Gerät somit irreführende Zeitstempel anbringt.
Weiter können die Received Felder Hinweise auf E-Mail Spoofing geben. Der Internet Dienst E-Mail beinhaltet keine eingebaute Authentifizierung. Wie wir schon gesehen haben, ist es somit möglich, die Absenderangaben in E-Mails beliebig zu fälschen. Man nennt dies Spoofing. Trivialere (und damit die meistens verwendeten) Spoofing Techniken können anhand der Received Felder erkannt werden. Nehmen wir z.B. an, der Header eines erhaltenen E-Mails beinhalte die folgenden Felder:
Received: from ictus.beispiel.de (ictus.beispiel.de [10.2.3.1]) by tuba.beispiel.de
with ESMTP id BAA64342 for <bob@tuba.beispiel.de>; Sun, 16 Apr 2006 12:13:14 -0000
Received: from bells.beispiel.de (bubezleeb@heim13.unixy.de) by ictus.beispiel.de
id DAA45365; Sun, 16 Apr 2006 12:12:50 -0000
Interessant sind hier die vom MTA zusätzlich eingefügten Angaben in Klammern. Im oberen Received Feld wurde zusätzlich die IP Adresse der sendenden Maschine und deren (Reverse-) DNS Auflösung eingefügt. Diese Informationen in den Klammern stimmen mit den im helo Befehl gemachten Angaben überein. Hier scheint somit alles in Ordnung zu sein.
Eine etwas andere Geschichte sind die Angaben im unteren Received Feld. Hier hatte der einfügende Server (ictus.beispiel.de) ein anderes Bild von der sendenden Maschine, als ihm im helo Befehl präsentiert worden war. Ein Indiz dafür, dass hier etwas faul sein könnte.
Beim unteren Received Feld fällt auf, dass der in Klammer eingefügte Hostname eher wie eine E-Mail Adresse aussieht. Das ist ein Hinweis darauf, dass hier das ident Protokoll benutzt wurde, das dazu dient, den Benutzernamen auf der anderen Seite der Verbindung herauszufinden. Es ist eher selten implementiert. In unserem Beispiel war es allerdings implementiert und die dadurch gewonnenen Informationen bestätigen die Wahrscheinlichkeit, dass es sich um Spoofing handelt.
Sind in den Received Feldern die Unterfelder from und by jeweils vorhanden, dann müssten diese Angaben eigentlich eine konsistente ununterbrochene Kette bilden. D.h. die Maschine im by Unterfeld des ersten (untersten) Received Feldes müsste im from Unterfeld des zweiten Received Feldes erscheinen, die Maschine im by Unterfeld des zweiten Received Feldes im from Unterfeld des dritten Received Feldes usw. Gibt es Lücken in dieser Kette, ist dies ein Indiz dafür, dass zusätzliche unechte Received Felder eingefügt worden sind, um die Herkunft des Mails zu verschleiern. Nachfolgend ein (real existierendes) Beispiel aus meinem Spam Mail Ordner:
Received: (qmail 98205 invoked from network); 16 Apr 2006 02:45:26 -0000
Received: from unknown (HELO t-online.de) (66.10.10.146)
by warlord.li with SMTP; 16 Apr 2006 02:45:26 -0000
Received: from unknown (32.33.11.32)
by mail.naihautsui.co.kr with ASMTP; Sat, 15 Apr 2006 17:30:17 -1000
Received: from 128.80.13.212 ([128.80.13.212]) by mtu23.bigping.com with ESMTP; Sat, 15 Apr 2006 17:17:16 -1000
Received: from unknown (HELO qnx.mdrost.com) (74.44.127.221)
by rly04.hottestmile.com with ASMTP; Sat, 15 Apr 2006 17:05:39 -1000
Received: from 23.130.108.157 ([23.130.108.157]) by snmp.otwaloow.com with QMQP; Sat, 15 Apr 2006 16:49:55 -1000
Received: from unknown (HELO nntp.pinxodet.net) (53.8.27.146)
by smtp.mixedthings.net with ESMTP; Sat, 15 Apr 2006 16:40:54 -1000
Der Absender dieses Mails hat sich offensichtlich die Mühe gemacht, sich fünf Received Felder aus dem Finger zu saugen und in sein Mail einzufügen. Allzu grosses Geschick hat er dabei allerdings nicht bewiesen. Nach der Lektüre des Artikels fallen uns da doch zumindest einige der vielen Fehler auf, die ihm unterlaufen sind (wenn er damit denn wirklich die Herkunft zu verschleiern versucht hat), oder?