Verwaltung deiner Post mit procmail

ArticleCategory

Software Development

AuthorImage

[Photo of the Author]

TranslationInfo:[Author and translation history]

original in es Angel Lopez

en to de Katja Socher

AboutTheAuthor

[no info]

Abstract

procmail ist ein Programm zum sortieren und beantworten von E-mail. Dieser Artikel beschreibt, was man mit procmail machen kann und wie procmail konfiguriert wird.

ArticleIllustration

ArticleBody:

Installation

Der erste Schritt ist, die neueste Version von procmail zu bekommen.. Als dieser Artikel geschrieben wurde, war dies 3.11pre7.

Nachdem du den Quellcode für das Programm bekommen hast, mußt du zum Installieren das Programm mit dem folgenden Befehl dekomprimieren und auspacken: tar -xzvf procmail.tar.gz

Der nächste Schritt ist, die Dateien Makefile und config.h zu editieren. Da dieser Artikel nur eine Einführung sein soll, und um die Dinge in der ersten Einführung einfach zu halten, werden wir die verschiedenen Konfigurationsmöglichkeiten dieser Dateien nicht erklären. Der interessierte Leser kann in den manual pages und in der Quell-Dokumentation nachsehen.

Trotzdem ist es angebracht, die Existenz der Option BASENAME im Makefile zu erwähnen. Mit dieser Option geben wir die Verzeichnisbasis an, in der procmail installiert wird. Von diesem von uns angegebenen basename Verzeichnis werden weitere Verzeichnisse als bin und man angehängt.

Schließlich müssen wir, um das Paket zu kompilieren, den Befehl make install. ausführen.

Procmail kann für das gesamte System installiert sein und dann durch einige Regeln von sendmail(8) aufgerufen werden oder es kann auch nur für einen Benutzer zum eigenen Gebrauch installiert sein. Im letzten Fall wird der Benutzer seinen Gebrauch von procmail in seiner .forward angeben, wo es eine Zeile wie die folgende geben sollte:

|IFS=' ' && exec /home/juan/procmail/bin/procmail -f- || exit 75 #juan

In dieser Zeile bin ich davon ausgegangen, daß der Benutzer juan procmail in seinem HOME Verzeichnis installiert hat. In dieser speziellen Zeile ist der BASENAME, der zur Kompilation spezifiziert sein sollte, /home/juan/procmail.

Grundfunktionen

Procmail liest von seinen Standardeingaben. Es prüft die Datei .procmailrc, eine Konfigurationsdatei, die der Benutzer in seinem HOME Verzeichnis haben sollte. Diese Datei definiert bestimmte Regeln, die procmail sagen, was es nach dem Lesen einer Nachricht tun soll. Es kann die Anweisung bekommen, nach bestimmten Zeichenketten im Kopf der Nachricht zu suchen, um daraufhin zu entscheiden, ob die Nachricht gespeichert, ignoriert, automatisch beantwortet etc.. werden soll.

Procmail läßt uns außerdem die ankommende Post oder die in einer Datei gespeicherte Post automatisch handhaben.

Konfiguration

Die Konfigurationsdatei, die benutzt wird, ist .procmailrc und sie muß sich im HOME Verzeichnis befinden.

Jede Zeile, die mit # beginnt, wird als Kommentar betrachtet.

Zeilen, die mit :0 oder :0: beginnen, zeigen den Anfang einer neuen Regel an, die procmail sagt, was es mit einer Nachricht tun soll.

Die Zeilen, die mit * beginnen, geben eine Bedingung an, die erfüllt sein muß, damit eine Regel angewendet wird. Dies ist der Mechanismus, den procmail verwendet, um zu entscheiden, welche Nachrichten eine weitere Bearbeitung erfordern und welche nicht.

Die übrigen Zeilen, also die, die nicht mit :, oder * anfangen, werden als Befehle betrachtet, in anderen Worten, Aktionen, die von procmail für die Nachrichten, die die Bedingung erfüllen, ausgeführt werden müssen. Einige mögliche Aktionen oder Befehle sind das Löschen einer Nachricht, das Weiterleiten einer Nachricht, das Speichern einer Nachricht...

Das erste, das in einer .procmailrc angegeben werden muß, sind einige Umgebungsvariablen. Hier sind einige Variablen, die ich dir empfehle, in deiner .procmailrc

zu definieren.

MAILDIR
Gibt das Verzeichnis an, in dem procmail die Dateien mit den Postnachrichten speichert. Diese Variable zeigt normalerweise auf $HOME/mail oder $HOME/Mail. Welche der beiden es ist, hängt von dem benutzten Mailleser ab.

