Am Ende einer langen Reise gelangt eine E-Mail in ein Postfach auf dem Rechner ihres Empfängers. Aber wie genau wird sie dort abgelegt? Dafür existieren verschiedene Formate – jedes mit Vor- und Nachteilen. Dieser Beitrag nimmt die wichtigsten davon unter die Lupe
Mailboxen sind zu allererst benutzereigene Speicher für eingehende E-Mails. Sie sind der Übergabeort zwischen Mail-Server und Empfänger, oder exakter zwischen Mail Delivery Agent (MDA) und Mail User Agent (MUA), also der Client-Software, mit der sich die Post öffnen und lesen läßt. Das ist die offensichtlichste, aber nicht die einzige Funktion einer Mailbox.
Zweitens gestatten die meisten E-Mail-Programme dem Benutzer, Extra-Postfächer (Mail-Folder) einzurichten, in denen er die digitalen Briefe sortieren kann (beispielsweise thematisch oder nach Absender).
Und drittens schließlich spielen Mailboxen eine große Rolle bei der Archivierung und beim Transfer von Mail zwischen verschiedenen Mail-Klienten, Accounts oder Rechnern. In aller Regel wird man dabei nicht einzelne Nachrichten, sondern komplette Mailboxen verschieben.
Artenvielfalt
Aus den verschiedenen Funktionen ergeben sich besondere Anforderungen: Das Ablagesystem soll häufige Zu- und Abgänge ohne Probleme vertragen, dabei übersichtlich bleiben, wenn möglich Plattenplatz sparen und gleichzeitig einfache Schnittstellen für Programmierer bieten. In einer Multitasking- und Multiuser- Umgebung kommt hinzu, dass es möglicherweise von verschiedenen Seiten zeitgleich benutzt wird.
Diese vielfältigen Ansprüche an Mailboxen führten historisch zu unterschiedlichen Lösungen, die alle bis heute Bestand haben und oft sogar von einem Benutzer gleichberechtigt nebeneinander verwendet werden können. Das Hauptunterscheidungsmerkmal ist dabei die Organisation des Mailbox-Files oder -Folders. Wichtigste Varianten sind dabei: Eine Datei pro Nachricht, eine Datei pro Mailbox oder eine Datei pro Nutzer mit mehreren Mailboxen in einer Datenbank. Das zuletzt erwähnte System wird vor allem in individuellen Installationen verwendet; professionelle Systeme benötigen robustere und feiner granulierte Lösungen.
Klassiker
Ein klassisches Format für Mailboxen heißt auch fast so: “mbox”. Es handelt sich dabei um einen Vertreter des Systems “eine Datei pro Postfach”. Die einzelnen Mails werden in der Datei einfach aneinandergehängt. Kommt eine neue Mail an, landet sie am Ende der Datei.
Damit das System zwei Mails voneinander trennen kann, beginnt jede mit einer Zeile, an deren Anfang das Wort “From” gefolgt von einem Leerzeichen steht. Daran schließen sich üblicherweise noch das Empfangsdatum und der Envelope-Sender an. Es folgen die Header-Daten und, nach einer Leerzeile, der Body der E-Mail (Listing 1).
Listing 1
Eine mbox-Datei
From user@domain.com Sat Jun 14 14:45:12 2003
Received: from localhost (localhost.localdomain [127.0.0.1])
by anmen.not-for-mail (8.11.6/8.11.6) with ESMTP id h5ECjBA29295
for
; Sat, 14 Jun 2003 14:45:11 +0200 Message-ID: <3EEB0E35.C0077C5@domain.com> Date: Sat, 14 Jun 2003 13:59:49 +0200 From: User Domain
To: a414@sedacon.com (Marc Andre Selig) Subject: Testmail Hallo! From a414@sedacon.com Sat Jun 14 14:48:14 2003 Date: Sat, 14 Jun 2003 14:48:14 +0200 From: a414@sedacon.com To: a414@sedacon.com (Marc Andre Selig) Subject: Noch ein Test Zweite Testmail.
Ein offensichtliches Problem tritt auf, wenn im Body der Mail eine Zeile mit “From” beginnt. In deutschsprachigen Mails wird das nicht besonders häufig der Fall sein; im Englischen ist die Wahrscheinlichkeit dafür wesentlich höher. Solch eine Zeile würde als Trenner zwischen zwei E-Mails interpretiert. Der Mail-Client würde (vermutlich vergeblich) versuchen, die folgenden Zeilen als Header zu lesen. Ein Angreifer könnte auf diese Weise sogar versuchen, gefälschte Mails in anderer Post in einen elektronischen Briefkasten zu schmuggeln.
Damit das nicht passiert, müssen bei der Verwendung von Mailbox-Files alle “From”-Zeilen aus dem Body einer Mail verschwinden. Die meisten Mail Delivery Agents fügen in solch einem Fall ein Größer-als-Zeichen an den Anfang der Zeile ein, ersetzen also “From” durch “>From”.
Betagt, aber handlich
Entscheidend für die Langlebigkeit des mbox-Formats dürfte sein, dass es so intuitiv ist: Die Mails werden einfach aneinander gehängt. Wer eine Mailbox kopieren oder verschieben möchte, braucht sich nur um eine einzige Datei zu kümmern. mbox-Folder schonen zudem Ressourcen. Auf jede Festplatte passt nur eine bestimmte Menge an Dateien – die Grenze setzt hier nicht nur Größe der Files, sondern auch die verfügbare Anzahl Inodes, die beim Erzeugen des Filesystems endgültig festgelegt wurde. Mailbox-Formate, die Hunderte Mails in einer einzigen Datei speichern, gehen mit diesen Inodes natürlich ökonomischer um als solche, die jede Mail in einem eigenen File ablegen. Auch verschwenden sie weniger Platz durch belegte, aber nicht ganz mit Nutzdaten gefüllte Blöcke. Allerdings sind solche Überlegungen im Zeitalter billiger Festplatten nicht vordringlich.
Ein großer Nachteil des mbox-Formats ist das nötige Locking. Eine solche Datei darf natürlich nur von einem Programm auf einmal benutzt werden. Stellen Sie sich vor, ein Programm löscht eine Mail aus der Mitte eines Folders, während ein anderes Programm gleichzeitig eine Mail an den Anfang einfügt. Das Ergebnis wäre ein heilloses Chaos und im schlimmsten Fall gingen Daten verloren. Um das zu verhindern, markiert das erste Programm, das die Mailbox benutzt, die Datei als “in Benutzung”, es lockt sie. Jedes weitere Programm muss nun warten, bis die Dateisperre wieder verschwunden ist, bevor es in die Mailbox schreiben darf. Für diese Locks existieren dummerweise zahlreiche konkurrierende Mechanismen, die miteinander nicht kompatibel sind. Und nur wenige funktionieren auch in Netzwerkdateisystemen noch zuverlässig.
Doch selbst bei sauberen Locks kann es zu Problemen in Mailbox-Files kommen. So können etwa Daten beschädigt werden, wenn ein Prozess gekillt wird oder abstürzt während er gerade in eine Mailbox schreibt. Wurde in diesem Moment eine neue Mail angefügt, entsteht ein zusätzliches Bruchstück mit dem ersten Teil der Mail – zumindest ein Schönheitsfehler. Ein noch größeres Fehlerpotential entsteht beim Sortieren, weil hier die Mailbox-Datei komplett neu geschrieben werden muss. Mit zunehmender Größe des Files kosten die Änderungen außerdem immer mehr Zeit – Mailboxen in diesem Format werden dadurch immer langsamer, je mehr Mails sie enthalten
Ein früher Konkurrent des mbox-Formates heißt Babyl. Es speichert ebenfalls alle Mails eines Folders in einer gemeinsamen Datei ab. Allerdings werden die Mails durch Sonderzeichenkombinationen voneinander getrennt und es existieren separate Felder für den Mail-Header und den Status (wurde die Mail gelesen oder beantwortet?). Babyl begegnet Ihnen möglicherweise, wenn Sie emacs für die Lektüre Ihrer E-Mail verwenden.
Erfolg im Einzel
Viele Nachteile des Mailbox-Formates lassen sich umgehen, wenn man jede E-Mail in einer separaten Datei abspeichert. Das ständige Lesen und Schreiben einer riesigen Folder-Datei entfällt, stattdessen müssen nur noch kleine Dateien bearbeitet werden. Die Nutzung von E-Mail auf der Kommandozeile wird wesentlich vereinfacht, weil Befehle wie grep nicht mehr nur den Folder ausfindig machen, sondern tatsächlich eine konkrete Mail.
Aufwändiges Locking ist nicht mehr notwendig: Wenn eine Mail-Datei existiert, darf sie nicht mehr von anderen beschrieben werden. Existiert sie noch nicht, gibt es auch kei Konkurrenzproblem. (Wichtig ist nur, dass die Existenzprüfung und das Anlegen der Datei in einem einzigen Schritt erfolgen – in Unix leicht möglich.)
Ganz nebenbei erschließen sich weitere Verwendungsmöglichkeiten. Etwa wird es in diesem System möglich, echte Links anzulegen und dadurch ein und dieselbe Mail in mehreren Foldern gleichzeitig abzulegen. Zum Beispiel könnten Sie eine Folder-Hierarchie nach Korrespondenten sortieren, eine weitere nach Projekten und eine dritte nach Dringlichkeiten. Gmail und Opera’s M2 bieten diesen Mechanismus.
Dabei werden noch nicht einmal besonders viele Vorteile der mbox aufgegeben. Das Speichern in getrennten Dateien bleibt einfach. Allerdings werden auch bei diesem System sehr große Folder etwas unhandlich, besonders wenn umsortiert werden soll. Außerdem muss der Admin bereits beim Anlegen der Partition für Mail darauf achten, dass mkfs genügend Inodes erzeugt. Wie bereits oben erläutert, verbraucht dieses System nämlich eine unverhältnis große Menge davon. Das bedeutet auch, dass ein Synchronisieren von Mail-Directories beispielsweise mit rsync oder ähnlichen Programmen relativ langsam wird.
Durchzählen
Eine erste wichtige Variation zum Thema Mail-Dateien ist das Folder-Format “Mail Handler” (mh bzw. nmh). Dabei handelt es sich um ein System von Kommandozeilen-Tools zum modularen Umgang mit E-Mail – hier interessiert uns aber nur der Aufbau eines Folders. Der enthält fortlaufend nummerierte Dateien. Wird eine neue Mail in einen Folder geschrieben, benutzt man einfach die nächste freie Nummer.
Ein solcher MH-Folder ist sehr bequem und praktisch. Er hat aber noch zwei entscheidende Nachteile. Erstens besteht MH auf einer zentralen Datei .mh_sequences, die beispielsweise die “aktuelle Mail” vermerkt oder es erlaubt, eine Liste neuer Mails zusammenzustellen. Durch diese Datei tritt doch wieder das Locking-Problem auf, das wir durch den Verzicht auf Mailbox-Folder gelöst glaubten. Zweitens kann es auch hier zu korrupten E-Mails kommen, wenn beispielsweise ein Prozess beim Schreiben einer E-Mail abstürzt.
Verschiebebahnhof
Diese Schwierigkeiten löst Maildir, das ursprünglich von qmail eingeführt und später von Cyrus erweitert wurde. Hier enthält ein Folder drei Unterverzeichnisse namens tmp, new und cur. Jede Mail wird durch eine eindeutige Kennung (z.B. eine Kombination aus Zeit, Prozesskennung und weiteren Daten) identifiziert.
Neue Mail landet zunächst in einer Datei in tmp, deren Name die Kennung ist. Erst nachdem die Datei vollständig geschrieben wurde, wird sie in einem einzigen, Schritt von tmp nach new verschoben. Beim Lesen bewegt sie das Leseprogramm von new nach cur, wobei zusätzliche Flags an den Dateinamen angehängt werden können.
Maildir bietet produziert zwar eine Menge Einzeldateien, bietet einem Administrator aber auch zahlreiche Vorteile: Locking-Probleme existieren praktisch überhaupt nicht mehr. Selbst abstürzende Prozesse erzeugen höchstens Müll in tmp, der für den Nutzer gar nicht sichtbar ist. Beim nächsten Zustellversuch wird die Mail regulär ausgeliefert. Die Volltext-Suche in einem Maildir deutet sofort auf die gesuchte Mail. Standard-Tools zur Indizierung der Folder beschleunigen die Suche nochmals enorm.
Tabelle 1: Mailbox-Formate wichtiger Clients
| Mutt | mbox, maildir, mh, mmdh |
| KMail | mbox, maildir |
| Balsa | mbox, maildir, mh |
| Sylpheed Claws | mbox, mh |
| Evolution | mh, maildir, Eudora, Netscape, Outlook |
Klientenwechsel
Wer den Mail-Client wechselt, möchte in der Regel sein Postarchiv mitnehmen. Die meisten gängigen E-Mail-Programme unterstützen mehrere Formate (Tabelle 1), so dass man oft einen gemeinsamen Nenner findet. In den meisten Fällen wird dies das mbox-Format sein, dass beispielsweise KMail, Sylpheed Claws, Mutt, Evolution, Balsa oder Mulberry verstehen. Exportiert man seine Post mit einem dieser Programme im mbox-Format, kann man sie später mit einem anderen wieder lesen. Möchte man aber gezielt zu maildir oder mh wechseln oder kommt man von einem exotischen Mailer, der mbox nicht kennt, dann braucht man einen Konverter. Eine brauchbarer Zusammenstellung solcher Tools findet man beispielsweise auf der KMail-Homepage [5]. Eine Übersicht über Konverter, die speziell propietäre Mailbox-Formate in portable überführen bietet [6].
Glossar
-
Envelope-Sender
-
Jede E-Mail enthält im Header Informationen über Absender und Empfänger. Die eigentlich relevanten Daten über Absender und Empfänger werden jedoch außerhalb der E-Mail in der so genannten SMTP-Envelope geführt. Diese Daten werden während der SMTP-Transaktion noch vor dem Mailtext selbst direkt zwischen den Mailservern übergeben.
Infos
[1] Der Info-Knoten (gnus) Comparing Mail Back Ends liefert eine rasche Übersicht und Bewertung derjenigen Folder-Formate, die von emacs aus einfach genutzt werden können.
[2] Das Perl-Modul Mail::Box bietet auf gut abstrahierter Ebene einheitliche Zugangswege zu den typischen Folder-Formaten (sowie zu POP- und IMAP-Foldern) und eignet sich damit zur raschen Erstellung von Konvertern: http://search.cpan.org/~markov/Mail-Box/
[3] Die ursprüngliche Definition des Maildir-Formates kommt aus qmail: http://www.qmail.org/man/man5/maildir.html und http://cr.yp.to/proto/maildir.html
[4] Courier erweitert die Fähigkeiten von Maildir: http://www.courier-mta.org/?maildir.html
[5] Tools zum Konvertieren von Mail-Formaten: http://kmail.kde.org
[6] Konverter für proprietäre Mailbox-Formate: http://www.emailman.com/conversion/index.html#mboxwin




