sphings-dev.de

AmberChest: IMAP-Postfächer als einfache .eml-Dateien sichern

Der Anbieter kann Mails verlieren, ein Konto kann gesperrt werden, ein Passwort gestohlen, eine Synchronisation schiefgehen. Eine Sicherung auf der eigenen Platte, in einem Format, das jedes Mailprogramm lesen kann, ist die einzige Kopie, die einem wirklich gehört. Dafür ist AmberChest gedacht. Die Versionen 1.1.0 bis 1.2.0, um die es hier geht, erschienen noch unter dem Namen Mail Archiver; mehr zur Umbenennung steht im Beitrag zu AmberChest 2.0.

Das Prinzip

AmberChest lädt ein IMAP-Postfach herunter und lässt es auf dem Server so zurück, wie es war. Ordner werden schreibgeschützt geöffnet, Nachrichten mit BODY.PEEK abgeholt – dem IMAP-Befehl, der eine Mail liest, ohne das \Seen-Flag zu ändern. Gelöscht wird dort nichts. Lokal entsteht pro Nachricht eine .eml-Datei im Ordnerbaum des Postfachs, lesbar mit Thunderbird, Apple Mail, Outlook und allem, was RFC 5322 versteht. Gesichert wird inkrementell; eine Mail, die man auf dem Server in einen anderen Ordner verschiebt, wird lokal ebenfalls verschoben, noch bevor ein Byte ihres Inhalts abgerufen wird. Ein Journal je Ordner erlaubt es, den Index allein aus den Dateien neu aufzubauen. Die Zugangsdaten verschlüsselt ein Master-Passwort mit scrypt und AES-256-GCM.

Es gibt eine Desktop-App für macOS, Windows und Linux und einen Docker-Container mit derselben Weboberfläche, dazu einem Zeitplaner.

Postfach-Browser, Filter, Handy

Mit 1.1.0 kam ein Postfach-Browser: links Konten und Ordnerbaum, rechts die Nachrichten des gewählten Ordners, direkt aus dem lokalen Index, also ohne Verbindung zum Server. Die Suche bekam Filter für Empfänger, eine Einschränkung auf ein Feld (Betreff, Absender, Empfänger, Text oder nur Anhangsinhalt), „nur ungelesen“, „nur markiert“, „auf dem Server gelöscht“, einen Größenbereich und Sortierung nach Relevanz, Datum oder Größe; dieselben Filter gelten für den Export und das MCP-Werkzeug.

Postfach-Browser mit Konten und Ordnerbaum links und der Nachrichtenliste rechts, dunkel und hell nebeneinander
Der Postfach-Browser, im dunklen und hellen Erscheinungsbild (Illustration).

Außerdem lässt sich ein bereits vorhandenes Archiv nachträglich verschlüsseln. Bisher betraf das Einschalten nur neu geladene Mails; jetzt werden die vorhandenen Dateien umgewandelt, Datei für Datei, und auf Wunsch zurück. Jede Datei wird unter einem Temporärnamen geschrieben und über das Original umbenannt, ein abgebrochener Lauf hinterlässt also die alte oder die neue Datei, nie eine halbe. Die Weboberfläche ist eine Progressive Web App und lässt sich auf dem Handy zum Home-Bildschirm hinzufügen.

Eine Panne gehört dazu: Die Oberfläche von 1.1.0 startete nicht. Eine Versionskonstante wurde aus dem Kernpaket importiert, das für Node geschrieben ist, und der Wert-Import zog node:os in das Browser-Bundle. 1.1.2 schreibt die Version wieder als Literal. Von diesem Release rate ich inzwischen ab.

1.2.0: Anmeldung per Token, Prüfung, Umzug

OAuth für Gmail und Microsoft 365. Beide nehmen für IMAP kein Passwort mehr an. Microsoft wird mit einem Gerätecode verbunden, den man auf einem beliebigen Gerät eingibt; Gmail geht einmal durch den Browser, entweder von der Desktop-App selbst abgefangen, durch Zurückkopieren der Adresse oder über eine öffentliche Rückleitung. Der Token wird vor jeder Verbindung erneuert, die nächtliche Sicherung läuft also unbeaufsichtigt weiter. Den Client registriert man einmal je Anbieter in den Einstellungen; einen gemeinsamen gibt es nicht, weil keiner der beiden Anbieter einer nicht verifizierten Anwendung so weitreichenden Postfachzugriff gibt.

Das Archiv prüfen. Jede Nachricht trägt nun die Prüfsumme dessen, was vom Server kam (der Nachricht, nicht der Datei, sie überlebt also auch eine Verschlüsselung des Archivs). Eine Prüfung liest jede Datei, vergleicht sie, findet Dateien, die der Index nicht kennt, und fragt auf Wunsch den Server, wie viele Nachrichten jeder Ordner enthält. Letzteres beantwortet die eigentliche Frage: Fehlt etwas? Das geschieht mit einem STATUS je Ordner, ohne Nachrichteninhalte, und es wird nichts ins Archiv geschrieben oder gelöscht.

Dialog zum Prüfen des Archivs mit Zahlen und drei Befunden, dunkel und hell nebeneinander

