Die Regeln in der Datei „MailFilt.hst“ beschreiben, welche E-Mails vom POP3-Server geladen werden sollen bzw. was mit ihnen zu geschehen hat. Für die Behandlung von Newsartikeln siehe „Scores.hst“.
Wählen Sie die Filterkriterien sorgsam aus, andernfalls kann es zu Verlusten von eventuell wichtigen Nachrichten kommen. Schreiben Sie deshalb keine Filter aus anderen Quellen kritiklos ab und verwenden nur Filter, die Sie inhaltlich verstehen.
Eventuelle Fehlerquelle: Die Datei muss wirklich „MailFilt.hst“ heißen, nicht „MailFilt.txt“ oder „MailFilt.hst.txt“ o. ä. Wird die Datei mit Notepad gespeichert, ist die Chance auf einen falschen Namen groß: Beim Abspeichern darauf achten, dass der Name in Anführungszeichen gesetzt wird (‚"MailFilt.hst"‘).
Nach dem Bearbeiten und Speichern der Datei „MailFilt.hst“ ist es sinnvoll, im Hamster die Konfiguration neu zu laden über das Menü „Einstellungen“ → „Konfiguration neu laden“ oder durch Drücken der Taste „F5“ (wenn der Hamster wieder im Fokus ist), weil dann unter anderem auch eine Überprüfung der Filterdatei erfolgt. Bestenfalls sieht das dann so aus:
09:47:53 Sys {de7} Teste Mail-Filterdatei
09:47:53 I {de7} Mail-Filterdatei: Test OK
„Teste Mail-Filterdatei“ bedeutet, es wurde eine Datei
namens „MailFilt.hst“ gefunden. „Test
OK“ bedeutet nicht unbedingt, dass alles wirklich in
Ordnung ist, es sagt nur aus, dass der Hamster keine
syntaktischen Fehler in den einzelnen Zeilen finden konnte.
Ansonsten sieht es vielleicht so aus:
10:00:03 WAR {de7} Error in Mail-filter-file "E:\HAMSTER\MailFilt.hst"
10:00:03 WAR {de7} Error in line 3: notifi(admin)
10:00:03 WAR {de7} Error description: "notifi(" => Unknown action "notifi"
Hier ist die Aktion „notifi“ in Zeile 3 der „MailFilt.hst“ dem Hamster unbekannt. Richtig muss es heißen „notify(admin)“. Was das ist und wofür es gut ist, wird weiter unten erklärt.
Teile der Filter-Datei können mit folgender Preprozessor-Anweisung in eine separate Datei ausgelagert werden:
#!Include <Dateiname>
Lange Zeilen können mittels Unterstrich („_“) am Zeilenende auf mehrere kurze aufgeteilt werden.
Filterregeln können mit einem Kommentar versehen werden. Der Kommentar muss mit dem Raute-Zeichen („#“) beginnen, auf welches aber kein Ausrufe-Zeichen folgen darf.
Ein „#“ darf auch hinter einem kompletten Filterausdruck einen Kommentar einleiten. Wenn ein Filterausdruck auf mehrere Zeilen aufgeteilt wird, darf ein Kommentar also auch nur als Abschluss in der letzten Zeile des Filterausdrucks stehen.
MFilterDatei = *( MfilterBlock / cEOL )
MFilterBlock = MFilterAbschnitt *( MFilterRegel / cEOL )
MFilterAbschnitt = "[" Abschnittsmuster *(1*WSP Abschnittsmuster) "]" cEOL
MFilterRegel = ["="] ( MLadeRegel / MZielRegel ) [1*WSP Expire] cEOL
MladeRegel = "load" [ "(" ")" ] 1*WSP MAuswahl /
"ignore" [ "(" ")" ] 1*WSP MAuswahl /
"kill" [ "(" ")" ] 1*WSP MAuswahl /
"notify" [ "(" [ Benutzerliste ] ")" ] 1*WSP MAuswahl /
"notifyoff" 1*WSP MAuswahl /
"log" [ "(" [ Benutzerliste ] ")" ] 1*WSP MAuswahl /
"logoff" 1*WSP MAuswahl
MzielRegel = "addaccounts" [ "(" ")" ] 1*WSP MPrimFeld /
"adddefault" [ "(" ")" ] 1*WSP MAuswahl /
"default" [ "(" [ Benutzerliste ] ")" ] 1*WSP Mauswahl /
"add" "(" Benutzerliste ")" 1*WSP MAuswahl /
"set" "(" Benutzerliste ")" 1*WSP MAuswahl /
"del" "(" Benutzerliste ")" 1*WSP MAuswahl /
"postto" "(" Newsgruppen ")" 1*WSP MAuswahl /
"setscore" "(" Scorewert ")" 1*WSP MAuswahl /
"addscore" "(" Scorewert ")" 1*WSP MAuswahl
Expire = "Expire:" Datum
Datum = Jahr Monat Tag
Jahr = 4DIGIT ; vierstellige Jahreszahl JJJJ
Monat = 2DIGIT ; zweistellige Monatszahl MM
Tag = 2DIGIT ; zweistellige Tageszahl TT
MPrimFeld = (Einzelfeld / MGruppenfeld)[:]
MAuswahl = MHauptfeld *( 1*WSP ( Muster / MNebenfeld ) )
MHauptfeld = [ "unless" 1*WSP ] [ "~" ] [ * ] ( MEinzelfeld> /
MGruppenfeld ) [ ":" ] 1*WSP Muster
MEinzelfeld = RFCFieldName / "Bytes" / "Top" / "Score" /
"TopOnly" / "Header" / "Age"
MGruppenfeld = "Any-Sender" / "All-Sender" /
"Any-Recipient" / "All-Recipient"
MNebenfeld = [ "+" / "-" ] "@" MEinzelfeld ":" Muster
Benutzerliste = BenutzerSpez *( "," BenutzerSpez )
BenutzerSpez = BenutzerName [ SubFolderSpez ] [ ":" IMAPFlagSpez ]
SubFolderSpez = 1*( "/" Subfoldername )
IMAPFlagSpez = *( "\" IMAPFlagname )
BenutzerName = 1*BString
BString = "A"..."Z" / "a"..."z" / "0"..."9" / "!" / "#" /
"$" / "&" / "'" / "+" / "-" / "_" / "=" / "."
Subfoldername = 1*FString
FString = "A"..."Z" / "a"..."z" / "0"..."9" / "!" / "$" / "'" /
"+" / "-" / "." / "=" / "@" / "^" / "_" / "´" / "~"
IMAPFlagName = "seen" / "recent" / "answered" / "draft" / "flagged"
Scorewert = -2147483647...+2147483647
Newsgruppen = Newsgruppenname *( "," Newsgruppenname )
Abschnittsmuster = [ "+" / "-" ] Muster
Muster = RegExpMuster / EinfachesMuster
RegExpMuster = "{" RegularExpression "}"
RegularExpression = PCRE ; vgl. FAQ Reguläre Ausdrücke
EinfachesMuster = MusterAlles / MusterText / MusterZahl / MusterHeader
MusterAlles = "*"
MusterText = CaseSensitiveText / CaseInsensitiveText
CaseInsensitiveText = """ Text """ ; ohne Beachtung von Groß-/Kleinschreibung
CaseSensitivetext = "'" Text "'" ; mit Beachtung von Groß-/Kleinschreibung
MusterZahl = "%" ( "<" / "=" / ">" / "<>" / ">=" / "<=" ) Zahl ["kb" / "mb"]
; Achtung! 1 KB = 1024 Bytes, 1 MB = 1024 KB = 1048576 Bytes.
Zahl = *DIGIT [ "." *DIGIT ]
MusterHeader = "$" RFCFieldName "$"
RFCFieldName = RFC 5322 ; Headerfeld entsprechend RFC
DIGIT = "0"..."9" ; eine Ziffer
cEOL = [ "#" Kommentar ] CRLF
Kommentar = Text
Text = ISO-TEXT ; Import von ISO 8859
CRLF = %x0D %x0A ; = %d13 %d10, d. h. Wagenrücklauf
; (carriage return) und Zeilenvorschub (line feed)
WSP = Space / HTab ; White-Space
Space = %x20 ; = %d32, d. h. Leerzeichen (space)
HTab = %x09 ; = %d09, d. h. Tabulator (horizontal tab)
Enthält der Filter „Ignore“- oder „kill“-Regeln, holt der Hamster als erstes die Kopfzeilen der E-Mails und entscheidet dann, welche E-Mails komplett geladen, gelöscht oder ignoriert werden.
Sofern eine „ignore“-Regel im Filter anschlägt, wird die E-Mail nicht geladen, aber auf dem Server belassen. Wenn eine „kill“-Regel im Filter anschlägt, wird die E-Mail nicht nur nicht geladen, sondern auch noch auf dem Server gelöscht.
Sollte allerdings eine nachfolgende „load“-Regel zutreffen, wird die vorherige „Ignore“-/“Kill“-Anweisung dadurch wieder aufgehoben, und die E-Mail geladen.
E-Mails, auf die keine Regel zutrifft, werden immer geladen.
Falls die Ausführung von „Ignore“- und „kill“-Regeln gemeldet werden soll, kann man dies über eine passende „notify“-Anweisung erreichen, ansonsten erfolgt in der Voreinstellung das Ignorieren und Löschen kommentarlos. Bei mehreren „Notify“-Anweisungen gilt immer nur die aktuell letzte Benutzerliste, die vorherige wird durch die jeweils nächste überschrieben. Diese Liste kann mit der Anweisung „notifyoff“ auch wieder komplett gelöscht werden, so dass keine Benachrichtigungen versandt werden. Wird die „Notify“-Anweisung ohne Parameter verwendet, so werden alle Meldungen an den Standard-Account gesendet.
Die „log“-Anweisung erlaubt den Eintrag von Mails, die von einem Filter ignoriert oder gelöscht werden, in das Mail-Killfile-Protokoll; „logoff“ schaltet das Loggen wieder ab. In der Voreinstellung ist das Mitloggen ausgeschaltet. Die Log-Einträge lassen sich per Menü „Einstellungen“ → „Mail: Killfile-Protokoll“ bequem dazu nutzen, ignorierte Mails endgültig zu löschen oder nachzuladen. Als Parameter wird entweder wie bei „notify“ ein oder mehrere User oder „*“ für ein globales Protokoll angegeben, bei fehlendem oder leeren Parameter wird das Killfile-Protokoll des Standard-Accounts verwendet.
Eine alternative, aber auch wesentlich komplexere Methode um zu entscheiden, welche E-Mails geladen werden, ist das sogenannte „Scoring“. Hierzu vergibt man für jede E-Mail mit der Laderegel „addscore“ oder „setscore“, je nach Ergebnis einer Auswahlregel, einen frei wählbaren Punktwert mit negativen oder positiven Vorzeichen. Somit kann man durch Verwendung mehrerer Auswahlregeln eine Gesamtentscheidung treffen, ob eine E-Mail geladen werden soll oder nicht. Diese Entscheidung realisiert man mit einer „kill“- oder „ignore“-Regel, welche den Wert des Pseudo-Headers „Score:“ auf die Einhaltung eines vorgegebenen Wertes hin überprüft.
Mit der zusätzlichen Anweisung „Expire:JJJJMMTT“ (darf keine Leerzeichen enthalten!) können Einträge mit Verfallsdatum versehen werden. Der Expire-Eintrag kann ab der eigentlichen Filterregel an beliebiger Stelle in der Definition eingesetzt werden, d. h. vor oder nach dem Filterfeld/einem Filterausdruck, sofern zumindest ein Leerzeichen Abstand eingehalten wird:
# Filter ist nur gültig bis zum 30. Dezember 2003: =Ignore() Expire:20031231 ~From: "Heiner Dämlich" # Alternativer Ausdruck mit derselben Bedeutung: =Ignore() ~From: "Heiner Dämlich" Expire:20031231
Vor allem in der Testphase sollte man von den „Log“- und „Notify“-Möglichkeiten ausgiebig Gebrauch machen und sicherheitshalber erst einmal nur „Ignore“-Regeln vorsehen.
Hinweis: Die Option „Einstellungen“ → „Mail: Server konfigurieren“ → „POP3-Einstellungen“ hat eine höhere Priorität als die Mail-Filter der „MailFilt.hst“.
Der Hamster legt eine geladene E-Mail immer im Postfach mindestens eines Benutzers ab. Das Postfach legt der Anwender entweder durch den Filter (die Datei „MailFilt.hst“) fest oder, wenn dieser kein Ergebnis liefert, durch den Standardempfänger. Kann der Hamster kein gültiges Postfach ermitteln, verwendet er das „admin“-Postfach.
Zur Auswertung des Filters benutzt der Hamster eine anfangs leere Empfängerliste. Folgende Regeln beeinflussen die Liste:
Der Standardempfänger kann wie folgt festgelegt werden (Reihenfolge in absteigender Priorität):
Jeder Abschnitt wird mit eckigen Klammern „[ ]“-gekennzeichnet. Er kann einen Stern „*“ oder einen Abschnittsnamen aus den Menüeinstellungen für die POP3-Server oder aus einem Skriptbefehl enthalten. Abschnittsnamen können gezielt für einzelne Nutzer im Menü „Einstellungen“ → „Mail: Server konfigurieren“ → „POP3-Mailserver“ eingestellt werden.
[*] # Filterregel für alle E-Mails [private] # Filterregel für „private“ z.B. aus Skriptbefehl oder Menü
Hinweis: Die folgende Beschreibung enthält hauptsächlich die Differenzen zwischen Mail- und Newsfilter, für nähere Details siehe somit auch die Erläuterungen zur „Scores.hst“.
Im Unterschied zum Newsfilter kann jedes Headerfeld für eine Filterregel benutzt werden. Eine Filterzeile beginnt mit einem Befehl:
kill() From: "sehr.bekannter@spammer.invalid" =add(john) To: "john@mail.example.com" postto(internal.mailinglists.ehamster) To: "ehamster@egroups.com"
Wichtiger Hinweis: Hinter „kill“, „add“, „postto“ etc. und der öffnenden Klammer darf kein Leerzeichen stehen, ansonsten ist die Regel technisch ungültig und wird als nicht existent betrachtet! Zwischen der schließenden Klammer und dem Suchausdruck sind beliebig viele Leerzeichen dagegen erlaubt und der Übersichtlichkeit halber auch empfohlen.
Ein Gleichheitszeichen („=“) vor einer Regel bedeutet, dass, sobald diese Regel zutrifft, für die gerade bewertete E-Mail die Abarbeitung der Filterregeln an dieser Stelle abgebrochen und der bis dorthin ermittelte Stand der Filterung auf die E-Mail angewandt wird; alle folgenden Regeln werden ignoriert.
Mit einem speziellen Feld kann man die E-Mail auf ihre Länge testen:
ignore() Bytes: %>100000
Wegen des numerischen Vergleichs wird hier das Prozentzeichen („%“) benötigt. Man kann auch Angaben in „KB“ und „MB“ machen, wobei zu beachten ist, dass die Präfixe nicht dem SI entsprechend den Faktor 103 = 1000 darstellen, sondern den Faktor 210 = 1024, d. h. 1 KB = 1024 Bytes und 1 MB = 1024 KB = 1.048.576 Bytes.
Das fiktive Feld „Age“ basiert auf dem Feld „Date“ und enthält das Alter der E-Mail in Tagen (auch hier wegen des numerischen Vergleichs ein „%“):
=ignore Age %>14 # Über zwei Wochen alte E-Mail ignorieren
Das Spezial-Feld „Any-Sender“ testet alle senderspezifischen Header wie „From:“, „Apparently-From:“, „Sender:“, „Reply-To:“, „X-Sender:“, „Envelope-From:“ und „X-Envelope-From:“:
load() Any-Sender: "boss@company.example.com" -@Subject:"Kündigung!"
Ein Minus-Zeichen („-“) vor dem Header bedeutet, dass alle Artikel, welchen den folgenden Ausdruck nicht enthalten, gesucht werden sollen. Um in einer Abfrage auf den Inhalt eines anderen Headers zugreifen zu können, muss der Headername dem eigentlichem Ausdruck mit „@<Header>:“ vorangestellt werden. Man beachte, dass zwischen „@<Header>:“ und dem Ausdruck kein Leerzeichen stehen darf!
Der Pseudoheader „All-Senders“ prüft nicht alle Senderfelder einzeln, sondern mit Zeilenvorschub (CR/LF [#13#10]) getrennt auf einmal.
Das Spezial-Feld „Any-Recipient“ testet umgekehrt alle empfängerspezifischen Header wie: „To:“, „Apparently-To:“, „CC:“, „BCC:“, „Envelope-To:“ and „X-Envelope-To:“:
add(john) Any-Recipient: "john@mail.example.org" add(jane) Any-Recipient: "jane@mail.example.org" addaccounts() Any-Recipient:
Der Pseudoheader „All-Recipients“ prüft nicht alle Empfängerfelder einzeln, sondern mit Zeilenvorschub (CR/LF [#13#10]) getrennt auf einmal.
Mit dem Spezialfeld „TopOnly“ kann ausschließlich auf die für den „TOP“-Befehl festgelegte Anzahl von Body-Zeilen einer E-Mail zugegriffen werden.
Mit dem Spezialfeld „Header“ kann auf den kompletten Header einer E-Mail zugegriffen werden:
load() Header: "Mein Name" # Mails welche etwas mit mir zu tun haben
Beginnt der Feldname mit der Tilde („~“), wird das Feld vor Anwendung der Regel mit dem MIME-Verfahren dekodiert. Siehe hierzu auch die Beschreibung der Zeichensatzkonvertierungsdateien:
load() ~To: "jürgen"
Die Dekodierung erfolgt immer in den lokal eingestellten Systemzeichensatz. Darin nicht enthaltene Zeichen des E-Mail-Zeichensatzes werden nicht ersetzt, so dass sie durch die zufällige Entsprechung im lokalen Zeichensatz dargestellt werden. Infolgedessen können Sie sinnvoll nur auf Zeichen filtern, die in Ihrem lokalen Zeichensatz enthalten sind!
Hinweis: Die MIME-Dekodierung kann nur auf Hauptfelder angewandt werden (Nebenfelder werden durch vorangestelltes „@“ gekennzeichnet).
Normalerweise wird bei einer Regel nur die erste passende Header-Zeile je E-Mail ausgewertet. Um auch multiple Felder komplett zu testen, muss dem Feldnamen ein Stern „*“ vorangestellt werden:
add(john) *Received: "john@"
Die Spezialvariable „$XXX$“ kann für Vergleiche mit dem Inhalt anderer Mail-Header herangezogen werden, wobei „XXX“ für einen beliebigen Header der zu beurteilenden Mail steht.
ignore() From: $To$ # Ignorieren, wenn in „From:“ und „To:“ dasselbe steht.
# E-Mails an bekannte lokale Adressen zustellen, dabei alle Empfängerfelder und
# die kompletten Received-Header überprüfen:
[*]
addaccounts() Any-Recipient:
addaccounts() *Received:
# E-Mails eines bekannten Spammers oder von einer unerwünschten Domain löschen:
[*]
kill() Any-Sender: "grosser@spammer.example.com"
kill() Any-Sender: "@spammer-domain.example.net"
# E-Mails eines bekannten Trolls für eine gewisse Zeit ignorieren:
=Ignore() Expire:20031231 ~From: "grêãt trøll"
# Filterabschnitt für einen bestimmten Nutzer „auchwer“ im Abschnitt [irgendwer]
[irgendwer]
kill() From: "feines_von_auchwer@spammer.example.com"
add(auchwer) To: "auchwer@mail.example.org"
# User und Admin benachrichtigen, wenn E-Mails gelöscht oder ignoriert wurden:
Notify(user,admin)
# Die E-Mails einer Mailingliste in eine lokale Newsgruppe posten und dem Admin
# noch jeweils eine Kopie der Original-Mail senden:
[*]
postto(local.hamster-ml.usehamsternet) To: "usehamsternet@egroups.com"
add(admin) To: "usehamsternet@egroups.com"
postto(local.hamster-ml.ehamster) To: "ehamster@egroups.com"
add(admin) To: "ehamster@egroups.com"
# Alle E-Mails löschen, deren „From“- und „To“-Header identisch sind. In der Regel
# schicken sich nur Spammer selber E-Mails. Doch Vorsicht: Newsletter und andere
# erwünschte E-Mails, die ebenfalls identische „From“- und „To“-Header enthalten
# können, sind dann unbedingt gesondert zu behandeln.
#
# Der To-Header stimmt mit dem From-Header überein und enthält mindestens ein Zeichen:
kill() From: $To$ +@To:{.+}
#
# Anmerkung: Der Quantifier „+“ im Zusatz „+@To:{.+}“ ist eigentlich überflüssig,
# jedoch für ein gutes, schnelles Verständnis des Filters ungemein wertvoll.
# Bei „{.+}“ handelt es sich um einen Regulären Ausdruck.
# Die E-Mails ignorieren, deren „FROM“-Header eine bestimmte Adresse enthält und
# sie auf dem Server liegen lassen, um sie später noch anderweitig zu lesen.
ignore() From: "geschaeftsadresse@firma.example.com"
# E-Mails bis zu einer bestimmten Größe einem User zuordnen,
# ab einer bestimmten Größe aber ignorieren oder sogar löschen
add(john) Bytes: %<=10kB # = 10240 Bytes, vgl. die Bemerkungen oben
ignore() Bytes: %>500000
kill() Bytes: %>=1.5MB # = 1.572.864 Bytes, vgl. die Bemerkungen oben
# Einen Scorewert für eine E-Mail festlegen
addscore(-100) ~From: "grêãt trøll"
addscore(+500) ~To: "Mein Name"
# Entscheiden, ob eine E-Mail anhand ihres Scorewertes gelöscht werden soll.
=kill() Score:%<0
# Beispiele für IMAP-Konten:
# ==========================
# Setzt die Empfängerliste auf das Konto „john_imap“ und
# legt die E-Mail in der „INBOX“ des Kontos ab:
set(john_imap) To: "john@example.com"
#
# Wie zuvor, legt die E-Mail aber in dem IMAP-Ordner „privat“ ab:
set(john_imap/privat) To: "john@example.com"
#
# Fügt als zusätzlichen Empfänger den Ordner „john/privat“ des
# Kontos „archiv_imap“ hinzu und setzt sowohl das „/seen“- als
# auch das „/flagged“-Flag:
add(archiv_imap/john/privat:\seen\flagged) To: "john@example.com"