|
|
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
|
|