Das Archiv umziehen. Ein Archiv, das auf dem Desktop angefangen hat, gehört irgendwann auf den Server. Die Dateien werden an eine andere Instanz geschickt, die ihren Index aus dem Journal jedes Ordners aufbaut. Ein unterbrochener Umzug ist harmlos, ein zweiter Lauf überträgt nur das Fehlende, und die erste Sicherung drüben lädt nichts herunter. Dasselbe passiert auch ohne Umzug, wenn man eine verlorene Index-Datenbank aus den Dateien wiederherstellt.

Gmail: eine Nachricht, mehrere Ordner. Gmail zeigt jede Mail in ihrem Ordner und in „Alle Nachrichten“, im Archiv läge sie doppelt. Pro Konto einschaltbar wird das Duplikat am Umschlag erkannt, bevor etwas geladen wird: Beide Ordner zeigen die Nachricht weiter, die Bytes gibt es einmal. Ein Beispiel dazu: sechs Dateien mit 1080 Bytes ohne, drei Dateien mit 540 Bytes mit der Option.

Dazu kommen ein Schutzdatum („Älteres nie löschen ab“), damit man das Postfach auf dem Server leeren kann, während das Archiv es behält, eine Statistik (Nachrichten je Jahr, häufige Absender, größte Ordner und Nachrichten, Anhänge nach Typ), ein Register als index.html je Ordner, das das Archiv ohne AmberChest im Browser lesbar macht, ein Speicherplatz-Wächter mit zwei Grenzen (warnen, und anhalten statt die Platte vollzuschreiben) und Benachrichtigungen an jede Adresse, die einen POST annimmt: ntfy, Gotify, Discord, Apprise. Behoben wurde, dass ein Patch auf eine Einstellung alle anderen Abschnitte auf die Voreinstellung zurücksetzte; ein Themenwechsel konnte so den Archivpfad, den MCP-Token oder die MQTT-Zugangsdaten löschen.

Home Assistant

AmberChest kann den Zustand jedes Kontos auf einem MQTT-Broker veröffentlichen; Home Assistant legt die Entitäten per Discovery an. Wer keinen Broker betreibt, nimmt die Integration in Version 1.0.0. Sie ist eine echte Home-Assistant-Integration, die direkt mit der HTTP-Schnittstelle der Instanz spricht – lokal, ohne Cloud und ohne Broker. Je Postfach entsteht ein Gerät mit der Zahl der Nachrichten, der Archivgröße, den Ordnern und dem Zeitpunkt der letzten Sicherung, dazu ein Binärsensor, der während einer Sicherung an ist (mit Ordner und Fortschritt als Attribute), und Knöpfe zum Starten und Abbrechen. Ein Gerät für die Instanz zeigt die Gesamtgröße und die nächste geplante Sicherung, wofür die Integration Version 1.1.0 der Anwendung braucht.

Die AmberChest-Karte mit zwei Postfächern, ihren Nachrichtenzahlen, Größen und einem Knopf zum Sichern, daneben ein Beispiel für eine Automatisierung

Die mitgelieferte Lovelace-Karte listet alle Postfächer mit einem Sicherungsknopf und wird als Ressource automatisch registriert. Sitzungstoken erneuert die Integration selbst, ein Neustart der Instanz verlangt also keine Handarbeit. Oberfläche und Entitäten gibt es auf Deutsch und Englisch. Praktisch ist eine Automation, die meldet, wenn die letzte Sicherung den Status failed hat:

automation:
  - alias: Mail-Sicherung fehlgeschlagen
    triggers:
      - trigger: state
        entity_id: sensor.privat_letzte_sicherung
        attribute: status
        to: failed
    actions:
      - action: notify.mobile_app
        data:
          message: "Die Mail-Sicherung ist fehlgeschlagen"

Installation

Die Installer der Desktop-App liegen auf der Releases-Seite. Als Container reicht das Image ghcr.io/sphings79/amberchest:latest mit einem Volume für /config und eines für /archive; Master-Passwort, Passwort der Oberfläche, Cron-Ausdruck und Zeitzone werden über Umgebungsvariablen gesetzt. Die Integration wird in HACS als benutzerdefiniertes Repository eingetragen. Unter Home Assistant OS gibt es außerdem ein eigenes Add-on, das in einem eigenen Beitrag beschrieben ist.

Tags

Zu den Projekten

  • AmberChest

    IMAP-Postfächer als einfache .eml-Dateien sichern: nur lesend, inkrementell, mit dem Ordnerbaum des Postfachs. Desktop-App für macOS, Windows und Linux sowie Docker-Container mit derselben Oberfläche.

    AppVersion 2.1.0github.com/sphings79/amberchest

  • AmberChest für Home Assistant

    Home-Assistant-Integration für AmberChest: ein Gerät je Postfach mit Nachrichten, Archivgröße und letzter Sicherung, Knöpfe zum Starten und Abbrechen und eine Lovelace-Karte. Lokal über HTTP, ohne Cloud und ohne MQTT-Broker.

    HACSVersion 2.0.0github.com/sphings79/amberchest-home-assistant

Unterstützen

Diese Tools entstehen in meiner Freizeit und bleiben kostenlos, offen und cloud-frei. Wenn dir eins davon einen Nachmittag gespart hat, freue ich mich über einen Kaffee oder ein Stück Pizza.

Kaffee oder Pizza

Weitere Beiträge