LOGFILE
Gibt den Namen der Logdatei an, in der procmail alle Aufzeichnungen über ausgeführte Transaktionen ablegt.

SENDMAIL
Gibt an, wo das Programm sendmail zu finden ist, das zum automatischen Beantworten von Nachrichten benutzt wird.

FORMAIL
Gibt an, wo das Programm formail zu finden ist. Dieses Programm wird zusammen mit procmail verteilt und es dient dazu, vor dem Senden oder Abspeichern einer Nachricht Kopfzeilen zu verändern oder Nachrichten zu reformatieren.

DEFAULT
Datei, in der eine Nachricht gespeichert wird, wenn procmail nicht in der Lage war, eine der definierten Regeln darauf anzuwenden.

Irgendwo in .procmailrc kann man eine Umgebungsvariable definieren. Wenn eine Variable ohne das Symbol = gefolgt von einem Wert geschrieben wird, dann wird diese Variable entfernt.

Die Regeln kann man in zwei Gruppen unterteilen: Regeln, die eine Nachricht als geliefert betrachtet, nachdem ihre Aktion ausgeführt wurde und solche, die das nicht tun.

Die erste Gruppe von Regeln ist einfach, nach Ausführung ihrer Aktion nehmen sie an, daß keine weiteren Regeln auf die Nachricht angewendet werden sollen und liefern sie deshalb aus.

Der zweite Typ von Regeln, der, der eine Nachricht nicht durch das Ausführen ihrer Aktion als ausgeliefert betrachtet, ist sehr nützlich, wenn man die Möglichkeit haben möchte, mehrere Regeln und Aktionen auf eine Nachricht vor dem Empfangen anzuwenden.

Die allgemeine Syntax für eine Regel lautet folgendermaßen:

 
           :0 [options] [ : [exclusion file] ] 
           * condition 1 
           * condition 2 
                 . 
                 . 
                 . 
           * condition N 
           command 
           

Laß uns diese Konstruktion Stück für Stück analysieren. Zuerst beginnt jede Regel mit :0, danach darf eine der folgenden Optionen stehen:

H Die Bedingung wird auf die Kopfzeile angewandt.
B Die Bedingung wird im Rumpf der Nachricht gesucht.
D Wenn die Bedingung geprüft wird, werden Klein- und Großbuchstaben unterschieden.
A Diese Regel wird nur dann angewandt, wenn die vorhergehende angewendet wurde.
a Wie A, außer, daß die vorhergehende Regel ohne Fehlermeldung 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.
h Die Kopfzeile wird an den Befehl weitergegeben.
b Der Rumpf der Nachricht wird an den Befehl weitergegeben.
f Der Befehl wird als Filter interpretiert.
c Generiert eine Durchschlagkopie cc von der Nachricht. Wenn eine Regel ausgeführt wird, die die Nachricht mit diesem flag als geliefert betrachtet, dann wird eine Arbeit um die Lieferung ausgeführt und weitere Regeln können auf die Durchschlagkopie der Nachricht angewendet werden.
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.
r Schreibt die Nachricht so wie sie ist. Prüft nicht, ob sie mit einer Leerzeile endet.

In der Default- Einstellung, wenn keine Option spezifiziert ist, wird die Bedingung an der Kopfzeile (Option H) geprüft. Der Befehl erhält als Standardinput sowohl den Kopf als auch den Rumpf der Nachricht (Optionen h und b). Es wird nicht zwischen Groß- und Kleinschreibung unterschieden.

Nach :0 und seinen möglichen Optionen kann ein zweiter : folgen. Wenn dies so ist, zeigt er an, daß die Zieldatei, in die die Nachricht gelangen soll, geblockt werden soll, um zu verhindern, daß zwei Prozesse gleichzeitig in die Datei schreiben. Optional kann man die Exklusionsdatei angeben, die als lock benutzt werden soll.

Als nächstes folgen die Bedingungen, eine pro Zeile und durch ein * Zeichen vorweg angezeigt. Bedingungen werden normalerweise als reguläre Ausdrücke geschrieben, um eine Zeichenkette im Kopf- oder Rumpfteil der Nachricht zu finden. Reguläre Ausdrücke benutzen u.a. die folgenden Symbole:

^ Beginn einer Zeile.
$ Ende einer Zeile . Jedes Zeichen, außer der Return-Taste
* Null oder mehrmals.
+ Ein- oder mehrmals.
? Null oder mehrmals.
[a-z] Menge von Zeichen, in diesem Beispiel Menge von a-z.
[^a-z]Jedes Zeichen, das nicht zur Menge von a-z gehört.
a|b Entweder 'a' oder 'b'

