trueten.de

"Eigentum ist Diebstahl!" Pierre-Joseph Proudhon

Mailserverumzug

Nach einigen Jahren stand ein Umzug des Mailservers an. Hier läuft das Gespann Postfix / Cyrus / Sieve / SpamAssassin / DCC / Phyzor / Razor sowie, der Vollständigkeit halber, der freie Virenscanner ClamAV, natürlich in der aufgebohrten Version, mit drastisch gesteigerter Erkennungsrate. Diese Kombination sorgt bei uns zusammen mit ein bisschen weiteren Kleinkram, den ich hier nicht erwähne, seit Jahren dafür, daß Probleme mit Mails oder Viren praktisch gar nicht bzw. im Fall von Spam nur sehr vereinzelt auftreten.

Die Einarbeitungskurve ist bei den genannten Servern natürlich nicht gerade flach, zahlt sich jedoch durch Stabilität und Zuverlässigkeit über Jahre aus. (So  habe ich heute noch ein paar Mails, die ich, falls mein Blutdruck mal wieder im Keller ist, hervor krame, um mich mal wieder so richtig auzuregen ;-) )

Den mit Abstand größten Aufwand gibt es immer mit dem Cyrus IMAP Server, der sehr stabil läuft, aber auch sehr empfindlich und wenig aussagekräftig bei Fehlern reagiert. So ist zum Beispiel die richtige Einrichtung von Zertifikaten nicht immer ganz trivial. Deswegen getreu dem Motto: Never touch a running System nur Sicherheitsupdates und Parallelbetrieb bei notwendigen größeren Upgrades, um mögliche Ausfälle möglichst gering zu halten. Zwar gibt es immer auch aktuelle Backups, bei Konfigurationsänderungen wegen neuen Features hilft das wenig.

Nachdem also jetzt alles entsprechend zusammengebaut ist, kommt der Streßtest: Import sämtlicher Postfächer aus dem alten in den neuen IMAP Server, Dank der Kombination mit Sieve werden die Mails auch gleich in die entsprechenden automatisch angelegten Ordner einsortiert. Den Importvorgang erledigt imapsync, ein perl Script, das ich aus einer Handvoll Möglichkeiten herausgepickt hatte. Das Script fragt alle möglichen IMAP Postfächer, z.B. Google, GMX, bzw. die jeweils zugrunde liegenden Server wie Courier, Cyrus und wie sie alle heißen, ab und spricht direkt den gewünschten Zielserver an. Gestartet werden kann das Script auf irgendeinem Terminal.

Vor der Installation von imapsync müssen eine Reihe weiterer Bibliotheken und Perl Module installiert werden, zum Beispiel bei dem betreffenden Server, der mit Debian Jessie läuft:

sudo apt install \
 libauthen-ntlm-perl \
 libcgi-pm-perl \
 libcrypt-openssl-rsa-perl \
 libdata-uniqid-perl \
 libfile-copy-recursive-perl \
 libio-socket-inet6-perl \
 libio-socket-ssl-perl \
 libio-tee-perl \
 libhtml-parser-perl \
 libmail-imapclient-perl \
 libparse-recdescent-perl \
 libmodule-scandeps-perl \
 libreadonly-perl \
 libterm-readkey-perl \
 libtest-mockobject-perl \
 libtest-pod-perl \
 libunicode-string-perl \
 liburi-perl \
 libwww-perl \
 make \
 cpanminus

Sobald cpanminus installiert ist, wirft man darüber weitere Module ins System, um die Voraussetzungen für das in Jessie nicht vorhandene Perl Modul Mail::IMAPClient zu installieren:

cpanm Sys::MemInfo

Danach dann:

sudo cpanm Mail::IMAPClient

Sodann kann man für die 2 Faktor Authentifizierung, die im übrigen sehr empfehlenswert ist, das XOAUTH2 Modul installieren:

sudo cpanm JSON::WebToken

Dann kann man endlich dazu übergehen, imapsync selber zu installieren, holen kann man das als normaler User, was natürlich generell empfehlenswert ist:

wget -N https://imapsync.lamiral.info/dist/imapsync

Man macht dann das Script lauffähig:

chmod +x imapsync

Probiert, ob alles geklappt hat:

./imapsync

Und installiert es schließlich an einem beliebigen Ort, hier bei mir immer im lokalen Scriptverzeichnis:

sudo cp imapsync /usr/local/bin/

Die eigentliche Benutzung des imapsync Scriptes ist in der Dokumentation ausführlich beschrieben. Ich setze hier nur eine einfache Variante ein, das Script kann von einem X-beliebigen USer verwendet werden:

/usr/bin/imapsync --host1 imap.gmail.com --user1 karl.napf@googlemail.com --passfile1 ~/secret1 --gmail1 \
--host2 imap.gmx.net --user2 karl.napf@gmx.net --passfile2 ~/secret2 --automap


Das bedeutet, von links nach rechts gelesen: imapsync holt bei Google mit der Userkennung karl.napf@googlemail.com und dem in der Datei ~/secret1 gespeicherten Passwort sowie für Google empfohlenen weiteren Einstellungen die Mails aus dem Postfach und schiebt sie in das GMX Postfach von karl.napf@gmx.net, mit dem in der Datei ~/secret2 gespeicherten Passwort. Der Parameter ermöglicht meiner Erfahrung nach recht zuverlässig das korrekte Mapping bzw. richtige Einsortieren der Mails in die einzelnen Postfächer, jedoch nur die Standards, also Posteingang / INBOX, Gesendet / SENT, Papierkorb / Trash etc.

Weitergehende Sortierung geht über entsprechende regex Filter, die mit imapsync verwendet werden könenn, die bei unserem Server jedoch nicht nötig waren, da die bereits durch jeden User benutzen sieve Filter entsprechend der jeweiligen Bedürfnisse einsortiert werden.

Mailrouting mit Postfix

Ab und zu versende ich größere Dateien, für die ich einen anderen Mailserver verwende. Ebenso geht Spam, der nicht erkannt wurde direkt an ein Lernscript, das spamassasin auf dessen zukünftige Erkennung trainiert. Dazu verwende ich dann jeweils andere Empfägeradressen: Spam geht beispielsweise an spam@mailempfängerdomain_2, Mail an Nutzer im Intranet an mailempfängerdomain_1. Der Rest der Welt wird über smtp_Server_3 mit meinen Erkenntnissen versorgt ;-)

Diese Verteilung bzw. Routing unterschiedlich addressierter Mail funktioniert mit Postfix ziemlich einfach:
Datei /etc/postfix/transport mit folgendem Inhalt anlegen:

# /etc/postfix/transport
# Mails für alle Empfänger in *.mailempfängerdomain_1 gehen über smtp_Server_1
.mailempfängerdomain_1 smtp:smtp_Server_1
# Mails für alle Empfänger in mailempfängerdomain_2 gehen über smtp_Server_2
mailempfängerdomain_2 smtp:smtp_Server_2
# Der Rest geht hierhin
* smtp: smtp:smtp_Server_3


/etc/postfix/main.cf um folgende Einträge ergänzen:

# /etc/postfix/main.cf
# Alle Domains eintragen, für die geroutet wird:
relay_domains = mailempfängerdomain_1, mailempfängerdomain_2
# Routing
transport_maps = hash:/etc/postfix/transport


Anschließend die Befehle ausführen:
postmap /etc/postfix/transport
postfix reload


Logfiles kontrollieren, fertig.