Spam/Ham einsortieren und Remote Training von SpamAssassin

Aus JanaWiki
Wechseln zu: Navigation, Suche

HowTo Spam/Ham in IMAP-Mailbox einsortieren

Dieser Artikel entstand auf Wunsch einiger Leute aus dem Jana-Forum in Bezug auf folgenden Thread: http://www.janaforum.de/jana_forum/thread.php?threadid=13527

Benötigte Skripte

Die benötigten Skripte können als Zip-Archiv unter einem der folgenden Links heruntergeladen werden:
http://www.fam-hauck.de/Bin/SpamAssassin.zip (Stand: 04.09.2006)
http://www.kaiserauer.org/includes/modules/downloads/sendfile.php?file=SpamAssassin.zip (Stand: 04.09.2006)
(MD5: f8c8954e8b31236c51e7de6dd87213ee | 6,25 KB)

Konfiguration

Das 7-Zip Archiv beinhaltet zwei Verzeichnisse. Im Ordner "Call" sind die nötigen Files für den Aufruf aus Jana und das Einsortieren in die Imap-Mailbox. Im Ordner "Training" sind die nötigen PHP-Files für den Aufruf vom Web aus (Remote Training).

Zunächst müssen im Ordner "Call" die Files "config.php" und "spam_sort.bat" editiert und die Pfadangaben angepasst werden. Die beiden letzten set-Befehle im Abschnitt ":settings" dienen dabei nur zur Ermittlung der Anzahl Spam/Nospam (Statistik). Im File "config.php" muss der Jana-Imap-User und die maximale Größe zu scannender Mails angegeben werden (Mails größer 1MB sind selten Spam, allein schon wegen dem Traffic. Die Größe kann hier beschränkt werden, um Timeouts bei der Klassifizierung zu verhindern).

Integration in Jana

Der Aufruf von Jana erfolgt unter Email-Erweitert - Benutzer - Auszuführendes Programm mit folgender Befehlszeile:

e:\jana\batch\spam_sort.bat $FILE$

Die Kontrollkästchen "Programm ausführen" und "Nach Programmausführung Emails löschen" müssen aktiviert sein (letzteres kann zum Testen deaktiviert bleiben bis alles funktioniert, damit keine Mails verloren gehen. Der Benutzer bekommt solange allerdings alle Mails doppelt, einmal klassifiziert und einmal unklassifiziert). Achtung!! Unbedingt Update unten lesen!!!

Beim entsprechenden Benutzer sollten vorher noch die Ordner SPAM und HAM als Unterordner von Inbox angelegt werden. Die Verzeichnisse dienen später als Quelle zum Trainieren (Spammails werden in den Unterordner SPAM einsortiert).

Remote Training

Die Mails im Inbox-Unterordner SPAM können durchgesehen werden und eventuelle False Positives (fälschlich als Spam markierte Mails) in den Ordner HAM verschoben werden. Mails, die nicht trainiert werden sollen, können gelöscht werden.
Um SpamAssassin von unterwegs trainieren zu können, müssen die Files aus dem Ordner "Training" über Janas HTTP-Server im Web verfügbar gemacht werden (am Besten über .htaccess geschützt). Vorher muss noch das File config.php entsprechend angepasst werden.
Durch Aufruf der Datei "spam-learn.php" über den Browser werden die Mails im Unterordner SPAM als Spam trainiert und anschließend gleich gelöscht! Vor dem Trainieren also immer den Ordner durchschauen nach Mails, die man noch braucht!
Durch Aufruf der Datei "ham-learn.php" über den Browser werden die Mails im Unterordner HAM als Ham trainiert und anschließend natürlich NICHT gelöscht (die Mails will man ja schließlich noch haben). Nach dem Training können die Mails nach Belieben einsortiert werden.
Es empfiehlt sich, in der php.ini die Schalter "max_execution_time" und "max_input_time" zu erhöhen (je mehr Mails trainiert werden sollen, desto höher). Natürlich auch die maximale Ausführungszeit für Skripte in Janas Http-Server entsprechend erhöhen! Sonst wird die Ausführung des Skripts vorzeitig abgebrochen.
Nach dem Trainieren (das einige Zeit in Anspruch nimmt) wird im Browserfenster eine kurze Zusammenfassung der trainierten Mails und eine kleine Statistik der bereits in der Datenbank trainierten Mails angezeigt.

Beispiel:

SpamAssassin SPAM Trainingsreport

Training ...
Mailfile: In_00001.mai, Errorlevel: 0
Mailfile: In_00002.mai, Errorlevel: 0
Mailfile: In_00003.mai, Errorlevel: 0
Mailfile: In_00004.mai, Errorlevel: 0
Mailfile: In_00005.mai, Errorlevel: 0
Mailfile: In_00006.mai, Errorlevel: 0

Trainingserfolg:
Learned tokens from 1 message(s) (1 message(s) examined)
Learned tokens from 1 message(s) (1 message(s) examined)
Learned tokens from 1 message(s) (1 message(s) examined)
Learned tokens from 1 message(s) (1 message(s) examined)
Learned tokens from 1 message(s) (1 message(s) examined)
Learned tokens from 1 message(s) (1 message(s) examined)

Statistik Bayes-Datenbank:
bayes db version: 3
nspam: 8851
nham: 538
ntokens: 189960

