IMAP-Inbox von Thunderbird fixen
24. April 2020 um 13:00 Uhr von Atari-Frosch
Eine Nutzerin hatte ein IMAP-Postfach bei einem Provider A, das sie aber gekündigt hatte. Dann änderte sie die Zugangsdaten des Postfachs auf ihren neuen Mailprovider B, statt für diesen ein neues Postfach anzulegen. Thunderbird fand auf dem neuen Server natürlich nicht mehr die bisherigen Mails vor und ging einfach mal davon aus, daß diese – auch die lokalen Kopien davon – nicht mehr relevant seien. Well, Thunderbird irrte.
(Das hätte mir übrigens auch passieren können; ich benutze ja ausschließlich POP3-Postfächer, und da geht sowas tatsächlich, denn bei POP3 braucht Thunderbird ja keine korrespondierenden Abbildungen auf dem Mailserver.)
Damit ich mir das genauer ansehen konnte, hat mir die Nutzerin ihr gesamtes Thunderbird-Verzeichnis geschickt. Nach einer kurzen Inspektion war klar: Thunderbird hat die gesamte Korrespondenz aus diesem IMAP-Postfach auch nochmal lokal gespeichert. Damit hatte ich gleich eine gute Nachricht: Verloren ist nichts, Thunderbird zeigt die E-Mails nur einfach nicht mehr an.
Das ist beim „Verschwinden“ eines IMAP-Servers offenbar sein normales Verhalten, wie ich aus diversen Foren-Einträgen herauslesen konnte: Wenn die Mails nicht mehr auf dem IMAP-Server liegen, tut Thunderbird so, als seien sie überhaupt nicht mehr vorhanden, obwohl das nicht stimmt.
Daß der Donnervogel so seltsame Dinge macht, war mir schon 2011 aufgefallen: Thunderbird bringt den Müll nicht runter – offenbar hat sich daran nichts geändert, was hier natürlich von großem Vorteil ist. Mehr noch: Ich hatte in diesem Fall sogar darauf spekuliert, daß Thunderbird diese Eigenheit noch hat, und darauf, daß die Nutzerin das physische Löschen von als nicht mehr benötigt markierten E-Mails nicht konfiguriert hat, so wie ich damals. Zum Glück kam beides zusammen, sonst hätte man wirklich nichts mehr retten können.
Also hier zunächst einmal die funktionierende Lösung – und wenn ich nicht wie schon öfters zuerst um viel zu viele Ecken, also viel zu kompliziert, gedacht hätte, hätten wir es auch schneller haben können 🙂
Zuerst muß Thunderbird beendet werden, sofern er grade noch läuft, und es empfiehlt sich an dieser Stelle natürlich ein Backup, falls doch was schiefgehen sollte. Als nächstes geht man im Dateisystem in das Profilverzeichnis des Thunderbird und dort in das „kaputte“ IMAP-Verzeichnis. Dann verschiebt man die INBOX-Datei sowie alle weiteren Dateien, welche ebenfalls E-Mails enthalten, aus dem „kaputten“ IMAP-Postfach in das Verzeichnis „Local Folders“ im Profil-Verzeichnis des Thunderbird. Die INBOX-Datei benennt man dabei am besten um, zum Beispiel in Mailarchiv oder so; vor allem, wenn es im „Local Folders“ bereits eine INBOX-Datei gibt, die nicht die Länge 0 hat.
Die .mfs-Dateien aus dem Ursprungsverzeichnis sollte man nicht mitnehmen. Das sind auch nur Index-Dateien, die beim nächsten Aufruf von Thunderbird sowieso neu aufgebaut werden – man kann sie daher einfach löschen. Jetzt kann man den Thunderbird neu starten und sollte die verloren geglaubten E-Mails unten im Bereich „Local Folders“ stehen haben, in einem Verzeichnis mit dem Namen, in den die INBOX-Datei umbenannt wurde. In meinem Versuch waren die meisten dieser E-Mails dann als ungelesen markiert, aber das kann man ja für den gesamten Ordner auf einen Schlag ändern.
Hintergrund: Thunderbird interessiert sich im Bereich Local Folders nicht für irgendwelche Server, will also auch bei ursprünglicher Verwendung von IMAP nicht prüfen, ob der Server die entsprechenden E-Mails noch hat. Damit sind E-Mails, die einmal in die Local Folders gewandert sind, nicht mehr an den ursprünglichen Server gebunden, und es zählt nur die lokal eingestellte Haltezeit des jeweiligen Verzeichnisses.
Und dann natürlich: Regelmäßig Backup machen. Die Sicherung der E-Mails im lokalen Verzeichnis des Thunderbird schützt nicht vor einer kaputtgehenden Festplatte (oder welchen Datenträger Ihr halt so nutzt) oder einem zerschossenen Dateisystem auf dem Datenträger. Was nur einmal vorhanden ist, ist früher oder später halt einfach gar nicht mehr vorhanden.
Soweit zum praktischen Lösungsweg. Anzumerken bleibt aber noch, daß das auf Windows 10 und auf Devuan Linux funktionierte. Wenn eine Software, erst recht so ein doch etwas größerer Brocken wie Thunderbird, auf mehreren Plattformen parallel entwickelt wird, kann man sich ja nicht unbedingt darauf verlassen, daß alle Varianten in derselben Situation exakt gleich reagieren.
So. Ich erwähnte ja schon, daß ich mal wieder viel zu kompliziert dachte. Das waren meine vorherigen Schritte gewesen:
Das Thunderbird-Verzeichnis hatte ich am Karfreitag bekommen. Ich verglich als erstes die Mailheader der Inbox-Datei in dem „kaputten“ IMAP-Postfach mit denen in den POP3-Postfächern meines eigenen Thunderbird und stellte fest, daß es da tatsächlich Unterschiede gibt. Bei meiner eigenen Thunderbird-Installation habe ich über jeder Mail diese Header stehen:
From - Sun Apr 10 09:59:02 2011 X-Account-Key: account10 X-UIDL: 00001b664ce7f5b3 X-Mozilla-Status: 0001 X-Mozilla-Status2: 00000000 X-Mozilla-Keys:
Der Zeitstempel in der ersten Zeile entspricht dabei dem im Date:-Header, nur leicht anders formatiert und in UTC.
Bei ihr sieht das allerdings bei allen Mails in der INBOX so aus:
From
– ein leeres „From “ mit einem folgenden Leerzeichen, und dann geht schon der reguläre Mailheader los.
Und in ihrem Trash, der mangels Konfiguration des Löschverhaltens auch noch gut gefüllt war, sieht das bei jeder Mail so aus:
From - Thu Feb 09 17:33:45 2017 X-Mozilla-Status: 0001 X-Mozilla-Status2: 00000000
Es fehlen im Vergleich zu den Einträgen bei mir also X-Account-Key und X-UIDL (X-Mozilla-Keys ist sowieso optional). Ich fand heraus: X-Mozilla-Status: 0001 soll eigentlich dafür stehen, daß die Mail anzuzeigen ist. Da die Mails in der Inbox gar keine X-Mozilla-Header (mehr?) haben, vermutete ich, daß Thunderbird damit möglicherweise gar nichts mehr anzufangen weiß. Des weiteren vermutete ich, daß die entsprechenden Informationen jeweils auf dem IMAP-Server liegen – der ja nicht mehr da ist.
Ich suchte erst einmal eine Auflistung für diese Thunderbird-eigenen Header und ihre Werte. Bisher fand ich aber nur in einem älteren Forumsbeitrag einen Link zu einer solchen Liste, der nicht mehr funktioniert.
Am meisten versprach ich mir von dieser Lösung: Emails disappeared from Inbox, “repair folder” doesn’t help – also: Zunächst in jede E-Mail der Inbox X-Mozilla-Status: 0001 einfügen. Da diese INBOX mit ca. 1,2 GB doch etwas größer ist, wollte ich das mit einem Python-Script bewerkstelligen. Bei der Gelegenheit wollte ich auch gleich diesen From-Header durch das Datum aus dem Date:-Header ergänzen. Dann wollte ich Inbox umbenennen und – ohne die dazugehörige .mfs-Datei – in die Local Folders des vorhandenen Thunderbird-Verzeichnisses verschieben. Das Ergebnis wollte ich dann einem frisch installierten Thunderbird unterschieben und schauen, was passiert.
Erst nach etwas Recherche fand ich heraus, daß der Zeitstempel nach dem „From “ optional ist. Wichtig ist das „From “ (mit dem folgenden Leerzeichen) an sich, denn das ist für Thunderbird der Trenner zwischen den einzelnen E-Mails. Mit diesem Zeitstempel müßte ich mich also überhaupt nicht aufhalten, sondern könnte mich direkt darum kümmern, den Status-Header einzufügen.
Das wird einfach – dachte ich. Und tippselte folgendes Python-Script:
#!/usr/bin/env python3 origfile = "INBOX" f = open(origfile, "r") inbox = f.read() f.close() singlemails = inbox.split("From ") # separate the whole inbox into single emails outputfile = "INBOX.new" out = open(outputfile, "w") for mail in singlemail: out.write("From ") out.write("X-Mozilla-Status: 0001") out.write(mail + "\n") out.close()
Ätsch, sagte Python:
:~/prog/savemails$ ./savemails.py Traceback (most recent call last): File "./savemails.py", line 5, in <module> inbox = f.read() File "/usr/lib/python3.5/codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfc in position 248955273: invalid start byte
So geht dat nich'. Was ich übersehen hatte, wurde mir auch schnell klar: Die E-Mails haben unterschiedliche Zeichencodierungen; ein Teil ist wie zu erwarten in UTF8, aber da gibt es auch welche in ISO-8859-1 bzw. -15 und möglicherweise noch einzelne in ganz anderen Zeichensätzen. Und sobald ein Zeichen auftaucht, das mit UTF8 nicht decodierbar ist, fällt der Python-Interpreter bereits beim Einlesen auf die Nase.
Ich las mir in der Python3-Doku die Beschreibungen für die Module email und mailbox durch. Ersteres, so hatte ich das zumindest verstanden, bearbeitet nur einzelne E-Mails, keine ganzen mbox-Dateien. Beim zweiten habe ich keine Möglichkeit gefunden, vor jeden Header eine weitere Zeile einzufügen.
Damit steckte ich erstmal fest, und wenn ich in Python feststecke, frage ich Bison vom Chaosdorf, von dem ich Python gelernt habe. Der riet mir dazu, die Datei als Binärdatei einzulesen oder, noch besser, eine mail-library zu nehmen. Naja, mit den beiden, die ich gefunden habe, scheint das ja nicht zu funktionieren. Oder ich scheiterte mal wieder an meiner Unfähigkeit, abstrakte Beschreibungen aus der Doku auf das konkrete Problem zu übertragen.
Am Ostersamstag war ich nicht fit genug, um da direkt noch mal ranzugehen. Und am Ostersonntag hatte ich dann die Idee, es einfach mal damit zu versuchen, die INBOX, wie in der ursprünglich gefundenen Anleitung beschrieben, aber ohne Nachbearbeitung, unter anderem Namen in die Local Folders meines Thunderbird zu kopieren (natürlich mit vorher beendetem Thunderbird). Und siehe da: Über 4.000 E-Mails standen nach dem erneuten Start da und guckten mich unschuldig und ungelesen an. 😉
Nach dem Beenden des Thunderbird schaute ich dann nochmal auf Dateisystem-Ebene nach. Thunderbird hatte wie erwartet eine .mfs-Datei angelegt. Noch spannender: Die umbenannte INBOX-Datei war nicht angefaßt worden. Die Mails hatten also nicht den angeblich unbedingt erforderlichen X-Mozilla-Status:-Header bekommen. Und trotzdem funktioniert es.
Wieder was gelernt.
Heute bekam ich dann die Rückmeldung der Nutzerin, daß es auch bei ihr unter Windows funktioniert hat. 👍
24. April 2020 at 17:40
Also ich hab sowas immer bisher gemacht indem ich im Ziel-Profil einen neuen Ordner erstellt habe für denn dann automatisch eine Datei für die Mails und eine Index-Datei erstellt wurde. Dann hab ich den Thunderbird einfach geschlossen, die Datendatei sowie den Index gelöscht und die Datei die ich aus einem anderen Profil oder anderen Ordner unter dem neuen Namen finden wollte dann dort hinkopiert und ihr den Namen der gelöschten Datei gegeben. Dann hat Thunderbird noch beim erstmaligen Anklicken des Ordners seinen Index aufgebaut und alles war geritzt. Irgendwelche Anpassungen an zusätzlichen Headern waren bisher nie nötig.
25. April 2020 at 2:24
Kleiner Tip, wenn du eine einfache Möglichkeit suchst um in E-Mails einzelne Header zu löschen, einzufügen oder zu verändern:
Zusammen mit procmail kommt ein kleines Tool mit dem Namen formail; mit dem Tool lassen sich beliebige Mail Header von der Kommandozeile aus bearbeiten … und wenn es etwas komplexer sein darf, einfach formail in ein Shell Script packen und die Kommando Parameter dynamisch erzeugen.
(Randbemerkung: statt Shell Script kann man natürlich auch Python verwenden und von dort formail aufrufen – komplexe Shell Scripte mag ja nicht jeder)
25. April 2020 at 13:49
@Olli: Mit IMAP-Konten? Bei POP3 sollte das funktionieren (da kann man aber auch direkt den neuen Server eintragen). Aber IMAP erwartet, daß die Mails auch auf dem Server vorhanden sind. Außer eben in den Local Folders.
@SackOhneSenf: Danke, aber das Schöne hier ist ja, daß das gar nicht notwendig war. 🙂
26. April 2020 at 19:24
Ok, da hast Du wohl recht, Frosch. Allerdings kann man das wie besagt in einen lokalen Ordner packen und von da aus in einen IMAP-Ordner kopieren oder verschieben; ist eben nur echt langsam, bei mir mit Google Mail ca. eine Mail pro Sekunde.
27. April 2020 at 1:47
@Frosch: Ja, der Tip bezog sich ausschließlich auf das Bearbeiten von Mail-Headern. Die Funktion benötigt man hin und wieder mal aus unterschiedlichen Gründen.
Für das „Umziehen“ von IMAP Mails bevorzuge ich eine von zwei Verfahren:
– erst neuen IMAP Account anlegen und eintragen, dann von altem Account die Nachrichten auf den neuen Account verschieben. Benötigt halt gleichzeitigen Zugriff auf beide Accounts/Server.
– oder alten Account öffnen und alle Mails in den IMAP Ordnern exportieren (Exportfunktion sollte auch Thunderbird haben). Die Export Funktion schreibt in aller Regel eine große MBOX Datei. Viele Mail Programme können eine solche Datei auch importieren und in einen IMAP Account verteilen. Ansonsten gibt es für den Upload verschiedene Tools (MBOX -> IMAP).
Beides erfordert halt erst zu denken und zu handeln, bevor man den Zugriff auf den IMAP Account verliert.