Nach den Bedingungen kommt ein einzelner Befehl. Wenn das erste Zeichen des Befehls eines der folgenden ist, dann beginnt ein spezielles Verhalten:

! Die Nachricht wird an alle angegebenen Mailadressen weitergeleitet.
| Wenn diesem Befehl ein ausführbares kleines Programm folgt, dann wird es immer ausgeführt, wenn die Bedingung erfüllt wird. Wenn dem Symbol nichts folgt, dann geht der gesamte Teil der Nachricht in den Standardoutput. Wenn stattdessen nach | der Name einer Variablen folgt, dann wird das Ergebnis des angegebenen Befehls in dieser Variablen gespeichert.

Mailinglisten

Eine Situation, in der procmail sehr nützlich sein kann, ist die Verwaltung unserer Post. Laß uns annehmen, daß wir drei Linux Mailinglisten abonniert haben. Jede Liste wird durch eine Ursprungsadresse identifiziert, z.B. könnten es die folgenden Adressen sein

 
           l-linux@calvo.teleco.ulpgc.es 
           linux@nuclecu.unam.mx 
           linux-security@redhat.com 
         

Unter normalen Umständen würden die Nachrichten von diesen Mailinglisten zusammen ankommen, im selben Briefkasten und, wenn nichts getan wird, dort durcheinander liegen bleiben. Es wäre viel einfacher, wenn die Post, wenn sie ankommt, in geeignete Dateien sortiert und gespeichert würde.

Procmail kann dieses Problem leicht lösen. Wir könnten eine Datei .procmailrc mit den folgenden einfachen Regeln benutzen, um unsere Post von den Linux Mailinglisten zu sortieren:

 
:0 
* ^From.*l-linux@calvo.teleco.ulpgc.es 
l-linux 
 
:0 
* ^From.*linux@nuclecu.unam.mx 
linux-mx 
 
:0 
* ^From.*linux-security@redhat.com 
linux-security 

Laßt uns die Regeln genau untersuchen. Wenn du den inneren Ablauf einer Regel verstanden hast, dann ist es einfach, den Rest zu verstehen, da der grundlegende Mechanismus immer derselbe ist.

Zuerst findet man eine :0 Zeichnkette, was den Beginn einer neuen Regel anzeigt. Es wurden keine weiteren Optionen spezifiziert, d.h. procmail nimmt die Default-Einstellungen für diese Regel: Groß- und Kleinbuchstaben werden nicht unterschieden, die Bedingung wird nur auf den Kopfteil angewendet, der Befehl empfängt beides, Kopf und Rumpf der Nachricht.

In der nächsten Zeile findet man die Bedingung, die, wie bereits vorher erwähnt, immer an dem ersten Zeichen, das ein t* sein muß, erkennbar ist. Die Bedingung ist der folgende reguläre Ausdruck:

^From.*linux@nuclecu.unam.mx

Die Unterzeichenkette ^From sagt procmail, daß es nach den Zeilen suchen soll, die mit der Unterzeichenkette From beginnen.

Das darauf folgende .* Zeichen bedeutet, daß irgendeine Anzahl von Zeichen folgen kann. Wir haben vorher gesehen, daß in regulären Ausdrücken ein "." Zeichen gleichbedeutend zu irgendeinem Zeichen ist, und daß * bedeutet, daß kein oder mehrere Zeichen folgen dürfen. Dann bedeutet .*, daß nach dem Anfang From kein oder meherere beliebige Zeichen stehen dürfen.

Als nächstes sollte linux@nuclecu.unam.mx kommen, was die Adresse ist, von wo die Nachricht herkommt.

Nach ein bißchen Nachdenken über die regulären Ausdrücke wirst du verstehen, daß die folgenden Zeilen durch die Regel erkannt werden würden:

 
From: linux@nuclecu.unam.mx 
From:linux@nuclecu.unam.mx 
FROM linux@nuclecu.unam.mx 

Mit dieser Regel kann man schon Nachrichten, die von unterschiedlichen Adressen kommen, unterscheiden. So, jetzt, wo wir die Nachricht haben, was soll weiter mit ihr geschehen?.

Die nächste Zeile ist der Befehl (oder die Aktion), und sie gibt an, was mit der Nachricht geschehen soll. In diesem Fall soll es zu der Datei linux-mx geschickt werden, wo es gespeichert werden soll. Für den Fall, daß kein absoluter Weg zu der Datei angegeben wurde, wird er per default als relativ zur Umgebungsvariablen $MAILDIR betrachtet.

