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:

Alle User mit UserID unter Linux auflisten

Aus gegebenen Anlass wollte ich einem User eine fixe User ID zuweisen. Vorab galt es zu verifizieren ob es bereits einen User mit entsprechender ID gibt.

Nun könnte man entweder per

id -u <benutzername>

einzeln nachprüfen, oder aber man wirft einen Blick in /etc/passwd. Dort wird man erstmals von einer einer Fülle an Information erschlagen. Freilich reicht der Blick da rein, doch was tun wenn nicht nur ~30 Benutzer am System vorhanden sind sondern 50+ oder gar 100+?

Auch hier gäbe es einen schnellen Weg:

cat /etc/passwd | grep <idnummer>

Aber mal ehrlich, auch wenns flott geht, wir wollen das noch dazu schön aufbereitet!

Hier kommt awk zum Zuge:

awk -F":" '{ print "Die UserID " $3 "\tist vom User: " $1 "\tbelegt"}' /etc/passwd | grep <idnummer>

Kurz erklärt, wir erzeugen uns eine eigene Ausgabe, und teilen den Inhalt von /etc/passwd in verschiedene Variablen auf. Dazu benutzen wir den Doppelpunkt als Trennzeichen: -F“:“

‚{ print“<inhalt>“}‘ damit weisen wir unsere individuelle Ausgabe an

$1 $2 $3 sind die jeweiligen Variablen die durch das aufteilen der Zeilen durch das Trennzeichen erzeugt wurden, auf Platz 1 steht der Username, auf Platz 3 die Userid.

Als letzte Variable geben wir noch das auszuwertende File an /etc/passwd.

Natürlich filtern wir wieder mittels | grep <idnummer> nach der von uns gesuchten ID und bekommen, bei einem Treffer nun eine kleine nette Ausgabe:

Die UserID 2222    ist vom User: awktest      belegt

Ähnliche Artikel:

Linux und Umlaute in Dateinamen

Zu oft ist es schon vorgekommen, ein Kollege schickt mir ein auf WinXP erstelltes Zip Archiv per E-Mail, und die Dateinnamen der komprimierten Dateien enthalten Umlaute.

Mein Archlinux läuft bestens unter UTF-8. Doch hierbei gibt es Probleme mit ISO-8859-1 kodierten Dateinamen. Im Terminal oder im Dolphin sind diese Datein nicht ansprechbar, ein invertiertes Fragezeichen ersetzt den Umlaut, die Datei ist so nicht ansprechbar.

Hier kommt convmv zum Einsatz, zu finden in gut sortierten Repositories.

Nachdem das Archiv extrahiert wurde, können mittels
convmv -f iso-8859-1 -t utf-8 -r /Verzeichnis
werden alle zu konvertierenden Datein rekursiv nochmals angezeigt werden. Hierbei verrät die Ausgabe auch den zukünftigen Dateinamen.
Fügt man dann den Parameter –notest hinzu führt convmv die Änderungen auch direkt durch und die Datei ist wieder ansprechbar.

Ein paar nützliche Links dazu:

http://www.j3e.de/linux/convmv/
http://www.j3e.de/linux/convmv/man/
http://freshmeat.net/projects/convmv/

Ähnliche Artikel:

quakelive with some problems on linux (libpng newer than 1.2)

Unfortunately there are some problems displaying the graphic of quakelive when using libpng newer than 1.2. Within the last weeks my archlinux offerd me to update it to 1.4. Afterwards quakelive was broken. It displayed only some artefakts where icons or text was before.

Quake Live broken visualization
Screenshot was taken from: http://www.quakelive.com/forum/showthread.php?&t=43859

To fix this problem there is a simple workaround:

  1. Check if libpng12.so exist ( ls -lha /usr/lib/libpng12.so )
  2. Install libpng 1.2 (on arch e.g. yaourt -S libpng12 )
  3. Start firefox using this command: LD_PRELOAD=“/usr/lib/libpng12.so“ /usr/bin/firefox

For more comfort a i wrote myself an alias by editing .bashrc and adding this line:

alias quakelive="LD_PRELOAD=/usr/lib/libpng12.so /urs/bin/firefox"

by the next login the alias will be available and if you wish you can add an shortcut to your startmanu or panel etc.

usagehint: if an instance of firefox is already running you have to stop it first

Ähnliche Artikel:

XChat – Mehrere Befehle beim Verbinden

Ich bin im EuIRC unterwegs. Und da mich als Österreichischer AON Kunde der 8h Disconnect regelmäßig quält müsste ich mich biem Reconnect mit mehreren Befehlen zurückmelden um einerseits den Ghost zu entfernen, meinen nick wieder anzupassen und mich zu identifizieren.

Das ganze läuft so ab:

/ns ghost <nick> <password>
/nick <nick>
/ns identify <password>

XChat unterstützt standardmäßig jedoch nur ein Verbindungscommando, so dass hier ein kleiner Trick angewendet werden muss um ihm alle Kommandos einzubleuen. Als erstes legen wir eine Datei mit den Kommandos an:

$ vi ~/.xchat2/EUIRC.startup

In diese Tragen wir die obren Zeilen ein und ersetzen die Platzhalter dannach tragen wir im XChat unter dem Server das folgende Verbindungskommando zum ausführen des Dateiinhaltes ein

LOAD -e ~/.xchat2/EUIRC.startup

Tadaaa :D

EDIT: Arg da stand die längste Zeit ein falsches Kommando – und keiner sagt was ….

Ähnliche Artikel: