Spamhandling mit imapfilter

  Ephraim   Lesezeit: 5 Minuten  🗪 8 Kommentare

Spamfilter unter Debian auf einem Server.

spamhandling mit imapfilter

Ok, Spam nervt und deshalb liebe ich die Funktion in Thunderbird eine Nachricht mit nur einem Klick als Spam zu definieren. Mittlerweile filtert Thunderbird mir ziemlich gut den Spam aus. Da ich aber meine Mails auch auf dem Laptop oder dem Smartphone lese, müsste ich entweder den Rechner die ganze Zeit laufen lassen, den Spamfilter dreimal pflegen oder mit dem Spam leben. Die ganze Zeit den Rechner laufen lassen, muss ja nicht sein. Aber mein Server, läuft ja eh, also ein wenig gegoogelt und da bin ich über mapfilter gestolpert. Dieses kleine, aber geniale Programm meldet sich via IMAP am Mailserver an, prüft die Mails nach Schlüsselworten und sortiert die unerwünschten aus.

Die Installation ist, zumindest unter Debian, recht simpel:

sudo apt install imapfilter

installiert das entsprechende Paket.

In meinem Homeverzeichnis lege ich einen Ordner .imapfilter an:

mkdir ~/.imapfilter

Darin eine Datei config.lua:

nano ~/.imapfilter/config.lua

In dieser Datei wird nun die Config und die Filter hinterlegt. Ich gebe hier mal meine Empfehlung an. Wer mehr wissen will, dem empfehle ich die man pages zu imapfilter.

options.timeout = 120
options.create = true
options.subscribe = true
options.expunge = true

Dann die Config des/der Mailaccounts:

workserver1 = IMAP {
        server = "imap.example.org",
        username = "mail-1@example.org",
        password = "Geheim0815",
        ssl = "auto"
    }
    workserver2 = IMAP {
        server = "imap.example.org",
        username = "mail-2@example.org",
        password = "Geheim0815",
        ssl = "auto"
    }   

Nun für jeden Account Filter bauen:

    spam1 = (
        – Filter nach Absender --
                workserver1.INBOX:contain_from("newsletter@nervbolzen.de") +
                workserver1.INBOX:contain_from("!Wichtig!") +
        -- Filter nach Body inhalt --
                workserver1.INBOX:contain_body("Werbung") +
        -- Filter nach Betreff ---
                workserver1.INBOX:contain_subject("Wichtig") + 
            workserver1.INBOX:contain_subject("Werbung") 
    )
Und dann die entsprechende Aktion, die ausgeführt werden soll, wenn Treffer (verschieben in Ordner „SPAM“):
    spam1:move_messages(workserver1.SPAM)

Das gleiche für den zweiten Mailaccount:

    spam2 = (
        – Filter nach Absender --
                workserver1.INBOX:contain_from("newsletter@nerbolzen.de") +
                workserver1.INBOX:contain_from("!Wichtig!") +
        -- Filter nach Body inhalt --
                workserver1.INBOX:contain_body("Werbung") +
        -- Filter nach Betreff ---
                workserver1.INBOX:contain_subject("Wichtig") + 
            workserver1.INBOX:contain_subject("Werbung") 
    )
    spam2:move_messages(workserver1.SPAM)

Das kann man beliebig ergänzen, aber! Wichtig, die letzte Workserver-Zeile (Filter-Zeile) hat kein „+“ mehr am Ende.

Dann ein kleines Script erstellt, dass imapfilter aufruft:

nano ~/.imapfilter/run_spamfilter.sh

    #!/bin/bash
    d=`date +%d-%m-%Y_%H:%M:%S`
    echo $d >> $HOME/.imapfilter/imapfilter.log
    /usr/bin/imapfilter -c $HOME/.imapfilter/config.lua >> $HOME/.imapfilter/imapfilter.log
    d=`date +%d-%m-%Y_%H:%M:%S `
    echo $d >> $HOME/.imapfilter/imapfilter.log
    echo '============================' >> $HOME/.imapfilter/imapfilter.log

Dann dieses Script per cron regelmäßig ausführen: crontab -e

Und da folgendes eingefügt: */30 * * * * /home/ACCOUNT/.imapfilter/run_spamfilter.sh Das führt das Script aller 30 Minuten aus. Wobei „ACCOUNT“ natürlich durch den Accountnamen ersetzt werden muss, in dessen Home Verzeichnis das Skript liegt.

Das war es schon.

