Möglicherweise ist die Erkennungsrate von Spamassassin zu Beginn nicht zufriedenstellend und einige Spammails werden nicht erkannt, obwohl Spamassassin aktuell ist. Die Trefferquote kann verbessert werden, indem Spamassassin anhand bereits vorhandener Mails „trainiert“ wird. Der Software werden sowohl Spammails als auch normale, erwünschte Mails zur Analyse übergeben. Spamassassin lernt so mit der Zeit, wie eine Spammail aussieht und welche E-Mails erwünscht sind.
Für das Training wird das Tool „sa-learn“ genutzt, welches mit Spamassassin mitgeliefert wird. Ich gehe im Folgenden davon aus, dass Spamassassin in Kombination mit dem Amavis Filterframework genutzt wird. Unter /root/scripts wird das Bash-Skript „sa-learn.sh“ angelegt, das diesen Inhalt hat:
#!/bin/bash sa-learn --spam --progress --username amavis --dbpath /var/lib/amavis/.spamassassin /var/vmail/mailboxes/*/*/mail/Spam/cur/* sa-learn --ham --progress --username amavis --dbpath /var/lib/amavis/.spamassassin /var/vmail/mailboxes/*/*/mail/Sent/cur/*
Die erste Zeile führt dazu, dass Spamassassin die E-Mails z.B. in /var/vmail/mailboxes/domain.tld/user/mail/Spam/cur als Spam kennen lernt (–spam). In der zweiten Zeile werden mit „–ham“ harmlose, selbst verfasste E-Mails kennen gelernt. Die *-Zeichen im Pfad bewirken, dass alle Unterverzeichnisse durchlaufen werden (also alle Mailboxen aller Domains).
Das Script wird mittels
# chmod u+x /root/scripts/sa-learn.sh
ausführbar gemacht und via
# crontab -e
in die Cronjobs des root-Users aufgenommen und täglich ausgeführt:
### Daily Spamassassin learning @daily /root/scripts/sa-care.sh
Wunder sollte man von der Lernprozedur nicht erwarten, doch in Einzelfällen (und bei dauerhafter Spambelastung mit einem bestimmten E-Mail-Typ) kann man damit einen gewissen Effekt erreichen.
http://gamemodeon.de
„Damit das Hand automatisch in festen Zeitintervallen ausgeführt wird“
^ da ist glaube ich was falsch
https://legacy.thomas-leister.de
Ja, dank für die Korrektur ;) … ich frage mich immer noch, wie die Hand da reingekommen ist :-/
LG Thomas
Die Hand Gottes…
Das ist eine gute Idee mit dem Script. Allerdings sollte man es noch erweitern und die gelernten Mails löschen. Wenn man den Ordner SENT verwendet ist es natürlich schlecht. Es kommt aber öfters vor, dass eine Mail als Spam gekennzeichnet wird, welche kein Spam ist. Daher lasse ich zwei Ordner von Dovecot anlegen (LearnSpam und LearnNoSpam). Das script läuft über diese beiden Ordner. Der User kopiert seine Mails entsprechend dort rein.
Gruß
Steffen
https://firefoxosundich.wordpress.com
Hallo, Thomas,
sorry, aber wie du deine for-Schleifen benutzt, ist falsch. Verbring einfach ein wenig Zeit in #bash auf Freenode ;-)
TL;DR: Ersetze
for USER in $(ls); do
durchfor USER in *; do
und alles wird gut :)Mitunter willst du dein Script auch nicht für alle ausführbar machen (
chmod +x sa-practise.sh
→chmod u+x sa-practise.sh
?)https://legacy.thomas-leister.de
Hi,
was Bash Script angeht, bin ich relativ unerfahren. Danke für deine Hinweise!
Wer das Script ausführt ist eigentlich recht egal… aber nur dem Besitzer die Rechte zu geben ist sicherlich die sauberere Lösung ;)
LG Thomas
Ich möchte mich nochmal für die tollen Tutorials bedanken. Ich habe bis jetzt alles von Anfang bis Ende mit den Tutorials von hier durchgearbeitet. Nun möchte ich den Spamassassin trainieren, aber komme nicht weiter.
Bei mir sind im Ordner ../mail/ kein „Spam“ oder „cur“ -Ordner. Es gibt verschiedene Dateien die Spam, Entwurf, Gesendet usw. heißen. Deshalb weiss ich nicht wie ich hier weitermachen soll.
Ist mit folgendem Pfad sa-learn –ham /pfad/zur/Mailbox/Sent die Datei Gesendet im Ordner ../mail/ gemeint?
Ist dieser Vorgang für jeden Besitzer einer Mailadresse separat zu machen oder braucht man das nur einmal für alle User im System zu machen?
Ich würde mich über jede Hilfe sehr freuen.
https://legacy.thomas-leister.de/ueber-mich-und-blog/
Hi, die „Spam“ und „Cur“ Ordner sollten beim ersten Login des Benutzers angelegt werden. Bei „sa-learn“ ist der Pfad zum gesendet Ordner gemeint – ganz egal wie der heißt ;) Das kann je nach verwendetem E-Mail Client unterschiedlich sein. Der Vorgang muss für jede Mailbox (also jeden User) extra durchgeführt werden. Deshalb gibt es am Ende des Beitrags ein Script, das alle Mailboxen automatisch durchläuft und die beiden sa-Befehle ausführt.
LG Thomas
alles schön und gut, aber bei mir ist anscheinend einiges schief gegangen. Wenn ich einen neuen Benutzer zum Datenbank hinzufüge und mich mit diesen einlogge, habe ich im Webmail nur ein Spam- und Inbox-Ordner.
Und wenn ich über die Konsole mit „ls -l“-Befehl ins /var/mail/domain/username/mail reinschaue, dann sehe ich folgenden Eintrag:
-rw-rw—- 1 vmail vmail 4449 Okt 20 18:36 Spam
Ich schaue mir die ganze Tutorials nochmal an, war so glücklich, dass alle Fehlerfrei lief, schaade.
Okay, die Ordner „Gesendet“ und „Entwürfe“ entstehen nach dem ersten Entwurf. Aber trotzdem sind diese eben über die Konsole gesehen immer noch keine Ordner und es gibt keinen Ordner Namens „cur“.
Ich habe statt den Ordner „cur“ einfach den „Gesendet“ Ordner genommen. Spam ist bei mir zwar eine komische Datei, aber beim Ausführen des Befehls gab es keine Fehlermeldung. Deshalb habe ich den Rest mit so ins Cronjob übernommen.
Seltsam ist, dass die Mailadressen, die ich im spam-Ordner hatte und von denen eigentlich gelernt wurde, dass sie Spam sind, mir immer noch Mails zusenden könnten und diese in Inbox landen.
Liegt das vielleicht an meine komischen Spam-dateien? Welches Merkmal merkt sich der Spamassassin, damit er das nächstes Mal die Spam aussortieren kann, tut er das Anhand der Mailadressen oder doch etwas anderes?
Hoffentlich war das meine letzte Frage und nochmals vielen Dank für all die schönen Anleitungen.
https://legacy.thomas-leister.de/ueber-mich-und-blog/
Hi,
Spamassassin berechnet aus mehreren Parametern einen sog. Spam-Score. Kontrolliert wird der absendende Server und vor allem der Inhalt einer E-Mail. Es wird nach bestimmten Phrasen gesucht, die in Spammails vorkommen. Möglicherweise braucht es etwas Zeit (und einige korrekt markierte / verschobene Mails) bis der bayessche Filter Spam zuverlässig erkennt.
LG Thomas
Alles klar. Dann werde ich den weiter trainieren, bis ich einen Erfolg sehe.
Vielen Dank nochmal.
Also das Skript an sich funktioniert.
Aber wenn ich über meine Roundcube-Installation die Mails in den Spam-Ordner lege, werden diese nicht unter …/domain/user/mail/spam abgelegt, sondern unter …/domain/user/mail/.spam
http://www.finnchristiansen.de
Auch wenn der Beitrag schon einige Montate alt ist, das Thema stand lange auf meiner Todo Liste und kann jetzt abgehakt werden, vielen Dank!
Weißt du, wie sich das manuelle oder per Cron gesteuerte Aufrufen von sa-learn und die Spamassassin-Einstellung „bayes_auto_learn“ zusammen verhalten? Ich würde denken, dass es sicherlicht nicht schadet, zusätzlich deinen Rat zu befolgen und sa-learn einen Ordner mit (hoffentlich) 100% Spam und einen mit 100% nicht-Spam zu geben, aber hat damit schon jemand positive oder negative Erfahrungen gemacht?
Das Skript in /etc/cron.weekly darf keine File Extension haben, da run-parts in diesem Ordner nur Skripte ohne File Extension ausführt (also ohne .sh).
Das Skript in /etc/cron.weekly muss also sa-practise heißen, und nicht sa-practise.sh
Hey danke für das Script, habe es noch etwas angepasst, damit ich nicht alle Postfächer einer Domain sondern nur einzelne Postfächer berücksichtige:
#!/bin/sh
MAILS="mustermann@domain.de musterfrau@domain.de musterkind@domain.de"
for MAILS in $MAILS; do
### durchsucht z.b. /var/qmail/mailnames/domain.de/mustermann/Maildir/.Junk/cur/ je nach Email Adresse ###
sa-learn --spam --progress "/var/qmail/mailnames/${MAILS#*@}/${MAILS%@*}/Maildir/.Junk/cur/"
sa-learn --ham --progress "/var/qmail/mailnames/${MAILS#*@}/${MAILS%@*}/Maildir/cur/"
done
Läuft super auf CentOS 6.x mit Plesk 12.x
Nun bekomme ich aber täglich eine Mail von Anacron (hab das File in cron.daily gepackt) mit dem Ergebniss:
/etc/cron.daily/sa-learn.sh:
100% Completed 23.23 msgs/sec in 00m00s
Learned tokens from 3 message(s) (3 message(s) examined)
...............
95% Completed 25.45 msgs/sec in 00m00s
Learned tokens from 22 message(s) (22 message(s) examined)
Learned tokens from 0 message(s) (0 message(s) examined)
85% Completed 21.67 msgs/sec in 00m00s
Learned tokens from 6 message(s) (6 message(s) examined)
Learned tokens from 0 message(s) (0 message(s) examined)
.......................................................................................................................................................................
91% Completed 16.76 msgs/sec in 00m09s
Learned tokens from 167 message(s) (167 message(s) examined)
100% Completed 121.68 msgs/sec in 00m00s
Learned tokens from 2 message(s) (2 message(s) examined)
100% Completed 18.64 msgs/sec in 00m00s
Learned tokens from 7 message(s) (7 message(s) examined)
Weiß jemand wie ich diese Mails deaktivieren kann?
http://www.pinguine-und-aepfel.de
Hallo Steven,
einfach in den Cronjob in die oberste Zeile ein:
MAILTO=““
setzen.
Moin Thomas,
Wie kann ich spamassassin die gelernten wieder verlernen lassen. Hab aus versehen eine falsche Mail im Spam gehabt?
Cheers Blake
https://legacy.thomas-leister.de/ueber-mich-und-blog/
Hi,
Spamassassin korrigiert des erlernte, wenn du die E-Mail zurück in einen Ordner schiebst, aus dem SA sein „Ham“ lernt.
LG Thomas
Hi Thomas,
vielen Dank auch wieder für dieses HowTo.
Ich habe bei mir zwei Ordner erstellt: SpamToLearn und SpamFalse in die ich die jeweiligen Mails reinschiebe. Diese beiden Ordner möchte ich für sa-learn verwenden.
Was muss ich denn in Deinem Script ändern, damit die erlernten Mails nach einem sa-learn durchjlauf aus den jeweilgen Ordner lösche?
Danke Dir. :-)
https://legacy.thomas-leister.de/ueber-mich-und-blog/
Nach dem letzten sa-learn Kommando (und vor dem „done“) führst du einfach noch diese zwei rm-Kommandos aus:
rm -r /var/vmail/$DOMAIN/*/mail/SpamToLearn/*
rm -r /var/vmail/$DOMAIN/*/mail/SpamFalse/*
Hab das nicht getestet – ggf musst du den Pfad anpassen (je nachdem, wo sich die beiden Ordner befinden). Dann ist noch darauf zu achten, dass der User, unter dem du das Script ausführst, ausreichend Rechte zum Löschen hat. Also am besten vmail oder root nehmen.
LG Thomas
Hallo Thomas,
vielen Dank für das Tutorial. :-)
Kann ich denn in irgendeinem Logfile nachsehen, ob per Cron das sa-learn erfolgreich ausgeführt wurde und ob Regeln eingelesen wurden bzw. neue Spamregeln für Spaassassin erstellt wurden?
http://www.loggn.de
Wurde mich auch mal interessieren.
Hi,
ein solches Logfile gibt es nicht, soweit ich weiß. Du könntest dir aber im Script selbst ein solches Log schreiben lassen.
Hallo Thomas,
danke für Deine tollen Tutorials!
Ich habe amavis und spamassassin nach Deiner Anleitung installiert und konfiguriert: Postfix: Amavis Spamfilter mit Spamassassin und Sieve
In dieser Config stimmt der Teil imho nicht bzw. bringt nichts:
(Wenn ihr Spamassassin zusammen mit Amavis verwendet, solltet ihr nach dem „–spam“ noch ein „–username=amavis“ anhängen, damit die Trainingsdaten an der richtigen Stelle gespeichert werden und dort von Amavis verwendet werden können! Das gilt für alle sa-learn-Befehle)
Stattdessen ist folgender Parameter notwendig: –dbpath /var/lib/amavis/.spamassassin
So scheint es bei mir jedenfalls zu funktionieren mit dem Lernen!
https://legacy.thomas-leister.de/ueber-mich-und-blog/
Standardmäßig ist der dbpath auf ein Verzeichnis gesetzt, das sich im Home-Verzeichnis des Users befindet, mit dem der Befehl ausgeführt wird. Indem man den Benutzer passend setzt, kann man das Ziel auch erreichen.
LG Thomas
gilt das „–username=amavis“ auch für das skript?
also muss es :
#!/bin/sh
DOMAINS=“domain1 domain2 domain3″
for DOMAIN in $DOMAINS; do
echo „Entered Domain $DOMAIN“
### Learn Spam ###
echo „Learning SPAM“
sa-learn –spam –username=amavis –progress „/var/vmail/$DOMAIN/*/mail/Spam/“
### Learn Ham ###
echo „Learning HAM“
sa-learn –ham –username=amavis –progress „/var/vmail/$DOMAIN/*/mail/cur/“
done
service spamassassin reload
mit einem oder mit zwei „-“ ?
https://legacy.thomas-leister.de/ueber-mich-und-blog/
Mit zwei Minus-Zeichen. Gilt auch für das Skript.