Postfix, Dovecot + SpamAssassin: Spam in den Junk-Folder verschieben

Auf vielen Mail-Servern läuft SpamAssassin, um Spam-verdächtige Mails mit einer Header-Zeile zu markieren. Ordentliche Mail-Client wie Thunderbird können dann mit einer simplen Filter-Regel derartige Mails aussortieren.

Noch besser wäre es aber, wenn die Mails bereits auf dem Server in einen eigenen Junk-Folder verschoben würden. Das ist insbesondere dann praktisch, wenn zum Lesen von Mails auch diverse Mail-Clients auf Smartphones, iPads etc. verwendet werden, die keine Filtermöglichkeiten bieten.

Voraussetzungen

Die folgende Anleitung setzt voraus, dass Sie

  • unter Debian/Ubuntu arbeiten (ich habe zuletzt zwei Systeme unter Ubuntu 16.04 + 18.04 entsprechend konfiguriert)

  • Postfix, Dovecot und SpamAssassin bereits installiert sind und so weit funktionieren, dass eintreffende Spam-Mails gekennzeichnet werden. Werfen Sie einen Blick in den Quellcode einer Spam-Mail; dort sollte X-Spam-Status-Zeile enthalten sein. Ich habe zur SpamAssassin-Konfiguration Milter verwendet, also im Prinzip apt install spamassassin spamass-milter sowie smtpd_milters = unix:spamass/spamass.sock in /etc/postfix/main.cf.

  • die Mail-Accounts lokal konfiguriert sind (also nicht ISP-Style über eine Datenbank)

Die Anleitung funktioniert prinzipiell natürlich auch, wenn bei Ihnen eine andere Konfiguration vorliegt. Aber dann kann es sein, dass irgendwelche Details anders zu lösen sind.

Zusatzpakete installieren

Alle Arbeiten sind mit root-Rechten zu erledigen.

apt install dovecot-lmtpd dovecot-managedsieved swaks
  • LMTPD ist ein Zusatzdienst für Dovecot, der bei der lokalen Zustellung von Mails hilft.

  • Sieve ist eine Sprache für E-Mail-Filterregeln

  • SWAKS ist der Swiss Army Knife SMTP, the all-purpose smtp transaction tester

Sieve-Konfiguration einrichten

Mails, die als Spam erkannt wurden, sollen in den Junk-Folder verschoben werden. Die entsprechenden Anweisungen in der Sieve-Syntax müssen in einer *.sieve-Datei gespeichert werden. Ich habe dazu das Verzeichnis /etc/dovecot/sieve-after eingerichtet und dort die folgende Textdatei gespeichert:

# neue Datei /etc/dovecot/sieve-after/spam-to-folder.sieve
require ["fileinto","mailbox"];
if header :contains "X-Spam-Flag" "YES" {
 fileinto :create "Junk";
 stop;
}

Diese Datei muss kompiliert werden:

cd /etc/dovecot/sieve-after
sievec spam-to-folder.sieve

Dovecot-Konfiguration

Damit Dovecot sowohl LMTP als auch Sieve verwendet, sind eine Menge Änderungen erforderlich. Alle im folgenden erwähnten Dateien befinden sich in /etc/dovecot/conf.d.

10-auth.conf: LMTP erwartet Mail-Usernamen in der Form name@host.com. Wenn Sie hingegen einfach name verwenden, müssen Sie das auth_username_format wie folgt einstellen:

# Datei /etc/dovecot/conf.d/10-auth.conf
...
# https://serverfault.com/questions/658703
auth_username_format = %Ln
...

10-master.conf: Damit die Kommunikation zwischen Dovecot und LMTP funktioniert, kommentieren Sie in 10-master.conf den Block service lmtp aus und ersetzen ihn durch die folgenden Zeilen:

# Datei /etc/dovecot/conf.d/10-master.conf
...
#  https://serverfault.com/questions/512219/dovecot-lmtp-does-not-exist
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}
...

15-mailboxes.conf: Damit die Mail-Clients den Junk-Folder standardmäßig anzeigen, fügen Sie im schon vorhandenen Abschnitt mailbox Junk die Einstellung auto = subscribe hinzu:

# Datei /etc/dovecot/conf.d/15-mailbox.conf
...
mailbox Junk {
    special_use = \Junk
    auto = subscribe
  }

20-lmtp.conf: Damit Dovecot sowohl LMTP als auch Sieve verwendet, muss im Block protocol lmtp eine gültige Postmaster-Adresse eingestellt sein und das sieve-Plugin aktiviert werden.

# Datei /etc/dovecot/conf.d/20-lmtp.conf
...
protocol lmtp {
  postmaster_address = postmaster@ihr-hostname.bla
  mail_plugins = $mail_plugins sieve
}

90-sieve.conf: Zu guter Letzt muss die zuvor eingerichtete Sieve-Regel aktiviert werden. Dazu ist die folgenden sieve-after-Einstellung erforderlich. Damit werden alle kompilierten Sieve-Dateien in /etc/dovecot/sieve-after berücksichtigt.

# Datei /etc/dovecot/conf.d/90-sieve.conf
...
sieve_after = /etc/dovecot/sieve-after

Postfix-Konfiguration

Weniger aufwendig sind die Änderungen an main.cf. Die erste Zeile aktiviert LMTP für den Transport von Mails in lokale Verzeichnisse. Die zweite Regel ist anscheinend notwendig, damit SpamAssassin mit Postfix als Milter (Mailbox-Filter) funktioniert (Quelle). Ich gestehe, dass sich mir der Sinn dieser Zeile nicht erschlossen hat.

# Datei /etc/postfix/main.cf
...
mailbox_transport = lmtp:unix:private/dovecot-lmtp
milter_connect_macros = i j {daemon_name} v {if_name} _

Test

Um sicherzugehen, dass Postfix und Dovecot alle Änderungen erkannt haben, starten Sie die Programme neu:

systemctl restart postfix
systemctl restart dovecot

Danach senden Sie sich (idealerweise von einem anderen Rechner) mit swaks eine Spam-Test-Mail zu, die von jedem Spam-Tester zuverlässig als Spam erkannt wird:

swaks --to eine-adresse@ihr-host.bla --server localhost --data /usr/share/doc/spamassassin/examples/sample-spam.txt

Im Idealfall taucht die Mail nun im Junk-Folder Ihres Mail-Accounts auf. Wenn nicht, beginnt die Fehlersuche in der Logging-Datei /var/log/mail.log.

Quellen

3 Gedanken zu „Postfix, Dovecot + SpamAssassin: Spam in den Junk-Folder verschieben“

  1. Das schaut wirklich interessant aus. Meine sämtlichen Mailserver laufen unter CentOS 7 mit Postfix, Dovecot und Spamassassin. So mal grob über den Daumen gepeilt, meinst du, daß die Anpassung an meine Distribution trivial ist? Oder werd ich da durch ein paar brennende Reifen springen müssen? Liebe Grüße aus dem verregneten Südfrankreich.

    1. Ich glaube eigentlich nicht, dass große Probleme zu erwarten sind — aber ich habe es noch nicht probiert.

      Die entscheidende Frage ist, ob sich die Default-Konfiguration von Dovecot unter RHEL/CentOS in irgendwelchen wesentlichen Details von der Ubuntus unterscheidet.

      1. Na, ich probier’s mal demnächst an einem verregneten Nachmittag aus. Wenn’s hinhaut, schreib ich dann auch einen entsprechenden Blogartikel.

Kommentare sind geschlossen.