Bei jedem Spamfilter kann es vorkommen, dass Spam durchrutscht oder eine echte Nachricht fälschlicherweise als Spam eingestuft wird. Rspamd bietet über das Webinterface die Möglichkeit, trainiert zu werden. Hier kann man einfach den Quellcode jeder E-Mail kopieren und Rspamd mitteilen, ob es sich dabei um Spam (SPAM) oder um eine legitime Nachricht (HAM) handelt. Dieses Vorgehen ist jedoch ungeeignet, um den Spamfilter effektiv zu trainieren.
Wünschenswert wäre folgende Lösung: Immer wenn ein Benutzer eine E-Mail in den Ordner „Junk“ verschiebt, sollte diese E-Mail automatisch von Rspamd als Spam gelernt werden. Zusätzlich sollte jede E-Mail, die der Benutzer aus dem „Junk“-Ordner herausholt, als Ham gelernt werden.
Genau dieses Szenario möchte ich hier kurz beschreiben. Das Hostsystem ist ein FreeBSD; Linux-User müssen daher bei den Pfaden wie /usr/local aufpassen! Ebenfalls lauscht mein Rspamd-Worker nicht auf einem Unix-Socket, sondern auf der IP 127.0.0.3, da er in einer Jail-Umgebung läuft.
Beginnen wir mit der Konfiguration für Dovecot.
20-imap.conf:
protocol imap { mail_plugins = $mail_plugins sieve }
90-plugin.conf:
plugin { sieve_plugins = sieve_imapsieve sieve_extprograms # From elsewhere to Spam folder or flag changed in Spam folder imapsieve_mailbox1_name = Junk imapsieve_mailbox1_causes = COPY FLAG imapsieve_mailbox1_before = file:/usr/local/etc/dovecot/sieve/report-spam.sieve # From Spam folder to elsewhere imapsieve_mailbox2_name = * imapsieve_mailbox2_from = Junk imapsieve_mailbox2_causes = COPY imapsieve_mailbox2_before = file:/usr/local/etc/dovecot/sieve/report-ham.sieve sieve_pipe_bin_dir = /usr/local/libexec/dovecot sieve_global_extensions = +vnd.dovecot.pipe }
/usr/local/etc/dovecot/sieve/report-spam.sieve:
require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "imap4flags"]; if environment :is "imap.cause" "COPY" { pipe :copy "sa-learn-spam.sh"; } # Catch replied or forwarded spam elsif anyof (allof (hasflag "\\Answered", environment :contains "imap.changedflags" "\\Answered"), allof (hasflag "$Forwarded", environment :contains "imap.changedflags" "$Forwarded")) { pipe :copy "sa-learn-spam.sh"; }
/usr/local/etc/dovecot/sieve/report-ham.sieve:
require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"]; if environment :matches "imap.mailbox" "*" { set "mailbox" "${1}"; } if string "${mailbox}" [ "Trash", "train_ham", "train_prob", "train_spam" ] { stop; } pipe :copy "sa-learn-ham.sh";
Natürlich nicht vergessen, die beiden neuen Sieve-Skripte für Sieve zu kompilieren:
# sievec /usr/local/etc/dovecot/sieve/report-spam.sieve # sievec /usr/local/etc/dovecot/sieve/report-ham.sieve
Es fehlen nur noch die beiden Shell-Skripte, um die Mails an Rspamd weiterleiten zu können.
/usr/local/libexec/dovecot/sa-learn-spam.sh:
#!/bin/sh exec /usr/local/bin/rspamc -h 127.0.0.3:11334 learn_spam
/usr/local/libexec/dovecot/sa-learn-ham.sh:
#!/bin/sh exec /usr/local/bin/rspamc -h 127.0.0.3:11334 learn_ham
Beide müssen ausführbar sein:
# chmod +x /usr/local/libexec/dovecot/sa-learn-spam.sh /usr/local/libexec/dovecot/sa-learn-ham.sh
Wenn ich nun eine E-Mail in den Ordner „Junk“ verschiebe, lernt Rspamd diese automatisch als Spam:
2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_controller_check_password: allow unauthorized connection from a trusted IP 127.0.0.3 2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_message_parse: loaded message; id: <FNgLHBeARhiVYgEegF_-Pw@ismtpd0002p1lon1.sendgrid.net>; queue-id: <undef>; size: 49053; checksum: <f5e2fc59515e1da33d532c6f03f6f6f0> 2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_mime_part_detect_language: detected part language: de 2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_mime_part_detect_language: detected part language: de 2020-05-04 11:21:02 #92071(controller) <b91225>; csession; rspamd_controller_learn_fin_task: <127.0.0.3> learned message as spam: FNgLHBeARhiVYgEegF_-Pw@ismtpd0002p1lon1.sendgrid.net
Verschiebe ich eine E-Mail aus dem Ordner „Junk“ heraus, wird sie, wie gewünscht, als Ham gelernt:
2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_controller_check_password: allow unauthorized connection from a trusted IP 127.0.0.3 2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_message_parse: loaded message; id: <FNgLHBeARhiVYgEegF_-Pw@ismtpd0002p1lon1.sendgrid.net>; queue-id: <undef>; size: 49053; checksum: <f5e2fc59515e1da33d532c6f03f6f6f0> 2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_mime_part_detect_language: detected part language: de 2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_mime_part_detect_language: detected part language: de 2020-05-04 11:20:51 #92071(controller) <a7fe42>; csession; rspamd_controller_learn_fin_task: <127.0.0.3> learned message as ham: FNgLHBeARhiVYgEegF_-Pw@ismtpd0002p1lon1.sendgrid.net
Fragen? Einfach fragen!
Ach, und was man nicht mehr verwenden sollte: das Antispam-Plugin – das ist „tot“.
Die Idee ist gut, aber bei mir funktioniert das nicht. Verschiebe ich eine Mail aus dem Spamordner, wird sie kurz darauf wieder dorthin zurück veschoben….
Geht nicht, ist eine eher schwierige Problembeschreibung…
Ich kann das jedoch bestätigen. Bei mir landet die Mail auch immer wieder im Junk Folder. Hier ein Lograuszug:
Jan 16 15:27:31 server01 dovecot: imap(user@example.com): sieve: pipe action: piped message to program `learn-ham.sh‘
Jan 16 15:27:31 server01 dovecot: imap(user@example.com): sieve: left message in mailbox ‚INBOX‘
Jan 16 15:27:31 server01 dovecot: imap(user@example.com): Logged out in=255 out=1805 deleted=0 expunged=0 trashed=0 hdr_count=0 hdr_bytes=0 body_count=0 body_bytes=0
Jan 16 15:27:31 server01 dovecot: imap-login: Login: user=, method=PLAIN, rip=::1, lip=::1, mpid=4017682, TLS, session=
Jan 16 15:27:31 server01 dovecot: imap(user@example.com): Logged out in=850 out=78142 deleted=0 expunged=0 trashed=0 hdr_count=20 hdr_bytes=35198 body_count=0 body_bytes=0
Jan 16 15:27:32 server01 dovecot: imap(user@example.com): sieve: pipe action: piped message to program `learn-spam.sh‘
Jan 16 15:27:32 server01 dovecot: imap(user@example.com): sieve: left message in mailbox ‚Junk‘
In deinem Setup scheint die E-Mail, trotz Markierung als Ham, immer wieder im Junk-Ordner zu landen. Das kann passieren, wenn der Lerneffekt von Rspamd und Dovecot nicht korrekt umgesetzt wird. Hier einige Ansätze, um das Verhalten zu überprüfen und anzupassen:
Debugging des Sieve-Prozesses: Aktivere in Dovecot das Sieve-Logging auf einem höheren Level, um detailliertere Informationen zum Ablauf des learn-ham.sh und learn-spam.sh zu erhalten. Füge mail_debug = yes in deiner Dovecot-Konfiguration hinzu und schaue, ob das Skript tatsächlich als Ham oder Spam registriert wird.
sa-learn Skripte prüfen: Teste die Skripte sa-learn-spam.sh und sa-learn-ham.sh manuell, um sicherzustellen, dass sie die Rückgabe von Rspamd korrekt verarbeiten. Führe die Befehle direkt aus und überprüfe die Rückmeldung von rspamd, um sicherzustellen, dass es tatsächlich als Ham bzw. Spam gelernt wird.
Ordnerkonfiguration: Möglicherweise verhindert die COPY-Aktion in der report-ham.sieve, dass die E-Mail vollständig aus dem Junk-Ordner verschoben wird. Versuche, in der Konfiguration sicherzustellen, dass nach der Markierung als Ham kein Rückkopieren in den Junk-Ordner erfolgt.
Rspamd-Lerneinstellungen: Stelle sicher, dass Rspamd so konfiguriert ist, dass es das Verschieben von E-Mails zwischen Ordnern als Lernevent registriert. Eventuell sind bestimmte Einstellungen oder Module erforderlich, um das korrekte Lernen von Ham und Spam in Rspamd zu gewährleisten.
Insg. aber vielleicht etwas, was wir nicht über Kommentare klären sollten 😀
Hier klappt das. Danke!