Der Mailfilter


Der Hamster besitzt einen eingebauten Mailfilter, mit dem entschieden werden kann, welche Mails mit welchen Eigenschaften geladen werden sollen oder nicht. Der Mailfilter wird in eine Textdatei namens "Mailfilt.hst" ins Hamsterstammverzeichnis geschrieben. Diese Datei muß manuell angelegt werden, da sie standardmäßig nicht vorhanden ist.

Zum Editieren klickst Du im Hamster nur auf Einstellungen/Mail-Score-/Killfile oder Du öffnest Die Datei mit Deinem Lieblingseditor direkt aus dem Hamsterverzeichnis.

Die Mailfilt.hst besteht aus einer oder mehreren Sektionen, die in eckige Klammern "[*]" geschrieben werden. Unter diesen Sektionsbegrenzern erfolgen dann die Einträge zum Filtern auf die jeweiligen Headerzeilen.

Anweisungen, was mit den Mails geschehen soll:

Befehl Beschreibung
Einteilung des Filters in Sektionen
[* -identifier]

[Regel1]

[Regel2]
Wenn man den Mailfilter in mehrere Sektionen einteilt und das Abholen der Mails mit "Fetchmail" erfolgt,
hamfetchmail( "pop3.serv.er", "pop3", "$7", "", "admin", "identifier" )
kann der Mailfilter differenziert für verschiedene POP-Server eingesetzt werden. Ein Bereich, der nur mit [*] beginnt, wird dagegen immer beachtet, auch wenn die Mails nur mit "mail.pull" gepullt werden.
Befehle zum Löschen oder Laden von Mails
ignore() Die Mail wird ignoriert, d.h. sie wird nicht geladen und auch nicht vom POP-Server gelöscht.
kill() Die Mail wird nicht geladen und vom Server gelöscht. (Außer wenn unter den Settings: '[X] Leave mail on Server...' angekreuzt ist, dann wird nicht gelöscht.)
load() Die Mail wird geladen. (ohne Syntax-Option dahinter standard)
=load() Wenn ein Befehl mit einem "=" voran gesetzt wird, werden alle späteren Filterregeln ignoriert, wenn dieser Befehl zuschlägt. Ein weiter unten stehendes "kill" oder "ignore" wird nicht mehr beachtet.
notify() Ein lokaler User wird über ein erfolgtes ignore und kill informiert. Der lokale User kann in die Klammern nach dem Befehl eingetragen werden: notify(admin). Es werden der Header und die ersten 20 Zeilen der Mail mit der Information, ob "kill" oder "ignore" zutrifft lokal an den jeweiligen Benutzer geschickt. Die Anzahl der Zeilen des Bodies läßt sich in der hamster.ini einstellen.
Anweisungen zur Zuordnung zu lokalen Accounts oder Newsgruppen
add(local-user) Addiert einen lokalen Empfänger zur vorhandenen Empfängerliste.
del(local-user) Löscht einen lokalen Empfänger von der Empfängerliste.
set(local-user) Ersetzt die Empfängerliste komplett neu mit dem angegebenen lokalen User.
addaccounts Durchsucht die Empfängerliste nach bekannten lokalen Adressen und addiert dann den lokalen Account zur Empfängerliste hinzu, wenn die Mailadresse lokal bekannt ist.
postto(news.group) Postet die Mail in eine lokale Newsgroup, die im Hamster auch angelegt sein muß.

Oben angegebene Befehle müssen nun noch mitgeteilt bekommen, wann sie wirken sollen. Dafür dienen die folgenden Auswahlmöglichkeiten, nach denen die Mails beurteilt werden können.

Headerzeilen, anhand derer der Hamster die oben genannten Befehle ausführt:

