Startseite » Forum » LiveConfig-Foren (deutsch) » Tipps & Tricks » Spamassassin Trainer
Ergebnis 1 bis 6 von 6
  1. #1
    Benutzer
    Registriert seit
    07.08.2013
    Beiträge
    38

    Spamassassin Trainer

    Ich habe mal einen Trainer für Spamassassin gebastelt. Er sucht in allen Postfächern nach Ordnern, die mit "Junk" oder "Spam" beginnen und behandelt den Inhalt als Spam-Mails. Wobei nur der Spamassassin-Teil des Postfachs trainiert wird.
    Ebenso trainiert er den Spamassassin, dass alle Mails im Posteingang "Ham" sind. Das Aufräumen ist auch inkludiert.

    Würde ich per Cron oder cron.daily einbinden.

    Feedback und Verbesserungen sind jederzeit willkommen. Ich bin mir sicher, dass das Skript auch kürzer zu programmieren ist.

    Code:
    #!/bin/bash
    
    #JUNK_FOLDERS=$(find /var/mail -type d -name '.Junk*')
    #SPAM_FOLDERS=$(find /var/mail -type d -name '.Spam*')
    
    # Find all folders beginning with "Junk" and treat contents as Spam --> train spamassassin
    find /var/mail -type d -name '.Junk*' -print0 | while read -d '' -r JUNK;
    do
            echo "$JUNK"
            _CONTRACT=$(echo $JUNK | awk -F/ '{ print $4 }')
            _USER=$(echo $JUNK | awk -F/ '{ print $5 }')
    
            if [ -d "/var/lib/spamassassin/${_CONTRACT}_${_USER}/" ]; then
                    echo $(sa-learn --progress --spam --dbpath /var/lib/spamassassin/${_CONTRACT}_${_USER}/ "$JUNK")
            fi
    done
    
    # Find all folders beginning with "Spam" and treat contents as Spam --> train spamassassin
    find /var/mail -type d -name '.Junk*' -print0 | while read -d '' -r SPAM;
    do
            echo "$SPAM"
            _CONTRACT=$(echo $SPAM | awk -F/ '{ print $4 }')
            _USER=$(echo $SPAM | awk -F/ '{ print $5 }')
    
            if [ -d "/var/lib/spamassassin/${_CONTRACT}_${_USER}/" ]; then
                    echo $(sa-learn --progress --spam --dbpath /var/lib/spamassassin/${_CONTRACT}_${_USER}/ "$SPAM")
            fi
    done
    
    # Treat all mails in the Inbox as Ham and train spamassassin
    find /var/mail -mindepth 2 -maxdepth 2 -type d -print0 | while read -d '' -r HAM;
    do
            echo "${HAM}/"
            _CONTRACT=$(echo $HAM | awk -F/ '{ print $4 }')
            _USER=$(echo $HAM | awk -F/ '{ print $5 }')
    
            if [ -d "/var/lib/spamassassin/${_CONTRACT}_${_USER}/" ] && [ -d "${HAM}/cur/" ]; then
                    echo "${HAM}/cur/"
                    echo $(sa-learn --progress --ham --dbpath /var/lib/spamassassin/${_CONTRACT}_${_USER}/ "${HAM}/cur/")
                    echo $(sa-learn --sync --dbpath /var/lib/spamassassin/${_CONTRACT}_${_USER}/)
            fi
    done
    
    /usr/bin/sa-learn --sync
    echo "Finished daily auto-learning of SpamAssassin."

  2. #2
    Benutzer
    Registriert seit
    24.04.2019
    Beiträge
    50
    Hi Nette Idee, mir ist aufgefalen, das der den .Junk Ordner im letzten Teil, bei --ham auch mit einliest
    Geändert von BMK-Media (08.07.2019 um 15:42 Uhr) Grund: anderes erledigt

  3. #3
    Benutzer
    Registriert seit
    07.08.2013
    Beiträge
    38
    Guten Morgen,

    welches Betriebssystem verwendest Du? Hast Du Spamassassin installiert und Postfächer zur Verwendung von Spamassassin aktiviert? Unter Debian werden die Dateien im "LOCAL_STATE_DIR" abgelegt. Den Ort kannst Du über die Debug-Ausgaben von Spamassassin herausfinden.

    Und ja, kann sein, dass das Skript einen Fehler enthält. Es steht ja dabei, dass Verbesserungen jederzeit willkommen sind.

    Nachtrag: Ich habe bei mir das Lernen von HAM aus der Inbox abgeschalten, da dort auch aller unerkannter Spam vor dem Taggen durch den Benutzer landet.
    Geändert von marinal (08.07.2019 um 06:52 Uhr)

  4. #4
    Benutzer
    Registriert seit
    24.04.2019
    Beiträge
    50
    Zitat Zitat von marinal Beitrag anzeigen
    Ich habe bei mir das Lernen von HAM aus der Inbox abgeschalten, da dort auch aller unerkannter Spam vor dem Taggen durch den Benutzer landet.
    Das könnte sein, weil er ja auch den .Junk und .Trash Ordner mit in --ham eingelesen hat.

    Zitat Zitat von marinal Beitrag anzeigen
    Und ja, kann sein, dass das Skript einen Fehler enthält. Es steht ja dabei, dass Verbesserungen jederzeit willkommen sind.
    Code:
    find /var/mail/ -mindepth 2 -maxdepth 2 -type d -print0 | while read -d '' -r HAM;
    do
            echo "${HAM}/"
            _CONTRACT=$(echo $HAM | awk -F/ '{ print $4 }')
            _USER=$(echo $HAM | awk -F/ '{ print $5 }')
            _FOLDER=$(echo $HAM | awk -F/ '{ print $6 }');
    
            if [ ${_CONTRACT} != "sieve" ]; then
                    if [[ "$_FOLDER" != ".Junk"* ]] && [[ "$_FOLDER" != ".Trash"* ]] && [[ "$_FOLDER" != ".Drafts"* ]] && [[ "$_FOLDER" != ".Sent"* ]] && [[ "$_FOLDER" != "tmp" ]] && [[ "$_FOLDER" != "new"* ]]; then
                            if [ -d "/var/lib/spamassassin/${_CONTRACT}_${_USER}/" ] && [ -d "${HAM}/cur/" ]; then
                                    echo "${HAM}/cur/"
                                    echo $(sa-learn --progress --ham --dbpath /var/lib/spamassassin/${_CONTRACT}_${_USER}/ "${HAM}/cur/")
                                    echo $(sa-learn --sync --dbpath /var/lib/spamassassin/${_CONTRACT}_${_USER}/)
                            fi
                    fi
            fi
    done
    Ich habe "$_FOLDER" genutzt, statt ${_FOLDER}, da einige Kunden von mir Leerzeichen im Ordner haben.

    Und z.B. [[ "$_FOLDER" != ".Sent"* ]] weil einige, auch ich Unterordner im Sent & Co haben
    Geändert von BMK-Media (08.07.2019 um 15:41 Uhr) Grund: Final

  5. #5
    Erfahrener Benutzer
    Registriert seit
    07.04.2011
    Beiträge
    740
    Zwei Vorschläge:

    - statt über "find" zu gehen, "doveadm search" sowie "doveadm fetch" verwenden. Weniger Bash-Foo und somit weniger fehleranfällig.
    - Dovecot hat Plugins für diesen Zweck: https://wiki2.dovecot.org/Plugins/Antispam

  6. #6
    Benutzer
    Registriert seit
    07.08.2013
    Beiträge
    38
    Hallo Anton,
    lange nichts mehr direkt von Dir gelesen.
    Danke für Deinen Vorschlag. Wollte Dir schon letztes Jahr antworten.
    doveadm search bringt meines Erachtens nicht die Ergebnisse, da mein Skript benutzerbasiert funktioniert. Bayes lernt somit bei jedem Benutzer, was für diesen Spam ist. Ham habe ich mittlerweile herausgenommen.

    Nachdem es keine einheitliche Regel gibt, wie Spamordner zu heißen haben, brauche ich eine Wildcard bzw. eine Regex.

    Das Dovecot-Plugin war bereits letztes Jahr "deprecated". Hier wäre Sieve eine Alternative, aber auch dort habe ich das Problem, dass die Spam-Ordner nicht einheitlich sind.

    Oder habe ich irgendwas übersehen?

    Viele Grüße
    Alexander

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •