Spamassassin MySQL Statistik

1. Spamassassin - Bayes-DB in MySQL-Datenbank

Spamassassin bietet die Möglichkeit, die Bayes-DB, die Autowhitelist, Userprefs sowie eine Statistikfunktion in eine MySQL-Datenbank auszulagern. Das schafft viel Spielraum, was Flexibilität, Geschwindigkeit, Funktionalität angeht. Bei einer kleinen Bayes-DB und wenigen Mails pro Tag macht eine Umstellung auf die MySQL-DB trotzdem Sinn. Mit jedem weiteren Satz, der in die DB geschrieben wird, steigt der Vorteil gegenüber der dateibasierenden Lösung. Als Zuckerbrot für den geringen Aufwand gibt es noch eine praktische Statistik (Tag, Monat, akt. Jahr, Bayes Info) oben drauf.

Ich gehe davon aus, daß Spammassassin vernünftig und ohne Fehlermeldungen im Maillog eingerichtet wurde und läuft. Zunächst machen wir uns eine Kopie der Bayes-DB.

sa-learn --backup > bayes.db

Diese brauchen wir später für den Import in die MySQL-DB. Eine Sicherungskopie von einer perfekt angelernten Bayes schadet übrigens nie. Spamassassin benötigt noch ein Modul für die Kommunikation mit MySQL: DBD::mysql Dieses installieren am besten mit CPAN:

perl -MCPAN -e shell
install DBD::mysql

Nun benötigen wir noch eine Datenbank unter MySQL. Nennen wir diese zB. “spamassassin”. Im nächsten Schritt legen wir noch einen User in MySQL an und geben diesen alle Rechte innerhalb der DB “spamassassin”. Dann legen wir das Datenbankschema an:

mysql -h <hostname> -u <adminusername> -p databasename < bayes_mysql.sql

Nun müssen wir Spamassassin noch mitteilen, das er zukünftig seine Bayes-DB in der MySQl-Datenbank suchen soll. Dazu fügen wir in der local.cf folgende Einträge hinzu:

########### Bayes-DB in MySQL-Datenbank #####################
bayes_store_module      Mail::SpamAssassin::BayesStore::SQL
bayes_sql_dsn           DBI:mysql:spamassassin:localhost:3306
bayes_sql_username      username
bayes_sql_password      password
bayes_sql_override_username filter
#############################################################

die Directive bayes_sql_override_username gibt einen User an, unter dem die Daten in die Bayes geschrieben werden. Das ist dann von Bedeutung, wenn Spamassassin zur Laufzeit den User wechselt. Im nächsten Schritt kommentieren wir die Zeilen:

#bayes_path /var/spool/filter/.spamassassin/bayes
#bayes_file_mode 0755

aus. Das ist wichtig, da Spamassasin sonst weiterhin die dateibasierende Bayes verwendet. Dann starten wir den Spamd Daemon neu:

/etc/init.d/spamd restart

Startet dieser ohne Fehlermeldung durch, kontrollieren wir das Logfile (maillog) und prüfen mittels:

spamassassin --lint -D

ob der Zugriff auf die MySQL-DB funktioniert. Ist dies der Fall, ist es an der Zeit die gesicherte Bayes-DB wieder einzuspielen:

sa-learn  --restore bayes.db

Ein anschließendes: sa-learn –dump magic sollte dann die alten Zahlen wieder zum Vorschein bringen.

2. Spamassassin - Autowhitelist in MySQL-Datenbank

Auch die Autowhitelist kann man in die MySQl-DB verfrachten. Da wir die Datenbank und den MySQL-User schon angelegt haben, benötigen wir nur noch die entsprechende Relation und einige wenige Einträge in der local.cf

########### Autowhitelist in MySQL-Datenbank ################
auto_whitelist_factory Mail::SpamAssassin::SQLBasedAddrList
user_awl_dsn DBI:mysql:spamassassin:localhost:3306
user_awl_sql_username username
user_awl_sql_password password
user_awl_sql_table awl
#############################################################

Auch die bestehende AutoWhitelist lässt sich in die MySQl-DB übertragen. Wir benötigen das Script convert_awl_dbm_to_sql . An der Shell passen wir den Quellpfad zur AWL und den zu importierenden User an:

perl convert_awl_dbm_to_sql —username filter —dsn DBI:mysql:spamassassin:localhost:3306 —ok —sqlusername username —sqlpassword password —dbautowhitelist /var/spool/filter/.spamassassin/auto–whitelist

Auch hier starten wir den spamd neu und kontrollieren das Maillog.

3. Spamassassin - Statistik in MySQL-Datenbank

Für Spamassassin gibt es ein Statistik-Plugin, welches ebenfalls MySQL nutzt und das sich leicht integrieren lässt. Wir legen dazu lediglich die Relation “stats” in der “spamassassin”-DB an, kopieren die “stats.pm” in die Spamassassin Plugin-Directory, fügen folgende Zeilen in die init.pre ein:

# Stats Plugin - store stats in a MySQL DB
#
loadplugin Mail::SpamAssassin::Plugin::Stats

und folgende Zeilen in die local.cf :

##################### SQL Statistik  ########################
use_stats                1
user_stats_dsn           DBI:mysql:spamassassin:localhost:3306
user_stats_sql_username  username
user_stats_sql_password  password
user_stats_sql_table     stats
#############################################################