Standardkriterien Beschreibung
Die Standard-Mailheader
From: From-Zeile des Headers.
z.Bsp.: kill() From: "billg@microsoft.com"
To: To-Header der Mail.
z.Bsp.: load() To: "usehamsternet@onelist.com"
Subject: Subject (Betreffzeile) der Mail.
z.Bsp.: ignore() subject: "I-Love-You"
Optionale Mailheader (nicht immer vorhanden)
Message-ID: Message-ID der Mail.
z.Bsp.: =load() Message-ID: "@freebee.dyndns.org"
References: References (Message-ID der Mail, auf die sich bezogen wird).
Größenangaben (stehen nicht im Header, sondern werden vom Mailserver beim Abholen bekanntgegeben)
Bytes: Größe der Mail in Bytes.
z.Bsp.: ignore() Bytes: %>100000 ignoriert Mails mit mehr als 100000 Bytes.
Lines: Länge der Mail in Zeilen.
z.Bsp.: kill() Lines: %>500 löscht Mails mit mehr als 500 Zeilen.
Pseudo-Header (Stehen nicht so im Mailheader)
Any-Sender: Wertet Absenderangaben wie "From:", "Apparently-From:", "Sender:", "Reply-To:", "X-Sender:", "Envelope-From:" und "X-Envelope-From:" aus.
z.Bsp.: load() Any-Sender: "haible"
Any-Recipient: Wertet Empfängerangaben wie "To:", "Apparently-To:", "CC:", "BCC:", "Envelope-To:" und "X-Envelope-To:" aus.
z.Bsp.: load() Any-Recipient: "usehamsternet@egroups.com"
Mailtransport-Header (Weg der Mail über die Mailserver, welche meist vom Mailserver im Header eingetragen werden)
*Received: Spezielle Received-Zeile bei Mails. ( Das Sternchen "*" bewirkt, daß alle Zeilen, die mit "Received" beginnen, durchsucht werden, da meist mehrere vorhanden sind.)
Der Textteil der Mail ohne den Header
Top: Auf Top: zu filtern, bedeutet, auf den eigentlichen Textteil der Mail zu filtern, der beim Top-Befehl (siehe hamster.ini) geladen wird. Praktisch ist das bei Begriffen im Textteil, die auf Spam schließen lassen.

Zusätzlich zu den oben genannten Filterkriterien läßt sich auf sämtliche Header einer Mail filtern. Du kannst also auch auf 'Return-Path', 'X-Mailer' oder einen Header Deiner Wahl filtern.

  • Mehrere Kriterien in einem Ausdruck verwenden:

Die Angabe mehrerer gewünschter Werte zu einem Filterkriterium ist möglich. Beispiel:

=load() From: "ein@freund.de" "noch@ein.freund.de" "mein@lover.de"

Kombinationen sind ebenfalls möglich und sinnvoll.

load() Any-Sender: "boss@compa.ny" -@Subject:"You are fired!"
lädt zum Beispiel alle Mails von boss@compa.ny, außer wenn in der Betreffzeile steht 'You are fired'. Dabei ist zu beachten, daß hinter dem zweiten Filterkriterium kein Leerzeichen stehen darf und die Einleitung mit einem '+' oder '-' beginnt und mit einem '@' fortgesetzt wird.

Beispiele:

load() Lines: %>500 +@Subject:"FAQ"
Lädt Mails über 500 Zeilen, wenn "FAQ" im Betreff steht.
kill() From: "ein@feind.de" -@Subject:"Sorry"

Löscht Mails vom Feind, bis er sich entschuldigt. :-)

Die Wirkung dieser Filterkriterien kann durch vorangestellte Zeichen wie folgt variiert werden:

~ Decodieren nach MIME (z.B. ~Subject: oder ~From: [...])
* Durchsuchen aller Headerzeilen mit diesem Namen (z.B. *Received: "..." )
= Festlegung eines Kriteriums. Wenn ein Filterbefehl so geschrieben wird und dieser Filter zuschlägt, wird für diese eine Mail kein anderer Filter mehr wirken.
+@ Wenn ein zweites Filterkriterium erfüllt sein soll, damit der Filter wirkt.
(z.B. load() Lines: %>500 +@Subject:"FAQ")
-@ Wenn ein zweites Filterkriterium nicht erfüllt sein darf.
(z.B. kill() From: "ein@feind.de" -@Subject:"Sorry")

