WeiterInhalt

5. Mails filtern

Die durch fetchmail empfangenen E-Mails (siehe 4. Mails empfangen) können nun durch den Mail Deliver Agent in den Postfächern der User abgelegt und bei Bedarf gefiltert werden. Diese Aufgabe übernimmt das Programm procmail.

Anm.: Standardmäßig werden die Nachrichten auch ohne procmail im Ordner new des Maildir-Verzeichnisses abgelegt.

5.1 Mail Deliver Agent (MDA) - procmail

Alle Mails werden mit Hilfe von procmail in den Postfächern der entsprechenden User gespeichert. Es kommt jedoch vor, daß nicht alle ankommenden Mails erwünscht sind (z.B. Werbemails). Oder die Mails sind durch das Abonnieren vom Mailnews so viele, daß sie zunächst in verschiedene Ordner sortiert werden sollen. Auch diese Aufgaben kann procmail lösen (Anm: Vorher unbedingt 5.1.3 lesen!).

5.1.1 Konfiguration von procmail

Die Einstellungen von procmail werden in der Datei .procmailrc vorgenommen. Diese Datei wird im Homeverzeichnis eines Anwenders abgelegt. Sie ist jedoch nicht zwingend erforderlich. Wenn diese Datei nicht existiert, schreibt procmail alle Mails in den Standardordner /var/spool/mail/username.
Die Datei .procmailrc besteht aus zwei Teilen: dem Header und der Regelliste. Im Header werden u.a. die Pfadangaben und ob ein Logbuch erstellt werden soll angegeben:
PATH=$HOME/bin:/usr/bin:/bin:/usr/local/bin:.
MAILDIR=$HOME/Mail 
DEFAULT=/var/spool/mail/username
LOGFILE=$MAILDIR/procmail.log
In der Regelliste werden die Kriterien, nach denen die Mails sortiert werden sollen festgelegt. Die Regeln werden nacheinander abgearbeitet. Sobald eine der Regeln zutrifft wird die Abarbeitung der .procmailrc beendet. Wenn keine Regel zutriftt, wird die Mail im DEFAULT-Verzeichnis abgelegt. Eine Regel besteht meist aus drei Zeilen. Die erste Zeile beginnt immer mit ':0'.
:0    oder     :0:
Der zweite Doppelpunkt sorgt dafür, daß die gerade bearbeitete Datei für andere Prozesse gesperrt wird. Weiterhin gibt es noch folgende Optionen:
H     die Bedingung gilt nur für die Kopfzeile (Header)
B     die Bedingung gilt für den Rumpf (Body)
D     Groß- und Kleinbuchstaben werden unterschieden
A     diese Regel wird nur dann angewandt, wenn die vorhergehende angewendet wurde
a     Wie A, außer, daß die vorhergehende Regel erfolgreich ausgeführt worden sein muß
E     Diese Regel wird ausgeführt, wenn die vorangegangene Regel nicht ausgeführt wurde
e     Diese Regel wird ausgeführt, wenn die vorangegangene Regel zwar ausgeführt, aber 
      mit einem Fehler abgebrochen wurde
b     Der Rumpf der Nachricht wird an den Befehl weitergegeben
f     Der Befehl wird als Filter interpretiert
c     Generiert eine Kopie von der Nachricht
w     Wartet auf den Befehl finish, um dann aus dem Programm herauszugehen
W     Wie die vorhergehende Option, gibt aber im Falle eines Fehlers keine Nachrichten aus
i     Ignoriert mögliche Tippfehler
h     Die Kopfzeile wird an den Befehl weitergegeben
r     Schreibt die Nachricht so wie sie ist. Prüft nicht, ob sie mit einer Leerzeile endet
Es können auch mehrere Optionen zusammen angewendet werden. In der zweiten Zeile folgt die Bedingung, beginnend mit einen Stern '*', gefolgt von regulären Ausdrücken die bestimmen, nach welcher Zeichenkette in der Mail gesucht werden soll. Die regulären Ausdrücke unter Linux benutzen die folgenden Symbole:
^     der Anfang einer Zeile
$     das Ende einer Zeile 
.     ein einzelnes, beliebiges Zeichen
*     ein Zeichen einmal, mehrmals oder gar nicht
+     ein Zeichen mindestens einmal oder mehrmals
?     ein Zeichen entweder mehrmals oder garnicht
[]    eine Menge von Zeichen, die in den eckigen Klammern angegeben werden
[^]   diese Zeichen dürfen nicht vorkommen
a|b   entweder 'a' oder 'b'
\     das folgende Zeichen soll als das Zeichen, wofür es steht benutzt werden
!     Invertiert die Bedingung
Beispiele:
* ^From       sucht 'From' am Zeilenanfang
* linux$      sucht 'linux' am Zeilenende
* ^MP3$       'MP3' ist das einzige Wort in dieser Zeile
* [3-7]       eine Ziffer zwischen '3' und '7' 
* [^6]        eine beliebige Ziffer, außer '6'
* A+          einmal oder mehrmals das Zeichen 'A'
* A?          entweder kein oder mehrere 'A'
* ^From[ :].*@werbung\.com    jeder Absender der Domäne 'werbung.com'.
Anmerkung: Die Zeichfolge '.*' bedeutet, daß irgendein Zeichen ('.'), beliebig oft ('*') vorkommen kann.

