‹‹‹ Übersicht Kolumne

(Aktualisiert: )

Serverseitige E-Mail-Filter bei Hetzner, 2022-Edition
Über ein faktisch nicht dokumentiertes Feature

Wenn man bei Hetzner Webhosting-Kunde ist, beispielsweise mit "Level 1" oder "Level 4", erhält man nicht nur eine gewisse Anzahl an Mailboxen. Hetzner unterstützt auch serverseitige Filterung von E-Mails. Doch das Feature ist faktisch nicht dokumentiert und hat dem Anschein nach eine bewegte Geschichte.

  • E-Mail
  • Filter
  • Hetzner
  • Sieve

Hintergrund

Auf der Suche nach Möglichkeiten zur serverseitigen Filterung von E-Mails trieb mich meine Suche in Richtung Hetzner. Ich hatte weder Lust noch ernsthaft Zeit, einen eigenen E-Mail-Server allein für diesen einen Zweck zu betreiben, wie ich es einst schon einmal getan hatte. Insofern war eine Lösung über einen etablierten Anbieter eindeutig zu bevorzugen. Clientseitige Filter setzte ich via Thunderbird inzwischen seit vielen Jahren ein. Leider ließen sich diese nur beschränkt über mehrere Geräte hinweg nutzen bzw. synchronisieren. Bei Thunderbird kam erschwerend hinzu, dass durch die Natur der Software - sie ist an kritischen Stellen in JavaScript umgesetzt - die Performance des gesamten Programms bei vielen (mehr als 100) Filtern selbst auf schneller, moderner Hardware stark litt.

Der Klassiker in der Welt der serverseitigen Filter ist Sieve. Sieve ist gewissermaßen eine Sprache, die von einer Reihe an Mail-Servern verstanden wird, allen voran Dovecot, und welche es erlaubt, E-Mails regelbasiert zu verarbeiten. Eine Suche nach "Hetzner" und "Sieve" brachte im Wesentlichen nur ein verwertbares Resultat: Einen Blog-Post von 2018. Dort war zwar nicht von Sieve die Rede, jedoch immerhin von Exim-Filtern. Die Freude verpuffte aber schnell, als ich auf die dort verlinkte Diskussion bei Twitter schaute. Was 2018 noch funktionierte, ging 2019 schon nicht mehr - Zukunft ungewiss.

Gestern ließ ich es darauf ankommen und fragte den Support bei Hetzner nach dem aktuellen Status. Dieser Ansatz schien 2018 schon einmal funktioniert zu haben. Die kurze und knappe Antwort kam heute:

Wir unterstützen eine Server-seitige Filterung von E-Mails mittels Sieve.

Phantastisch. Aber wie?

Umsetzung

Wählt man sich via FTP (oder besser SFTP) auf seinen Webspace bei Hetzner via sftp://user@www123.your-server.de ein und stöbert dort ein bisschen herum, bekommt man eine Idee, wie es funktionieren könnte. Nimmt man an, dass es um ein bei Hetzner eingerichtetes E-Mail-Postfach mit der Adresse test@example.com geht, dann findet sich folgendes Verzeichnis: /vmail/example.com/test/sieve/. Dort finden sich wiederum zwei Dateien: rules.sieve und spam.sieve. Der Inhalt von rules.sieve gibt den nötigen Hinweis:

require ["include"];
include :personal :optional "spam";
include :personal :optional "autoresponder";
include :personal :optional "custom";
Quelltext 1: Der originale Inhalt von /vmail/example.com/test/sieve/rules.sieve

Hier wird unter anderem die im gleichen Verzeichnis liegende Datei spam.sieve neben zwei weiteren Dateien, autoresponder.sieve und custom.sieve, inkludiert. Alle include-Statements sind dabei als :optional gekennzeichnet, so dass autoresponder.sieve und custom.sieve problemlos fehlen können - was sie auch tun. Ich habe in diesem Verzeichnis dem Anschein nach Schreibrechte und custom.sieve klingt nach einem guten Platz für einen kleinen Test mit eigenen Regeln. Gesagt, getan:

require ["fileinto", "envelope", "imap4flags"];

addflag "$label2";

if header :contains "subject" ["foo", "bar"] {
    fileinto "INBOX.baz";
    stop;
}
Quelltext 2: Experimenteller Inhalt der neu erstellten /vmail/example.com/test/sieve/custom.sieve

Die graue Theorie sagt, dass alle Nachrichten, deren Betreff (subject) die Zeichenketten foo und/oder bar enthält, in ein Unterverzeichnis geschoben werden, welches sich baz nennt und im Vorfeld angelegt werden sollte. Darüber hinaus werden alle eingehenden E-Mails, egal ob sie foo oder bar im Betreff haben oder nicht, noch mit einer Flag gekennzeichnet, die sie in Thunderbird als "Dienstlich" orange hervorgehoben erscheinen lässt. Damit sollte man sicher erkennen, ob die Datei ihre Wirkung entfalten kann oder nicht. Beim ersten Senden einer E-Mail an test@example.com werden die Filter erwartungsgemäß automatisch compiliert. Eine neue Datei, die compilierten Filter enthaltend, taucht auf: /vmail/example.com/test/sieve/rules.svbin. Kennzeichnen und verschieben von E-Mails funktioniert wie erwartet.

Die Möglichkeiten, eine fehlerhafte Sieve-Datei zu debuggen, sind leider begrenzt. Man "erkennt" Fehler allgemein zum einen daran, dass die Filter schlicht nicht funktionieren. Aber auch das (Re-) Compilieren zu rules.svbin bleibt beim Senden von E-Mails an das bewusste Postfach aus. Detailtiere Meldungen oder Logs sind scheinbar nicht erhältlich. Funktioniert der Filter dagegen, finden sich bei Hetzners "konsoleH" unter E-Mail > Berichte > Maillog Einträge wie test@example.com -> test [fileinto action: stored mail into mailbox 'INBOX.baz'].

Nachtrag 2022-09-03

Hetzner hat via Twitter auf diesen Post geantwortet:

Einige Clients können zwar auf die Sieve-Filterdateien zugreifen, aber unsere Systeme bieten keine Unterstützung für die Änderung dieser Dateien. Änderungen werden irgendwann überschrieben. Wir empfehlen, die Filter über Webmail hinzuzufügen, das Sieve im Hintergrund verwendet.

In der Tat funktioniert der oben beschriebene Weg nicht bei jedem Hosting-Vertrag bzw. nicht auf jedem ihrer Systeme. In manchen Fällen existiert /vmail nicht bzw. ist weder lesbar noch schreibbar. Die Webmail-Oberfläche erlaubt es, über ein grafisches Interface Filter zu definieren. Diese entsprechen einem Subset der Features von Sieve. Die Filter greifen, wie man es bei Sieve erwarten würde, für alle eingehenden E-Mails - egal, wie diese dann später abgerufen werden. Importieren oder Exportieren von Sieve-Dateien ist leider nicht möglich.

‹‹‹ Übersicht Kolumne