Serverseitige Mailfilter bei Hetzner


Update 2018-07-28

Irgendwann in den letzten Monaten haben sich die konkreten Pfade bei Hetzner geändert und es scheint, als wenn Sieve inzwischen unterstützt wird oder die Unterstützung zumindest vorbereitet wird.

Ich habe in der Beispielconfig die Pfade angepasst.

Vorwort

Meine Mails liegen auf einem Hetzner Level 1 Webspace. Inzwischen gibt es einige coole Mail-Provider, aber als ich vor 2012 keine Lust mehr hatte, meinen eigenen Mailserver zu betreiben, erschien mir Hetzner als eine gute Lösung – und ich habe auch wenig Lust die 20 Postfächer da drauf umzuziehen.

Etwas das mir aber immer gefehlt hatte, waren Server-Seitige Filter. Das einzige was die FAQ – bis heute – dazu zu sagen hat ist

Warum werden trotz aktiver Filterregeln die Mails nicht gefiltert?
Die Filterregeln, die Sie im Webmail definieren, sind clientseitige Filter, d.h. sie werden nur ausgeführt während Sie im Webmail angemeldet sind. Unter "Einstellungen" -> "Webmail" -> "Filter" können Sie definieren, wann die Regeln ausgeführt werden sollen.

1. Akt

Doch das Hetzner-Twitter-Marketing-Team hat den richtigen Hinweis:

Twitter-Konversation mit dem Hetzner-Team, in dem Hetzner auf Eximfilter hinweist

2. Akt

Also los, auf geht's. Ein kurzer Test zeigt, dass die Datei tatsächlich .forward_<localpart> heißen muss. Für peter@example.com beispielsweise .forward_peter. Diese Datei muss, wenn vom SFTP-Root aus betrachtet, im Ordner /vmail/<domain>/ liegen. In meinem Fall also mit komplettem Pfad /vmail/<domain>/mazdermind.de/.forward_peter heißen.

By-Default ist dies ein normales Unix .forward-File, mit dem die eigenen Mails an eine oder mehrere Adressen weitergeleitet werden können.

Durch das Einfügen der Zeile # Exim filter als erste Zeile der Datei interpretiert exim die Datei nun nicht mehr als normale .forward-Datei, sondern als Exim-Filter-Chain.

Die exim4-Dokumentation zur Exim-Filter-Syntax ist allumfassend und die Syntax zum auswählen bestimmter Mails ist beinahe Selbsterklärend:

if $sender_address: contains "some-system@example.com"
then
   save /some/folder/
endif

if
   $header_subject: contains "Some" or
   $header_subject: contains "Word"
then
   deliver someone-else@example.com
endif

Nur eine Information fehlt noch: Unter welchen Systempfad liegen die Mail-Postfächer - welcher Pfad muss für das save-Kommando angegebnen werden, damit die Mails im richtigen Ordner landen.

Letzter Akt

Wie in der Twitter-Konversation gefordert, habe ich den Hetzner-Support um Hilfe gebeten und eine schnelle, freundliche und –vor allem– hilfreiche Antwort erhalten.

Der anzugebene Pfad enthält sowohl den Namen des Haupt FTP-Benutzers (aka. euer Unix-Username) als auch den Local-Part der E-Mail-Adresse, in deren Postfach zugestellt werden soll.

Im Anschluss daran können dann Ordner-Namen für die Ablage im IMAP-Postfach angehängt werden – jeweils mit einem Punkt vor den Namen.

if $sender_address: contains "some-system@example.com"
then
   save /usr/home/<ftp-hauptbenutzer>/vmail/<domain-name>/<local-part>/mail/.bigberta-cron/
endif

Wenn's nicht klappt

Zu den nützlichen Debug-Tools gehört die Maillog-Ansicht in der Konsole:

Fehlermeldung im Mail-Log, die auf falsche Dateirechte der .forward-Datei hinweist

Auch lohnt es sich, die Ordnerstruktur mit dem Dateibrowser zu betrachten:

Dateibrowser zeigt Dateistruktur des Mailpostfachs