Nachrichten, die von unterschiedlichen Listen eintreffen, können jetzt nach ihrem Ursrung (From Feld) in verschiedene Dateien verteilt werden.

Automatisches Antworten

Eine andere Situation, in der procmail nützlich ist, ist das automatische Antworten. Es ist oft sehr handlich, z.B., wenn du deinen öffentlichen PGP Schlüssel automatisch an jeden schicken möchtest, der ihn per E-Mail anfordert.

Um dies zu tun, schreibe eine Regel, die jede Nachricht mit der Zeichenkette PGP im subject als Anfrage nach deinem öffentlichen PGP Schlüssel betrachtet. Diese Regel kann folgendermaßen geschrieben werden:

 
0: 
* ^Subject.*PGP 
| (formail -r ; cat $HOME/key.asc) | sendmail -t 

Dieselbe Idee kann benutzt werden, um das typische Programm zu schreiben, das die Leute wissen läßt, daß wir im Urlaub sind und nach unserem Zurückkommen ihrer E-Mails beantworten werden:

 
0: 
| (formail -r; cat $HOME/vacations.txt) | sendmail -t 

m letzen Fall gibt es keine Bedingung, da allen Nachrichten diesselbe Notiz geschickt werden sollI.

Vermeiden von unendlichen Schleifen in automatischen Antworten

In den vorhergehenden Beispielen wurde kein Versuch unternommen, mit möglichen unendlichen Schleifen umzugehen, die manchmal auftreten können, wenn E-mails automatisch beantwortet werden.

Wenn eine Nachricht, deren Ursprung unsere eigene E-Mail Adresse ist, von dem Programm beantwortet würde, dann würde die Antwort wieder zu uns zurückkommen. Diese Nachricht würde dann wiederum beantwortet werden und immer so weiter in einer unendlichen Schleife. Um dies zu vermeiden, sollte man beim Beantworten der Nachricht eine extra Zeile in den Kopfteil einfügen, die angibt, daß die Nachricht schon beantwortet wurde. Dies geschieht durch das Benutzen der Option -A von dem Programm formail:

formail -r -A"X-Loop: dir@email.es"

wobei dir@email.es deine eigene E-Mail Adresse wäre. Auf diese Weise wird beim Generieren des Kopfteils für die Antwort die Zeile X-Loop hinzugefügt, damit man später, mit einer neuen Regel danach suchen kann:

 
:0 
* !^X-Loop: dir@email.es 
| (formail -r -A"X-Loop: dir@email.es" ;  
    cat $HOME/vacation.txt) | sendmail -t 

Diese Regel verhindert eine unendliche Schleife, weil jede Nachricht, die im Kopfteil die Zeile X-Loop enthält, die Bedingung nicht erfüllt und als Ergebnis von procmail nicht beantwortet wird.

Dekodieren von Dateien

Eine andere interessante Regel für unsere .procmailrc ist die, die eintreffende Mails, die mit uuencode(1) kodiert sind, automatisch dekodiert. Die Regel könnte folgendermaßen lauten:

 
:0 B 
* ^begin 644 .* 
{ 
	MAILDIR=$HOME/files 
	 
	:0 
	| uudecode 
} 

Hier wird explizit durch die Option B angegeben, daß die Bedingung der Regel nur für den Rumpfteil der Nachricht geprüft werden soll.

Wenn die Regel eine Zeile findet, die mit der Zeichenkette "begin 644" beginnt, bedeutet das, daß sie den Anfang einer mit uuencode(1) kodierten Datei gefunden hat und baut deshalb die Umgebungsvariable MAILDIR auf, was gleichbedeutend mit dem Wechsel des Verzeichnisses ist, auf das die Variable zeigt. Von diesem Moment an wird für alle print oder Anzeige Aktionen das Basisverzeichnis genommen. In unserem Fall sind wir daran interessiert, die erhaltene Nachricht in $HOME/files zu speichern.

Als nächstes gibt es eine Regel, ohne Bedingung, die nur die Nachricht zu uudecode(1) zur Dekodierung weiterleitet. Die ursprüngliche Datei geht nach $HOME/files.

Schlußbemerkung

Hoffentlich ist nach dieser kurzen Einführung in procmail klar geworden, daß procmail extrem vielseitig ist und es dir helfen kann, deine Post einfach und bequem zu verwalten. Ich rate dir, mit den regulären Ausdrücken herumzuexperimentieren und die Regeln an deine Bedürfnisse anzupassen, da procmails Möglichkeiten weit über das hinausgehen, was ich in dieser kurzen Einführung diskutieren konnte.

Weitere Informationen