Man sollte sich gut überlegen, wonach man filtert. Ein Filter nach „Kredit“ lässt zwar die nervige Werbung verschwinden, aber eine Nachricht der Hausbank, dass mit dem „Hauskredit“ was nicht stimmt, geht genauso verloren. Auch machen es Spammer einem nicht leicht. So werden gern Mails mal mit „Kredit“ mal mit „Kre-dit“ mal mit „Kred1t“ verschickt. Man muss dann natürlich 3 Filter erstellen. Imapfilter ist also nicht 100%ig, aber es reduziert den Müll im Postfach doch deutlich.

Quellen:
https://github.com/lefcha/imapfilter

Brett Jordan via Unsplash: https://unsplash.com/photos/blue-and-white-logo-guessing-game-LPZy4da9aRo

Tags

E-Mail, Bash, Spam

nix
Geschrieben von nix am 24. Oktober 2023 um 11:19

"eine Nachricht der Hausbank" - Nein, Sorry das Beispiel ist nicht nur unglücklich gewählt, es ist schlicht falsch. Eine Hausbank - eine gute vor allem - verschickt keine Emails bei irgendwas was Relevanz. Sie ruft an oder sendet einen klassischen Brief per Post.

Ephraim
Geschrieben von Ephraim am 24. Oktober 2023 um 13:50

Grundsätzlich stimme ich dir zwar zu, aber ich bin bei einer Online-Bank, die tatsächlich auch E-Mails senden. Grundsätzlich war es aber einfach als Beispiel gemeint, dass man aufpassen sollte, was gefiltert wird. LG.

chris_blues
Geschrieben von chris_blues am 24. Oktober 2023 um 12:15

Warum nicht rspamd nutzen? Da erspart man sich dieses ganze händische Gebastel. Dem gibt man einfach ein vorhandenes Postfach zu fressen, dann weiß der schon ziemlich gut, was Spam ist und was nicht...

D.
Geschrieben von D. am 25. Dezember 2023 um 09:28

Ich habe mir rspamd mal angesehen, aber das scheint ja um einiges "fetter" zu sein. Mit Webinterface und eigenem Mailserver. Interessant, aber das ist schon eine recht fette Kanone für einen sehr kleinen Spatzen ;-)

Ing
Geschrieben von Ing am 24. Oktober 2023 um 14:25

Danke, das kante ich noch nicht. Erinnert mich etwas an den Spamihilator, für den es unter Linux leider nichts gibt, dass irgendwie auf Augenhöhe wäre oder ich hab es nur noch nicht gefunden. Klar Spamasssasin & Co machen einen guten Job und sind Server seitig nicht wegzudenken, die Arbeitsweise vom Spami bilden die aber nicht ab und sind deutlich schwieriger zu konfigurieren.

DxU
Geschrieben von DxU am 24. Oktober 2023 um 20:52

Wir hatten neulich mailbox.org im Chat als Thema. Wie dort umgesetzt halte ich es für besser, Spamfilterung auf dem Server arbeiten zu lassen, konfiguriert von Leuten die wissen was sie tun. Bei mir kommt da so gut wie kein Spam durch und das was mal durch kommt, ist kaum der Rede wert. Ein sehr seltener (!) beherzter Druck auf die DEL Taste in so wenigen Fällen stört mich nicht oder ich blackliste die seltenen Fälle dann eben doch mal. Eine eigene Konfiguration, die im nach hinein filtert rechtfertigt da den Aufwand nicht. Und statt im lokalen Client mache ich meine Anpassungen lieber im Webmailer 1x, dann hat der lokale Client und ich später weniger zu tun.

Mag natürlich bei Nutzern von Billo Angeboten anders sein, kostet ja nix, da macht man die Arbeit halt selbst und freut sich wenn der Anbieter mit den Daten der Kunden Geld verdient. Merke "Wenn der Dienst nichts kostet, bist du die Ware"

Robert
Geschrieben von Robert am 15. Dezember 2023 um 08:56

imapfilter habe ich bisher zum Sortieren benutzt (Bank => Ordner Bank, Shops => Ordner Käufe, usw.).

Was ich bisher nicht geschafft habe, dass ich imapfilter dazu überrede bei einer neuen E-Mail mit Eckdaten xyz (z.B. Betreff "Bank") ein Bash-Script anzustossen.

Hintergrund: Ich würde mich gerne bei sehr wichtigen E-Mails automatisch per Messenger benachrichtigen lassen. Das würde mit einem aufzurufenden Script funktionieren. Den Messenger habe ich schon lauffähig und das Linuxsystem kann mir per Script auch Nachrichten senden.

Irgendwelche Ideen?

tex
Geschrieben von tex am 19. Februar 2024 um 10:44

Hey. Das geht mit "pipe_to".

for _, msg in ipairs(results) do pipe_to('python3 /mnt/example-script.py') end