23
Mailserver: Trainingsskript für Spamassassin
Nachdem ich die Tage einen neuen Mailserver aufgesetzt habe (mehr oder weniger nach dem Howto von johker), hatte ich mich nun ein bischen mit dem Feintuning beschäftigt. U.a. habe ich das Skript fürs Trainieren von Ham- bzw. Spam-Mails für die Bayes-Datenbank von Spamassassin überarbeitet, damit weniger (Fehler-)Meldungen produziert werden und man sich das Ergebnis damit eher per E-Mail (zur Kontrolle der Arbeit) zuschicken lassen kann:
#!/bin/bash
VMAILDIR="/var/vmail"
SADIR="/var/lib/amavis/.spamassassin"
DBPATH="/var/lib/amavis/.spamassassin/bayes"
cd $VMAILDIR
for domain in $(find ./ -maxdepth 1 -not -name "." -type d | sed -e 's/\.\/*//'); do
domaindir="$VMAILDIR/$domain"
cd $domaindir
for user in $(find ./ -maxdepth 1 -not -name "." -type d | sed -e 's/\.\/*//'); do
maildir="$domaindir/$user/maildir"
hamdir="$maildir/.Ham"
spamdir="$maildir/.Spam"
# train ham
if [ -d $hamdir ]; then
hamcount=$(find $hamdir -regex '.*\(/.*\)?\/\(cur\|new\)/.*' -type f | wc -l)
if [ $hamcount -ge 1 ]; then
echo "Learning ham from $hamdir/cur"
sa-learn --ham --showdots --dbpath $DBPATH $hamdir/cur
find $hamdir -regex '.*\(/.*\)?\/\(cur\|new\)/.*' -type f -delete
fi
fi
# train spam
if [ -d $spamdir ]; then
spamcount=$(find $spamdir -regex '.*\(/.*\)?\/\(cur\|new\)/.*' -type f | wc -l)
if [ $spamcount -ge 1 ]; then
echo "Learning junk from $spam/cur"
sa-learn --spam --showdots --dbpath $DBPATH $spamdir/cur
find $spamdir -regex '.*\(/.*\)?\/\(cur\|new\)/.*' -type f -delete
fi
fi
done
done
chown -R amavis:amavis $SADIR
Das Skript ist sicherlich nicht optimal, sollte aber, ob des mehr an Abfragen, sa-learn nur noch aufrufen, wenn auch wirklich E-Mails fürs Training vorhanden sind. Desweiteren werden die gelernten E-Mails im Anschluss gelöscht.



