blog · git · desktop · images · contact


POP3 ersetzt durch rsync über SSH

2017-10-11

POP3 habe ich jetzt benutzt, seit ich E-Mail kenne. Die Sache ist einfach die: Ich will nicht, dass mein Mailserver über längere Zeit irgendwelche E-Mails aufbewahrt. Der soll sie einfach nur temporär vorhalten, bis ich sie abgeholt habe. Mit POP3 kann ich genau das machen. Server im Internet habe ich generell möglichst „dumm“ und möchte nicht, dass sie der primäre Speicherort wichtiger Daten sind. Ich will sie möglichst leicht wegwerfen und mithilfe von Config Management neu wieder hochziehen können.

Ich habe zwar mehrere Clients (aber kein Smartphone), trotzdem brauche ich kein IMAP und will es auch nicht. E-Mail verteile ich lokal, sobald sie vom Server abgeholt ist. Das mache ich … über ein Git-Repo:

Es ist schon ein wenig eigenartig, das gebe ich zu. Ich kenne auch niemanden sonst, der das so macht. Für mich funktioniert es aber hervorragend und ich mache das jetzt seit fast acht Jahren auf diese Weise.

Es gibt drei Hauptgründe dafür:

POP3 loswerden

Kürzlich habe ich meinen Server neu aufgesetzt, weil ich von Arch Linux zu OpenBSD gewechselt habe. Das ist eine andere Geschichte und immer noch ein bisschen experimentell. Bisher gefällt mir OpenBSD aber sehr gut und ich bin zufrieden damit.

OpenBSD hat OpenSMTPD an Bord im Basissystem. Benutze ich, mag ich. Es ist aber kein POP3-Daemon im Basissystem, auch kein IMAP-Daemon. Die Jungs vom OpenSMTPD schlagen Dovecot vor. Das ist ein guter Server, ich kannte ihn aber schon und wollte etwas Neues ausprobieren. Außerdem ist er nicht im Basissystem enthalten.

rsync ist auch nicht im Basissystem, aber das Tool brauche ich so oder so.

Warum also nicht die E-Mails mit rsync über SSH abholen … ?

Die Eigenschaften des Maildir-Layouts ausnutzen

Das Maildir-Layout ist recht einfach, aber mächtig:

home
└── user
    └── Maildir
        ├── cur
        ├── new
        └── tmp

Jede E-Mail ist eine eigene Datei. Existierende Mail wird in „cur“ gespeichert. Der interessante Teil ist, wie neue E-Mails „entstehen“ und gespeichert werden.

Zuerst wird ein eindeutiger Dateiname gewählt. Der enthält oft die PID des ausführenden Programms und einen Timestamp. Diese neue Datei wird in „tmp“ erzeugt. Dort bleibt sie auch, während noch Daten in sie geschrieben werden. Sobald das Schreiben fertig ist, wird sie nach „new“ verschoben.

Das Umbenennen einer Datei ist überlicherweise eine atomare Operation. Das heißt, falls eine Datei in „new“ liegt, dann ist es eine vollständige E-Mail – und keine halb geschriebene Datei.

Das kann man sich auch sehr schön im Quellcode vom OpenSMTPD anschauen:

Beginnend in Zeile 117 in delivery_maildir.c.

Das bedeutet, dass ich einfach einen Cronjob auf meinen Clients einrichten kann, der alle Dateien aus „new“ abholt – mit rsync über SSH.

Obacht: Dieser Ansatz bricht mit der Atomizität. rsync kopiert eine Datei zum Client und entfernt sie danach vom Server. Sollten also mal zwei Clients gleichzeitig ankommen, so könnte es passieren, dass sie dieselbe Datei abrufen würden. Andererseits hatte ich dieses Problem mit POP3 auch schon, weshalb ich damals schon den Workaround gebaut habe: Der Cronjob pingt einfach vorher alle anderen möglichen Clients an und verweigert bei einer Antwort das Abrufen. Funktioniert hinreichend gut. (Ja, meine Clients sind immer alle im lokalen Netz oder ich bin mit dem Notebook unterwegs und dann läuft daheim nichts anderes.)

Parallelisierung

Es gibt mehr als ein Maildir auf meinem Server. Eigentlich sind es derzeit sogar 17 Stück. Sie sind aber alle unabhängig voneinander, also kann ich einfach mehrere rsync-Clients gleichzeitig starten. Einen pro Mailbox.

Meine 17 Boxen abzurufen, dauert etwa eine Sekunde. Das ist viel schneller als mein altes Setup mit POP3.

Mit IMAP vergleiche ich das an dieser Stelle aber nicht. IMAP funktioniert anders und kennt auch sowas wie „push“.

Fazit

Natürlich funktioniert dieser Ansatz nur, weil ich ohnehin SSH-Zugriff zu meinem Server habe und weil ich Maildirs auf meinen Clients einsetze. Viel Spaß dabei, wenn man sowas mit Thunderbird oder einem Smartphone machen möchte.

Ist insgesamt noch so eine Eigenart meines Setups. Ich frage mich, ob das noch jemand anders da draußen so macht.

Comments?