Navigationshilfe

Hauptnavigation

Seiteninhalt

Filtern von Mails mit procmail

Situation

  • Man empfängt immer mehr Mails welche man in besondere Dateien sortieren will. Zum Beispiel Mails von Maillinglisten. Dies kostet Zeit. Es ist daher sinnvoll, sich einen Mailfilter zu schreiben, der die eingehende Post sortiert.
  • Man empfängt immer mehr Mails, die man nicht haben will (Spam).
  • Dieser Mailfilter kann auch zu sehr vielen anderen Zwecken benutzt werden, siehe die weiterführende Dokumentation.

Lösung - Übersicht

Das Mailsystem ist in der Lage, bei ankommenden Mails bestimmte Aktionen auszuführen. Was das Mailsystem genau machen soll, wird mit der Datei ~/.forward gesteuert: das "~"-Zeichen symbolisiert dabei Ihr Homeverzeichnis im Unix-Cluster des Rechenzentrums. Um diese Datei bearbeiten zu können, müssen sie sich auf dem Server einloggen.

Mit der Datei ~/.forward wird das Mailsystem angewiesen, das Programm procmail aufzurufen. Der Rest der Arbeit am eigenen Mailfilter findet nun in der Konfigurationsdatei von procmail statt: ~/.procmailrc . Hier werden die einzelnen Filter formuliert.

Procmail arbeit seine Konfigurationsdatei schrittweise ab und ergreift die gewünschten Aktionen, wenn ein Filter zutrifft. Aktionen können das Verschieben in andere Dateien, das sofortige Löschen und weitere (viel raffiniertere) Dinge sein.

Hier erfahren Sie nun (in arg langatmiger Weise, aber vielleicht sind Sie ja neu bei Unix...), wie man einen ersten simplen procmail Filter anlegt.

procmail ist eine leistungsstarke Software. Das bedeutet ersteinmal, dass man damit auch drastisch etwas kaputt machen kann. Es gelten also die beiden Regeln im Umgang mit richtiger Software: 1. Lernen Sie zu verstehen, was Sie tun. 2. Überprüfen Sie, dass alles richtig arbeitet.

Für procmail gilt dann noch spezifisch, dass man als Aktion keine Weiterleitung einträgt... Weiterleitungen in procmail können zu Mailloops führen und haben in der Vergangenheit zu Mailloops geführt. Mailloops bedeuten, dass sich die Mailserver innerhalb kürzester Zeit tausende von Fehlerberichten zuschicken, die jeweils weitergeleitet werden.

Wenn Sie eine Weiterleitung aus einem Filter heraus machen wollen, dann benutzen Sie bitte Exim Filter.

~/.procmailrc anlegen

Sie haben sich erfolgreich eingeloggt. Sie sollten nun in Ihrem Homeverzeichnis sein. (Falls Sie mit dem Befehl "cd" - change directory - experimentiert haben, trägt ein weiteres "cd" ohne Parameter sie in ihr Homeverzeichnis zurück.)

Legen Sie die Datei .procmailrc an, indem Sie einen Texteditor aufrufen. Am besten mit "pico .procmailrc". Schreiben sie bei pico mit "[strg]-O" die Datei auf die Festplatte und beenden Sie pico mit "[strg]-X".

Header/ Kopfbereich

Am Anfang der Datei sollten einige allgemeine Angaben gemacht werden:

# Das Verzeichnis, in dem Mail-Ordner abgelegt werden:
MAILDIR=$HOME/mail
# Eine Datei, in die procmail hineinloggt:
# Achtung: die Logdatei wird bestaendig groesser. Sie muessen Sie
# regelmaessig leeren (mit "cp /dev/null logprocmail").
LOGFILE=$HOME/logprocmail
# Soll jede Aktion gelogt werden ("yes") oder nur Fehler ("no")
LOGABSTRACT=yes