Als Filterausdrücke sind auch 'Regular Expressions' (reguläre Ausdrücke) analog dem Newsfilter möglich. Somit sind dem Filtern fast keine Grenzen gesetzt. Beachte jedoch: Eine gelöschte Mail ist weg und läßt sich nicht, wie bei News, noch einmal vom Server laden. Hamster löscht die Mail gnadenlos, wenn Du es ihm mit 'kill()' ausdrücklich sagst und [X] Leave on Server nicht angehakt ist.

Beispiel eines Mailfilters:

Jürgen Denzler hat auf seiner Homepage ebenfalls die Funktion des Mailfilters erklärt und vergleicht ihn mit der Wirkungsweise des Newsfilters.

Voraussetzung:
3-Mail Accounts, 'limits' in hamster.ini aufgehoben

fetchmail "pop.serv.er" "pop3" "$1" "" "1-user"
fetchmail "pop.serv.er" "pop3" "$2" "" "2-user"
fetchmail "pop.serv.er" "pop3" "$3" "" "1-user,regel1"
# siehe unten
fetchmail "pop.serv.er" "pop3" "$4" "" "1-user,regel2"
# Account für Newsletter, Listen reserviert

---8<---
#MailFilt.hst

[*]
# kein Eintrag
# notfalls kann mit load() eine ignorierte Mail
# durch eintragen - laden - Eintrag löschen geholt werden

[* -regel1]
=kill() From: "Bekannte Spammer"      # ohne Ansage (keine Info durch notify)
ignore() Bytes %>50000    # Mails größer als 50000 Bytes
ignore() Lines %>500      # Mails länger als 500 Zeilen
notify(admin)                # Im Falle von ignore/kill den Admin informieren

[regel1]
# kein Eintrag
# Account ist nur Personen meines Vertrauens bekannt
# ich nehme alle Mails

[regel2]
# [* -regel1] gilt auch hier

postto(hamster.ml.onelist) To: "usehamsternet@onelist.com"

add(2-user) X-MailID: Computing
# Newsletter geht zusätzlich an weiteren User

#EOF

Ein Beispiel-Mailfilter könnte so aussehen:

# Mails pulle ich ohne 'Identifier', deshalb nur eine Gesamtsektion:

[*]

# Information über ignore und kill per Mail an mich schicken.
notify(m.gebert)
log()

# zuerst unbedingt laden, was mir wichtig ist, zum Beispiel
# Antworten auf meine Mails oder auf Newsartikel von mir:

=load() *References: "gebert.ddns.org" "hamster.boxx.org"
=load() In-reply-to: "gebert.ddns.org" "hamster.boxx.org"
=load() ~subject: {(hamster|script|archiv)}

# Posten von Mails in lokale Newsgruppen:

postto(internal.ml.ehamster) reply-to: "ehamster@"
postto(internal.ml.usehamsternet) to: "usehamsternet@"

# Harter Kill, beruht auf wirklich erhaltenem Spam, wobei ich hier
# auch die 'Received'-Zeile der Mail benutze, da 'From:' und 'To:'
# meist wechseln und/oder gefälscht sind:

=kill() *Received: {.*\.(com|ne|edu|net|or|co|gx)\.(tw|jp|cn|es|gr|kr|in)\ }
=kill() From: {.*@.*\.(com|ne|edu|net|or|co|gx)\.(tw|jp|cn|es|gr|kr|in)}
=kill() To: {(.*@.*\.(tw|gr|jp|es|cn))|(.*@aol\.(com|de))}

# To: enthält keine Mailadresse, was eigentlich nur bei Spam vorkommt.
=kill() to: * -{@.+\..+}

