original in es Angel Lopez
en to de Katja Socher
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 #juanIn 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.
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.
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.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.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.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.mxDie 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.
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.
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.
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.
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.