Seite in 37.068 Sekunden generiert.

Update vom 28.07.2006

SpamAssassin in der Version 3.1.2 brauchte öfters mal auch bei kleinen Mails (paar KB) extrem lange für die Klassifizierung. Dabei lief die aufrufende "spam_sort.bat" in einen Timeout, sodass die während der Klassifizierung temporär angelegten Files "temp_unix.mai" und "temp_win.mai" nicht gelöscht wurden . Die aufrufende "spam_sort.bat" wartet aber darauf, bis die Files gelöscht sind, um bei gleichzeitigem Aufruf von mehreren Instanzen der "spam_sort.bat" durch Jana gegenseitiges Überschreiben der Files zu verhindern. Da die Files aber von der vorhergehenden (in den Timeout gelaufenen) Klassifizierung durch Spamassassin noch existierten, liefen alle folgenden Klassifizierungen unweigerlich in den Timeout.
In der jetzigen Download-Version des Skripts gibt es im Unterordner "call" eine weitere Datei mit Namen "prevtimeout.php". Diese wird in der überarbeiteten Version der "spam_sort.bat" im Abschnitt ":wait" aufgerufen und vergleicht den aktuellen Timestamp beim Aufruf mit dem Timestamp der beiden Files "temp_unix.mai" und "temp_win.mai". Ist der Unterschied größer als 5 min (in der Datei "prevtimeout.php" einstellbar, so lange dauert normalerweise keine Klassifizierung), werden die beiden Files umbenannt (unter Berücksichtigung des aktuellen Datums und einer Zufallszahl), so dass es bei nachfolgenden Klassifizierungen keine Probleme mehr gibt und die Timeout-verursachenden Mails nicht verloren gehen.

Update vom 24.08.2006

Vor dem Urlaub dieses Jahr fiel mir auf, dass mein Autoresponder nicht mehr funktionierte. Durch einen Tipp von Thomas Hauck stellte sich heraus, dass der Autoresponder nicht aktiv werden kann, wenn bei der Benutzerschnittstelle der Haken bei "Email löschen" gesetzt ist. Aus diesem Grund habe ich das Skript etwas abgeändert.
Es sind jetzt nur noch vier Dateien im Ordner "Call" vorhanden. Auf die Dateien "iocopy.exe", die "prevtimeout.php" und "nospam.php" kann jetzt verzichtet werden. Gleichzeitiger Zugriff auf eine Datei bei mehreren laufenden Instanzen der "spam_sort.bat" kann nicht mehr vorkommen, da jetzt Jana's eigene Dateinamen verwendet werden (Danke an Thomas Hauck für den Tipp). Damit kann auf die Warteschleife im Skript und damit auch auf die "prevtimeout.php" verzichtet werden.
Die "iocopy.exe" ist auch überflüssig geworden, da Jana selbst keine Probleme mit Unix-codierten Files hat (Fehler trat nur in Verbindung mit einem anderen PHP-Sortierskript auf, das ich nicht mehr verwende).

Achtung!!!
Die Einbindung in Jana hat sich geändert! Der Haken "Nach Programmausführung E-Mails löschen." bei der Benutzerschnittstelle darf NICHT gesetzt werden! Stattdessen muss der Haken bei "Löschen der E-Mail nach Programmaufruf bei Rückgabewert von:" gesetzt und als Rückgabewert eine 1 eingetragen werden. Ansonsten verschwinden Nicht-Spam Mails im Nirvana!
Durch einfaches Nachstellen eines Benutzernamens in der Kommandozeile taucht dieser im Logfile auf, z.B.:

e:\jana\batch\spam_sort.bat $FILE$ Hans

Update vom 04.09.2006

1. Bugfix
Beim Aufruf der "limitmailsize.php" aus der "spam_sort.bat" wurde der Errorlevel nicht richtig ausgewertet, was zur Folge hatte, dass alle Mails (auch leere und zu große) auf Spam geprüft wurden. Die Einstellung in der "config.php" für die maximale Email-Größe für zu prüfende Dateien war damit wirkungslos, was jetzt behoben ist.

2. Temporäre Dateien
Es kommt immer noch hin und wieder vor, dass SpamAssassin für die Klassifizierung zu lange braucht und die aufrufende Batch ("spam_sort.bat") in einen Timeout läuft. Das ganze ist jedoch nicht weiter tragisch, da der Errorlevel dann 259 beträgt. Da Jana die ursprüngliche Mail aber nur bei Errorlevel 1 (Spam) löscht, landet die Mail trotzdem beim entsprechenden User. Bei jedem Timeout bleibt jedoch eine .tmp-Datei in Janas Mail-Verzeichnis zurück. Damit sich diese nicht ansammeln, ist in der aktuellen Download-Version die Datei "deltemp.php" dabei, die auch von der "spam_sort.bat" aufgerufen wird. Dabei wird das letzte Änderungsdatum aller .tmp-Dateien in Janas Mailverzeichnis gelesen, und alle .tmp-Dateien, die älter als eine einstellbare Anzahl Minuten sind, werden gelöscht. Somit wird die aktuelle .tmp-Datei nicht angetastet, nur die alten werden gelöscht. Die entsprechenden neuen Variablen befinden sich ebenfalls in der "config.php".