# Mail enthält einen BCC-Header, was auf kaputte Software hinweist
# und bisher bei mir immer Spam war.
ignore() bcc: {@}

# Der Absender war auch gleichzeitig der Empfänger der Mail, das ist
# meist bei Spam zu beobachten. Mailinglisten und Newsletter sollten
# vorher mit =load geladen werden.
kill() From: $TO$ +@To:{.+}

# Die Mail ist typisch kodiert, in diesem Falle big5,
# was bisher immer Spam aus Asien war.
kill() subject: "=?big5?Q?"
kill() Content-Type: {charset\=\"big5\"}

# Schutz vor übergroßen Mails mittel ignore.
# (Durch das Notify bekomme ich eine Info-Mail darüber.)
ignore() Bytes: %>50000

# MID enthält nur die Klammern und sonst nichts
kill() Message-ID: {\<\>}

# MID enthält ein Leerzeichen
kill() Message-ID: {\<.+\s.+\>}

# ***Experimentelle Filter***
# Hier arbeite ich mit 'ignore()', um bei zutreffenden Kriterien
# informiert zu werden und dann den obigen harten 'kill' zu verfeinern.

ignore() From: {.*@.*\.(tw|gr|jp|es|cn)$}
ignore() *Received: {\s(from|by) (.*\.)(jp|tw|kr|ru|ro|my|es|sg|pt|cn)\s}
ignore() To: {Undisclosed.Recipients}
ignore() Return-Path: {^\<.*\.(tw|cn|jp|br|es)\>$}

# mindestens 10 Großbuchstaben im Subject und
# greift nicht, wenn auch mindestens 3 Kleinbuchstaben vorkommen
kill() ~subject: {((?-i)[A-Z].*){10,}} -{((?-i)[a-z].*){3,}}

# Message-ID enthaelt kein "@"
kill() message-id: {[a-z0-9]{1,}} -{@} 

# Mehr als 6 binaer-Zeichen (non-NVT-ASCII) im Subject.
ignore() ~Subject: {.*[^\ -~][^\ -~][^\ -~].*[^\ -~][^\ -~][^\ -~]}

# Asiatische Mails mit Sonderzeichen wie folgt killen:
# subject: ³Ì«á¹dÄm²Ä¤Q¿è¡D¤T¤Qª±×÷¢£¤¥§©©·¬®°¶¼½¾ºÞðþ
kill()   ~Subject: {[\x80-\xff]{6,}}

# Soll min. 3-stellige Zeichenfolgen nach min. 5 Spaces ignorieren
# z.B. "Ruf! Mich! An!      4233" ODER "Werde Reich!     2343h4"
ignore() ~Subject {\s{5,}\w{4,}$}
kill() ~Subject: {\s{5,}[\[\(<]?\d{4,}[\]\)>]?$}

# Soll typische Spammer-Absenderadressen mit 4 oder mehr Zahlen ignorieren
# z.B. "spammer23487@aol.de" ODER "2425spammer@aol.de"
# Wer allerdings Freunde wie Freddie2000 hat, muss natuerlich eine Stufe
# niedriger schalten und erst ab 5 Zahlen (\d{5,}) ignorieren.
ignore() From: {\d{4,}\w{0,}@}

# Real Sex for FREE, gross geschriebene Reizworte:
kill ~Subject: {(?-i)FREE}

# Bilderspam, sogenannte Webbugs
kill() Top: {\ssrc=(3d)?"?https?:\/\/.+(\.|=2e).+\/.+}

# Anregungen zum Filtern:
# ftp://ftp.belwue.de/belwue/software/spamblock
# http://spamabwehr.sakrak.net/
# http://www.gadma.net/wakka/HowToSpamAssassinRulesFuerHamster
# EOF

Home Konfiguration Scriptarchiv/Tools Scriptsteuerung Hamsterscripte Einstellungen Bookmarks Newsfilter Mailfilter SPAM Tips&Tricks Fun Guestbook