Ich habe Apple ja inzwischen schon schwer satt, auch wenn ich jahrelang treuer Mac OS X Nutzer war. Heute hat diese Firma allerdings noch einen drauf gesetzt was Ihr negatives Ansehen bei mir angeht.
Ich wollte meine Mailarchive durchsuchen und mir fiel dabei auf, dass ich die ganzenn alten Mails noch gar nicht alle auf meine aktuelle Linux Installation migriert hatte. Nachdem ich dann also die alten Dateien von einem Backup meines eingemotteten iMac extrahiert hatte, stand ich vor dem Problem, dass Apple Mail die Mails nicht mehr im gewohnten Format von viel Früher [tm] gespeichert hat, sondern mit Mail V2.0 auf ein neues Mailboxformat umgestellt hat.
Sämtliche Versuche mit frei verfügbarer Konversionssoftware und Importiertools schlugen fehl. Nicht mal mit einer laufenden Apple Mail Version habe ich die Mails noch importiert bekommen, um sie über Umwege aus einer aktiven Mail Installation in ein verwertbares Format zu extrahieren, anscheinend speichert Apple die Mails inzwischen Hostabhängig, der Host wird hierbei offenbar mit einem Hashwert in der Verzeichnisstruktur repräsentiert. Die Mail-eigene Importfunktion für das Hausformat versagte vollends und ließ nur leere Verzeichnisse entstehen.
Ich habe dann nicht weiter gefackelt und habe mir mal wieder selbst beholfen. Die einzelnen Mails sind in *.emlx Dateien gespeichert, von denen beginnt jede mit einer Zeile, die nur eine Zahl enthält. Danach kommt die Mail mit allen Headern im Klartext. Abschließend gibt es noch einen XML-Block, der Metainfos zur Mail enthält.
Man muss also nur die Zahl am Anfang entfernen, den XML-Block wegwerfen und dann alle Mails hintereinanderhängen, um mit minimalen Zusatzinfos (der From-Zeile und ein paar Leerzeilen) eine mbox Datei aus den ganzen Mails zu zaubern. Ein schnelles Perl Script als Filter erledigte das Umschreiben der einzelnen Mails:
#!/usr/bin/perl
use strict;
# Wurde der XML Block gefunden? Dann $xmlfound=1
my $xmlfound=0;
# speichert die relevante Mail für die Ausgabe
my $mail="";
# erste Zeile ignorieren
my $firstnumber=<>;
# speichert Datum und Sender für die einleitende From-Zeile des mbox Formates
my $date="";
my $sender="";
# solange der XML-Block nicht gefunden wurde:
while($xmlfound==0) {
# Lese die nächste Zeile aus stdin
my $momline=<>;
# ist die aktuelle Zeile der Beginn des XML-Blocks? Dann bereite das Aussteigen aus der Schleife vor
if ($momline=~/[<][?]xml/) { $xmlfound=1; }
else {
# From: Header als Absender auslesen
if ($momline=~/^From:.*<(.*)>/) {
$sender=$1;
}
# Date: Header als Absendedatum einlesen
if ($momline=~/^Date: (.*)$/) {
$date=$1;
}
# Sollte im Text ein Klartext "From" am Zeilenanfang stehen,
# stelle ein '>' voran, um das mbox format nicht zu durchbrechen.
# speichere die aktuelle Zeile im Mailbuffer.
if ($momline=~/^From .*$/) {
$mail.=">".$momline;
} else { $mail.=$momline; }
};
};
# Stelle die From Zeile voran...
print("From ".$sender." ".$date."\n");
# ...gib die relevante Restmail aus...
print($mail);
# ...und schließe die Mail sicherheitshalber noch mal mit expliziter Newline ab.
print ("\n");
(Jaaaajaaa, der Code ist ineffizient, aber das ist Fire-and-forget-Code, der muß exakt einmal funktionieren und fliegt dann in die Tonne. Bei anderen Projekten schreibe ich besseren Code. 😉 )
Jetzt wechselt man in das Verzeichnis, in deren Unterverzeichnissen man alle vorhandenen *.emlx Files konvertieren will und filtert z.B. so (für die bash):
for mailx in $(find -type f | grep [.]emlx$); do cat $mailx | ~/bin/emlx-filterpl >> 'Inbox-2006.mbox'; done;
Jetzt hat man im aktuellen Verzeichnis eine Datei (im obigen Beispiel Inbox-2006.mbox), die man problemlos in Thunderbird installieren kann. Ich habe dazu das ImportExportTools-Addon benutzt. Nach extrem kurzer Laufzeit hatte ich >3Gb an Mailarchiven importiert. ich hoffe, ich kann mit dem Skript anderen in meiner Situation die Nerven ersparen, die mich dieser Nachmittag gekostet hat. 😉