Es können mehrere Bedingungen nacheinander angegeben werden. In diesem Fall ist eine Regel dann erfüllt, wenn alle Bedingungen zutreffen (UND-Verknüpfung). Nach den Bedingungen folgt eine auszuführende Aktion. Diese wird ausgeführt wenn die Regel zutrifft:

!db@mail.de  die Nachricht wird an die angegebene Mailadresse weitergeleitet
|mail        startet ein Programm oder Script namens 'Mail'
linux        die Mail wird im Mailordner 'linux' gespeichert
/dev/null    die Mail wird gelöscht
Beispiele einer Regel:
:0 H
* ^Sender: linux@64-bit.de
.linux

:0 HB
* ^From.*werbung.com
* .*Kaufen
/dev/null
Die erste Regel durchsucht den Mailheader nach der Zeichenkette Sender: linux@64-bit.de beginnend am Zeilenanfang. Wird sie gefunden, dann legt procmail die Mail im Ordner .linux im Mailverzeichnis ab. Die Zweite sucht im Kopf (H) und dem Rumpf (B) nach einem Absender mit der Domäne werbung.com und dem Text Kaufen
und löscht diese sofort.

5.1.2 Die Datei '.procmailrc'

Die Datei .procmailrc besteht, wie oben beschrieben aus dem Header und der Regelliste. Sie wird im Homeverzeichnis eines jeden Anwenders gespeichert.
# Konfigdatei fuer procmail
# Mailserver-HOWTO
#
# Dirk Bender
#
# Evtl. müssen die Pfade angepasst werden

# Der Header:

# Suchpfade für Programme die von procmail benötigt werden
PATH=$HOME/bin:/usr/bin:/bin:/usr/local/bin:.

# In diesem Verzeichnis werden sortierte Mails abgelegt
MAILDIR=$HOME/Mail 

# Mails auf die keine Regel zutrifft liegen unter: 
DEFAULT=/var/spool/mail/dirk

# In dieser Datei werden Status- und Fehlermeldungen protokolliert
LOGFILE=$MAILDIR/procmail.log

# Wie ausführlich sollen die Aktionen protokolliert werden
# Wenn die Konfiguration stimmt, sollte es auf 'off' stehen
VERBOSE=on

# Ruft ein Programm o. Script bei jedem Beenden von procmail auf
#TRAP=<Programmname>

# Nun folgen die Regeln:

# Mails vom Sender 'werbung.com' werden aussortiert:
:0
  * ^From[ :].*@werbung.com
  .trash    # '/dev/null' wuerde die Mail sofort Loeschen

# Mails vom Sender 'linux-news.de' werden in 
# '/home/dirk/Mail/news' verschoben:
:0
  * ^From[ :].*@linux-news.de
  news

# Mails die die Zeichenfolge linux enthalten werden in 
# '/home/dirk/Mail/linux' verschoben:
:0 B
  * ^.*linux
  linux

# Mails von Sybille werden in den Ordner 'sybille' weitergeleitet 
# und es wird eine Nachricht per Winpopup an einen Rechner gesendet:
:0 H
  * ^Sender: sybille@64-bit.de
  {
  :0 c
    | echo Eine Mail von Sybille | smbclient -M rechnername
  :0
    sybille
  }

5.1.3 Anmerkung zu procmail

Wie aus der Beschreibung zu entnehmen ist, kann man mit Hilfe von procmail ohne große Probleme Mails in verschiedene Verzeichnisse sortieren. Allerdings ergibt sich dadurch folgendes Problem: Man kann diese Mails nicht mit einfachen Mailprogrammen (z.B. Mozilla) abrufen. Diese Mailprogramme rufen nur die Mails ab, die in den Standardverzeichnissen gespeichert wurden. Um die Mails, die z.B. unter /home/dirk/Mail/news gespeichert wurden zu lesen muß man unter Linux die Befehlszeile mail -f /home/dirk/Mail/news ausführen oder man benötigt (soweit ich weiss) einen IMAP-Server. Ich verwende procmail, daher nur für das Entfernen von Werbung und unnötigen 'News'.


WeiterInhalt