Maildir: Wie kommen die Mails auf einen neuen Server?

Maildir: Was steckt hinter dem Dateinamen einer Maildir Datei? Kann man sie bedenkenlos auf andere Server verschieben? Die Antwort steckt in diesem Artikel.


Es kommt der Zeitpunkt für viele Server, da werden sie ersetzt. So ergeht es auch so manchem Mailserver. Modernisierungen, Standortwechsel und andere Begebenheiten machen einen Transfer der alten Mails auf ein anderes Gerät / auf eine andere Installation notwendig.

Nun stellt sich die Frage, wie man das bewerkstelligt.

Die einzelnen Dateien im Maildir Format haben durchaus verzwickte Dateinamen

1992034886.M538544P12919.server,S=1473,W=1505

und so könnte man auf den trügerischen Schluss kommen, dass mehr da dahinter steckt und man irgendwelche Konvertierungen beachten muss. Doch es ist kein Transfer über 2 IMAP konten oder ähnliches ist notwendig. Der Dateiname ist lediglich ein Resultat des Versuchs eindeutige Dateinamen zu erzeugen und der Inhalt selbst ist simpler ASCII Text. Theoretisch könnte eine solche Datei auch “herbert” heißen und es sollten keinerlei Komplikationen auftreten.

Somit reicht es aus eine Datei im Maildir Format einfach in das neue Zielverzeichnis zu verschieben.

Was steckt hinter dem Dateinamen?

Maildir VerzeichnisbaumAls Prozedur für die Erzeugung des Dateinamens sind folgende zwei Formen vorgesehen:

  • time.MusecPpid.host
  • time.MusecPpid_unique.host

time und usec stehen für die aktuelle Systemzeit die über den aufruf gettimeofday ausgelesen wird, pid ist die Prozessnummer des Prozesses der die Mail in das Verzeichnis schiebt. Der Platzhalter host steht für den Namen der Maschine an die die Mail geliefert wurde.

Wenn mehr als eine Nachricht im selben Prozess behandelt wurde sind noch zusätzliche Suffixe angehängt, dies wird im 2. Schema verdeutlicht. Ein Unterstrich trennt die Prozessnummer von einem aufsteigenden Counter (unique). Dabei ist es egal in welchen Ordner eine Nachricht einmal abgelegt wird. Diese Mechanismen sorgen dafür, dass mehr als nur ein Prozess Mails ablegen kann ohne anderen Prozessen in die Wege zu kommen.

Damit der so erzeugte Dateiname nicht trotzdem schon existiert wird wird dennoch drauf geprüft ob er schon existiert. Wenn das der Fall wäre würde der Prozess für kurze Zeit pausieren und dann einen neuen Anlauf starten.

War der check erfolgreich wird die Nachricht angelegt. Ist sie fertig ins Filesystem geschrieben wird sie an ihr Ziel verschoben und um zusätzliche Informationen im Namen ergänzt. Der neue Name entspricht nun folgendem Schema:

  • time.MusecPpidVdevIino.host,S=cnt,W=vsize
  • time.MusecPpidVdevIino_unique.host,S=cnt,W=vsize

dev steht nun für die Device Nummer ino für die Inode Nummer, beides ausgelesen über fstat und cnt steht für die Nachrichtengröße in Bytes, welches für diverse Mailkonten-Quotenregelungen notwendig ist. Dadurch erspart man sich ein performance-lastiges Aufsummieren der Mailboxauslastung über den stat Befehl. vsize ist ebenfalls eine Kennzahl für die Mailgröße nach RFC822 bei dem die Steuerzeichen für den Zeilenumbruch mit berücksichtigt werden.

That’s it!

PS: richtiges chown nicht vergessen, sonst passiert nach dem Verschieben gar nix :)

Ähnliche Artikel:

Autor: Thomas Pummer

Thomas Pummer ist Softwareentwickler an der Universität Wien. In seiner Freizeit betreut er das Open Source Projekt TrayRSS und werkt an diversen anderen kleinen Projekten. Er ist sehr interessiert an Open Source und Webentwicklung und testet gern neue Programmiersprachen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*