Zu einem modernen Mailserver Setup gehören sichere Verschlüsselung, Spam-ausweichende Maßnahmen und IMAP-Zugriff. Meiner Meinung nach aber auch eine automatische, serverseitige Filterung und Sortierung (sieve) von Mails.
Zwar habe ich das Setup zu Debian Jessie Zeiten einmal komplett neu aufgesetzt und vorhandene E-Mail Accounts portiert, dennoch blieb die grundlegende Funktionsweise stets unverändert.
Das neue Setup habe ich grob anhand dieses howtos realisiert und nutze dovecot als lda und sieve mail filter.
Nun habe ich – durch zunehmende Mailbelästigung – die Notwendigkeit gesehen, immer unzuverlässiger funktionierenden Filterregeln wieder Ordnung zu bringen. Auch sind mir in den letzten Wochen viel zu viele Spam-Mails in meine Inbox gekippt worden.
Problem 1: Spam
Hierzu einen neuen Ordner erstellen und möglichst viel (aktuellen) Spam aus der Inbox hierhin verschieben. Das ist ein sehr nerviger und manueller Vorgang, aber einmal angelernt wird die Spamflut schlagartig weniger. Zum Antrainieren nehmen wir einfach den kompletten Inhalt des ‘Spam’ Ordners und werfen ihn sa-learn im Terminal des Servers zum Training vor:
# sa-learn --spam /var/vmail/commander1024.de/commander/Maildir/Training/Spam/*
Code-Sprache: PHP (php)
Es macht durchaus ebenso Sinn, auch valide Mails als Ham anzulernen, um die Qualität der Spam-Scores zu verbessern. Hierzu wird –spam durch –ham ersetzt.
Fertig. Nun wird die zukünftige Spamflut schon deutlich geringer ausfallen. Newsletter und sonstiger nervige Post, die nicht eindeutig die Kriterien von Spam erfüllen landen natürlich weiterhin im Posteingang. Dies ändern wir jetzt.
Problem 2: Newsletter und co.
Ich hatte mir in der Vergangenheit bereits eine ansehnliche sieve-Filterliste ausgearbeitet. Die funktionierte auch gut, leider ist diese mit der Zeit immer unschärfer geworden. Newsletter-Versender haben die Eckdaten ihrer Mails verändert und kommen immer häufiger durch die Filterlisten hindurch.
Filterregeln definieren
Also habe ich mir die Kriterien der derzeit am häufigsten vor die Füße fallenden Newsletter-Mails angesehen und so mein Regelwerk verfeinert. Hierzu habe ich in die Mailheader, bzw. in den Nachrichtenquelltext geschaut und Metadaten wie “Absender”, “Maildomain” oder hilfreiche “X”-Tags als Kriterium gesucht.
Herauszuheben sind hier Amazon und insbesondere Steam, die in ihre Mails stets Hinweise beifügen, welchen Inhalt sie enthalten und demnach einfach aussortiert werden können:
if anyof (
header :contains "x-amazon-mail-relay-type" "merchandizing",
header :contains "from" "asus.com",
header :contains "from" "newsletter.rockstargames.com",
header :contains "from" "googlenews-noreply@google.com",
header :contains "x-steam-message-type" "CEmailWishlistItemOnSale" …
Code-Sprache: JavaScript (javascript)
Filter auf Bestand anwenden
Leider ist mit diesem neuen Set mein Postfach nicht leerer. Die Anpassungen würden sich nur auf zukünftig ankommende E-Mails auswirken. Hier kommt das Tools sieve-filter ins Spiel.
sieve-filter ist ein Binary, das auf dem Mailserver läuft und Sieve-Filterregelsets kompilieren und ausführen kann. Aufgerufen wird es auf der Shell des Mailservers. Es benötigt als Parameter den (abstrahierten) Benutzer auf dem System, das sieve-Regelwerk, und den Ordner auf dem es arbeiten soll (in abstrahierter Form).
sieve-filter -v -C -u commander@commander1024.de /var/vmail/commander1024.de/commander/sieve/roundcube.sieve 'INBOX'
Code-Sprache: JavaScript (javascript)
Dieser Befehl löst nun einen dry-run aus, der verbose nach frischer Kompilierung des Regelwerks, die vorzunehmenden Operationen auflistet. Erweitert man diesen Befehlsaufruf um -e (execute) und -W (allow write) führt er diese Änderungen auch aus und schreibt sie ins Dateisystem.
So haben sich bei mir ~3000 -E-Mails in den Ordner “Newsletter” verabschiedet. Und ich muss in Zukunft weniger Benachrichtigungen meines K9-Mails auf dem Mobiltelefon ertragen, der mir über neue Mails Bescheid geben will. Denn nur Mails in der Inbox und in bestimmten Ordnern lösen Notifications aus.
Ich hoffe, dass dies dem einen oder anderen auch nützlich sein wird, und freue mich darüber dass ich selbst hiermit auch eine Referenz habe, die ich bei künftigen Aktionen nachschlagen kann.