Spamassassin sollte nun die Anzahl der geprüften Mails pro Tag bezüglich Spam und Ham in die Relation “stats” schreiben. Ich habe mir ein kleines PHP-Script geschrieben, welches diese Daten visualisiert. Es zeigt die jeweiligen Tage des aktuellen Monates + User, die Domain(wenn vorhanden) sowie jeweils die Anzahl der Spam- bzw. Hammails. Eine zusätzliche Tabelle zeigt die Gesamtzahl von Spam und Ham in den jeweils vergangenen Monaten des aktuellen Jahres + Bayes Infos (”bayes_seen”). Die letzte Tabelle zeigt Informationen wie: User (Spam/Ham), Anzahl der gelernten Tokens, zeitlich erster/neuster Eintrag in der DB. Als Quelle dient hier die Relation “bayes_vars”

Download: spam-sqlstats.php.txt

Spamstatistik

 

Rico

16 Kommentare zu “Spamassassin MySQL Statistik”

  1. 1. Freebie-Blog schrieb:

    Moin,
    super Anleitung. Habe das bei mir auch so eingebaut und funktioniert super. Leider funktioniert der Link für die spam-sqlstats.php.txt nicht mehr.
    Kannst du die nochmal woanders uploaden?

  2. 2. Rico schrieb:

    @1
    Server ist nun online. Habe Dir eine Mail geschickt.

    Gruss Rico

  3. 3. Freebie-Blog schrieb:

    Hat geklappt. Danke schön.

  4. 4. dramesis schrieb:

    Klasse Anleitung, hat ohne Probs. geklappt!

  5. 5. dramesis schrieb:

    leider habe ich doch noch einen fehler der aufgetaucht ist.

    dbg: stats: no DSN specified; HALT!

    obwohl ich alle Angaben gemacht habe

    user_stats_dsn DBI:mysql:spamassassin:localhost:3306

    Hast du ne Idee???

  6. 6. Rico schrieb:

    Bist Du sicher, das das “Stats”-Plugin auch geladen wird?
    Was sagt denn Dein “maillog”?
    Spamassassin neu gestartet?
    Das Plugin auch richtig kopiert? Das muss evtl. nach:
    /xxx/xxx/perl5/vendor_perl/5.8.0/Mail/SpamAssassin
    /xxx/xxx/vendor_perl/5.8.0/Mail/SpamAssassin/Plugin
    etc.
    Evtl. die Datei Stats.pm einfach in alle Verzeichnisse
    kopieren, die im maillog mit “not found” o.ä. beanstandet werden.
    Gruss Rico

  7. 7. dramesis schrieb:

    Hallo Rico,

    danke habe den fehler gefunden, lag an meiner local.cf, jetzt klappts, danke.

  8. 8. Brook schrieb:

    Klasse Anleitung - Danke

    Wann wird denn die spam-sqlstats.php.txt wieder verfügbar sein?

  9. 9. Mowgly schrieb:

    Supergeniale Anleitung vielen Dank.
    Habe es eingebaut. Blos bei der whitelist, da bekomme ich folgenden Fehler:
    Befehl:
    perl convert_awl_dbm_to_sql -username -dsn DBI:mysql:bayes:localhost:3306 -ok -sqlusername -sqlpassword -dbautowhitelist /var/spool/spamassassin/auto-whitelist

    Cannot open file /var/spool/spamassassin/auto-whitelist: Ungültiger Dateideskriptor

    ‘Die Datenbank habe ich bayes genannt’

    verzeichnis:
    /var/spool/spamassassin/
    -rw-r–r– 1 root root 0 2008-09-23 21:47 auto-whitelist

    selbste ein chmod 766 hat nicht’s genützt…
    Evtl hast du noch ein Ratschlag?

    Danke …Super Arbeit …weiter so.

    Gruß
    Mowgly

  10. 10. Martin Zeug schrieb:

    Hi,
    hast du deine spam-sqlstats.php.txt noch? Wäre echt super wenn du mir das zukommen lassen könntest, sont muss ich mir das ganze nachbauen.

    Danke,

    Martin

  11. 11. Rico schrieb:

    @Martin
    Du hast Post.
    Der Server ist oft, aber nicht immer online, da dieser bei mir daheim steht.

    Grüße,

    Rico

  12. 12. Martin Zeug schrieb:

    Genial, vielen Dank für die schnelle Antwort.
    Martin

  13. 13. Rico schrieb:

    Hinweis:

    Ich habe soeben einen Fehler in der MySQL-Abfrage für den aktuellen Monat entdeckt, der dazu führt, daß auch Ergebnisse der vorangegangenen Jahre aufgelistet werden. Die Datei “spam-sqlstats.php.txt” (siehe oben) einfach neu vom Server laden und das Problem ist behoben.
    Ansonsten die Zeile (250; $sql=SELECT day…”) nach “$aktmon” um “and YEAR(day) = $aktjahr” erweitern.

    ;)

  14. 14. Manuel Reil schrieb:

    Hallo Rico,

    könntest du bitte die spam-sqlstats.php.txt nochmals zu Verfügung stellen (auf den Server, per Mail). Das wär super, dank.

    Manuel

  15. 15. Rico schrieb:

    Hallo Manuel, Link sollte nun funktionieren. Ich schicke Dir die Datei zur Sicherheit aber nochmals per Mail.

    Frohe Weihnachten und einen erfolgreichen Start 2010!

    Rico

  16. 16. Andreas schrieb:

    Leider funktioniert der Link zum Download des Scripts nicht. Kannst du das Script nich direkt auf dieser Seite zum Download anbieten?

    Gruß Andreas

  17. Home

Dein Kommentar