Mit diesen Zeilen werden Variablen definiert, die von procmail ausgewertet werden oder die man selbst weiterverwenden kann. Das "#"-Zeichen markiert Kommentare, die procmail nicht auswerten soll. Das "$" ruft den Wert der darauffolgenden Variable auf. Neben selbstdefinierten Variablen existiert immer schon eine Anzahl von Variablen vorab. Die Wichtigste ist $HOME: Das Homeverzeichnis von einem selbst.

Ein Filter

Ein Filter besteht aus drei Teilen: Anfang, Filter und Aktion:

Anfang
Der Anfang eines Filters wird immer mit ":0" markiert (Doppelpunkt - Null).
Filter
Der Filter wird mit "*" markiert. Es folgt ein Suchtext. Dieser Suchtext kennt Sonderzeichen. Die wichtigsten sind "^" für "Anfang der Zeile" und ".*" für beliebige Zeichen in beliebiger Anzahl.
Aktion
Die Aktion wird mit gar nichts markiert. Wenn hier ein Ordner genannt wird, dann speichert procmail die eMail in diesen Ordner ab. Es gibt immer nur eine Aktion.

So sieht es aus:

# xyz-liste
:0
* ^To: .*xyz-liste@listen-domain.de
$MAILDIR/xyz-liste

Procmail wird hiermit angewiesen, den header der eMail (procmail untersucht per Default nur den header nicht den body) zu untersuchen, ob eine Zeile mit "^Sender: " beginnt und ob irgendwo später in dieser Zeile "xyz-liste@listen-domain.de" auftaucht. Diese Suche ist unabhängig von Groß- und Kleinschreibung.

Wenn der Filter eine passende eMail gefunden hat, wird sie nach "$MAILDIR/xyz-liste" geschrieben. "$MAILDIR" wurde vorher als $HOME/mail definiert, also wird die eMail nach mail/xyz-liste im Homeverzeichnis geschrieben. Diese Datei muss schon existieren, damit procmail sie verwenden kann: "touch mail/xyz-liste" legt sie an (wenn es ganz hart kommt, und nicht einmal das Verzeichnis mail vorhanden ist: "mkdir mail").

Wiederholung: Filtern eines bestimmten Headers

Um es wirklich klar zu machen: Bestimmte header werden bei Procmail ausgewählt, indem man auf Zeilenanfang testet: "^"-Zeichen. Dann den Name des headers mitsamt Doppelpunkt und um es wasserdicht zu machen ein Leerzeichen. Üblicherweise kommt nun eine ".*"-Zeichenkombination bevor man den Text angibt, der gefiltert werden soll: Auf diese Art ist man dagegen gefeit, wenn zufällig ein weiteres Leerzeichen erscheint oder sonstwelche Zeichen unerwartet vor den Suchtext gestellt wurden. Insbesondere wenn man nach eMail-Adressen filtert, muss man dies beachten, weil denen meist ein Echtname vorrangeht oder sie in "<>"-Klammern stehen.

~./forward anlegen

Legen Sie die Datei .forward mit "pico .forward" an.

Tragen Sie in einer einzelnen Zeile "|procmail" ein (ohne Anführungszeichen; das erste Zeichen ist [alt-gr] plus "<>|"-Taste)

War's das?

Ja. Das Mailsystem ruft über .forward procmail auf. Procmail liest die Konfiguration; wenn der Filter zutrifft und wenn der Ordner existiert, finden Sie Ihre nächste Listenpost (oder was immer Sie herausgefiltert haben) dort.

~/.procmailrc ausbauen

Mehrere Filter definieren

Sie können beliebig viele Filter schreiben. Jeder einzelne muss aus dem Anfang, dem eigentlichen Filter und einer Aktion bestehen.

Zu Beachten ist, dass die Reihenfolge wichtig ist: Wenn procmail einen Filter gefunden hat, der zutrifft, wird dessen Aktion ausgeführt und procmail wird beendet. Das kann natürlich zu gewissen Problemen führen, wenn Sie gleich am Anfang einen sehr allgemeinen unspezifischen Filter einsetzen: die restlichen punktgenauen Filter werden nicht mal mehr ausprobiert.

Mit procmail Spam herausfiltern

Da wir eMails serverseitig auf Spam untersuchen und mit einer Bewertung versehen, kann man die ganz einfach rausfiltern:

# Spamfilter
:0
* ^X-MailScanner-SpamScore:.*sssss
$MAILDIR/spam

"X-MailScanner-SpamScore" ist der Name des Headers, den wir verwenden. Wir vergeben pro Wertungspunkt ein kleines "s". Mehr s bedeuten dass mehr Spam durchkommt aber das Risiko von Fehlerkennungen immer weiter reduziert wird. Fünf s sind ein vernünftiger Wert. Neun so gut wie sicher. Evt kann man auch mit vier oder drei s gute Ergebnisse erzielen.

Darüber hinaus gibt es natürlich die Möglichkeit procmail und procmail-Erweiterungen zu benutzen, um weitere Black- und Whitelist Verfahren durchzuführen und ähnliches mehr.

Testen

procmail zu testen, ist nicht ganz leicht. Dennoch sollten Sie sich wenigstens selbst eine eMail zuschicken, um zu sehen, ob der normale eMailtransport noch funktioniert. Evt. können sie auch die Filter umschreiben, so dass sie auf Subjects filtern und dann Mails mit präparierten Subjects vorbeischicken.

Ein richtiges Testverfahren (allerdings aufwändig) wird hier erläutert: http://www.uwasa.fi/~ts/info/> proctips.html [extern]

Sie können allerdings relativ leicht Ihre Filter-Suchmuster auf richtige Syntax überprüfen, indem Sie sie auf der Kommandozeile mit egrep ausprobieren:
echo "Zeile" | egrep -d "Suchmuster"

Trifft das Suchmuster auf die Zeile zu, dann wird sie unverändert nochmal ausgegeben. Sonst nicht. Weil Sie bei diesem Verfahren vrmtl sehr oft dasselbe Kommando geringfügig verändern wollen, sollten Sie sich zuvor mit "bash" eine Eingabeunterstützung holen. Die Cursortasten funktionieren jetzt.

Weitere Hinweise

eMails löschen

Definieren Sie als Aktion "/dev/null". Die eMails sind dann weg. Wenn Sie noch unsicher mit procmail Filtern sind, dann probieren Sie bitte zuerst mit einer harmloseren Aktion aus, ob Sie auch die richtigen eMails erwischen. Nehmen Sie niemals Löschen als Aktion, wenn Sie keine log Datei angeben haben: Sie wissen sonst nicht einmal, was überhaupt gelöscht wurde.

Verschiedene Subjects mit einem Filter einfangen

Die Syntax dazu ist: "(free|Millions)". D.h: die einzelnen Strings werden mit "|"-Zeichen getrennt und das Ganze in Klammern gesetzt. Vermeiden Sie diesen Fehler: "(free|Millions|)". Durch das letzte "|"-Zeichen entsteht ein leerer String, der immer zutrifft.

procmail-Aktivitäten im log überwachen

Wenn Sie Problemen hinterhersuchen, dann können sie "VERBOSE=yes" setzen: procmail schreibt jetzt nicht nur in seine log Datei, was es tut, sondern auch welche Filter nicht zutrafen. Achtung: die log-datei wird jetzt sehr schnell sehr groß. Sie sollten vermeiden VERBOSE lange auf yes zu lassen (Also stellen Sie es auf no oder kommentieren die Zeile aus ("#").

Weiterführende Dokumentation

Die Dokumentation von procmail: "man procmail" und Beispiele mit "man procmailex". Details: "man procmailrc". Diese Befehle rufen die manual-pages für procmail auf.

In Englisch, aber sehr gut, einsteigerfreundlich und gradezu komplett: http://www.uwasa.fi/~ts/info/proctips.html [extern].

Hinweise für weitere Kommandozeilenbefehle finden Sie hier

 

geändert am 27. Oktober 2007  E-Mail: Webmasterpresse@uni-frankfurt.de

|

| Zur Navigationshilfe
empty

Seitenabschlussleiste


Druckversion: 27. Oktober 2007, 22:19
http://www.uni-frankfurt.de/org/hrz/internet/mail/Support/FAQ/Howtos/procmail.html