Butschek.de

Warnung: Diese Seite ist eine statische Kopie eines früher betriebenen Blogs. Es findet keine Aktualisierung mehr statt. Kommentare und die Suche funktionieren nicht.

Linux, Server & Co

Procmail-FAQ

41 comments

1. Zu diesem FAQ

Ich hatte lange Zeit das Problem, dass ich beim Ändern der Filter grundsätzlich entweder riesige Anleitungen oder nichtsnutzige Webseiten lesen musste. Das Problem ist, dass entweder jeder einzelne Parameter beschrieben wird (viel zu komplex) oder eben wichtige Regeln fehlen oder nicht ausreichend erklärt werden. Ich habe mir hier die Mühe gemacht, die wichtigsten Punkte in Deutsch zusammen zutragen. Mit diesen Informationen dürften die meisten Standard-Fälle lösbar sein.

Übrigens, ich wurde darauf hingewiesen, daß ich die Themen nicht in der korrekten Reihenfolge nenne. Ich möchte dazu sagen, daß ich dies als FAQ verstehe, nicht als Ersatz für eine vernünftige Anleitung.

2. Weitere Informationen

Sollten die Informationen in diesem FAQ nicht genügen, so stehen die MAN-Pages (man procmail, man procmailrc, man procmailex) zur Verfügung. Weiterhin gibt es eine Vielzahl von Websites, die sich mit dem Problem ProcMail beschäftigen.

3. Was ist ProcMail?

ProcMail ist ein eMail-Filter. Alle für Ihren Account ankommenden Nachrichten werden durch den Filter geschickt, sofern es installiert und korrekt konfiguriert ist. Hier lassen sich die Nachrichten entsprechend der Filterregeln weiterleiten, löschen, beantworten oder zustellen.

4. Was ist ein Receipe?

Ein Receipe definiert eine oder mehrere Bedingungen und eine oder mehrere Aktionen, die ausgeführt werden, wenn die Bedingung erfüllt ist. Als Beispiel sei genannt: „Wenn der Empfänger xyz@abc.de ist (=Bedingung), dann lösche diese Nachricht (=Aktion)“.

Werden mehrere Bedingungen angegeben, so wird die Aktion ausgeführt, wenn alle angegebenen Bedingungen erfüllt sind. Um jedoch nicht in eine für viele unverständliche Fachsprache zu verfallen, werde ich in diesem FAQ Receipes einfach als Filterregel bezeichnen.

5. In welcher Datei stehen die Filterregeln?

Im Home-Verzeichnis des entsprechenden Users muss die Datei .procmailrc angelegt werden. In dieser Datei werden die Filterregeln für diesen Benutzer angelegt. Damit dies funktionert, darf weder das Homeverzeichnis (in dem sich die .procmailrc befindet), noch die Datei .procmailrc selbst für andere (Group/Others) beschreibbar sein, sonst wird die Datei von Procmail abgelehnt. Schließlich kann eine von fremden editierbare Datei genutzt werden, um eMails abzufangen.

Haben Sie eine Domain mit Catch-All, so kommen also alle eMails in Ihr Postfach, damit sind die Filterregeln für alle gültig. Legen Sie jedoch weitere Benutzer an, so hat jeder Benutzer ein eigenes Home-Verzeichnis und ein eigenes Postfach. Damit gelten Ihre Regeln für den Benutzer nicht, da er selbst seine Regeln in der Datei .procmailrc in seinem Home-Verzeichnis festlegen muss.

Bei einigen Providers ist Procmail zwar installiert, doch läßt sich aufgrund des Umstands nicht nutzen, daß man nicht in die Home-Verzeichnisse der Mail-User kommt. Beispiel: Der Kunde hat einen Account mit dem Namen „kunde123“, während seine Mail-Accounts unter „kunde123p1“, „kunde123p2“, … gespeichert sind. Da der Kunde keinen direkten Zugang zum Home-Verzeichnis von kunde123p2 hat, kann er für diesen auch keine Filer
erstellen.

6. Kann ich meine Regeln kommentieren?

Alle Zeilen, die mit einer # beginnen werden von ProcMail ignoriert. Damit ist es möglich, Kommentare in der Regeldatei zu vermerken.

7. Wie lege ich eine Filterregel an?

Eine Filterregel beginnt immer mit :0 eventuell gefolgt von Flags. Danach kann eine oder mehrere Bedingungszeilen folgen. Wird keine Bedingungszeile angegeben, so trifft diese Regel auf alle Nachrichten zu. Die letzte Zeile ist die sog. Action-Line, hier wird angegeben, was mit der Nachricht passieren soll, wenn die Regel auf diese Nachricht zutrifft.

8. Was sind Flags?

Nur die wichtigsten Flags werden hier genannt. Bitte beachten Sie, dass die Gross / Kleinschrift eine Rolle spielt.

  H
  Die Regeln gelten für den Header der Nachricht (Standart)

  B
  Die Regeln gelten für den Body (eigentliche Nachricht)

  D
  Unterscheide zwischen Gross- und Kleinschreibung

  c
  Erzeugt eine Kopie der Nachricht. Die Regel wird auf die
  Kopie der Nachricht angewendet, die Orginalnachricht wird
  zugestellt (sofern nicht eine folgende Regel dies
  verhindert).

9. Wie sehen Bedingungszeilen aus?

Enthält eine Filterregel keine Bedingungszeile, so gilt die Regel für alle Nachrichten. Andernfalls beginnt die Regel mit einem Stern. Danach folgt eine Bedingung. Hierbei gelten folgende Sonderzeichen:

^
Anfang der Zeile

$
Ende der Zeile

. (Punkt)
Ein beliebiges Zeichen, ausgenommen eine neue Zeile

*
Das vorhergehende Zeichen kommt 0 mal oder öfter vor. Beispiel:
x* heisst also, dass entweder kein Zeichen oder ein oder
mehrere x?en vorkommen dürfen.  

+
Wie der Stern, jedoch muss mindestens ein Zeichen vorkommen
(nicht keines). 

?
Wie der Stern, jedoch muss entweder ein oder kein Zeichen
vorkommen (nicht mehrere). 

[a-x]
Es darf ein Buchstabe zwischen a und x vorkommen. In
Kombination mit dem Pluszeichen [a-z]+ erwartet diese Bedingung
also ein oder mehrere Zeichen des Alphabetes.  

[a-z]*
Praxisbeispiel: Es dürfen beliebig viele Buchstaben vorkommen

[a-z]+
Praxisbeispiel: Es dürfen beliebig viele Buchstaben, mindestens
jedoch ein Buchstabe vorkommen

abc|de
Diese Bedingung besagt, dass entweder die Zeichenfolge abc oder
die Zeichenfolge de vorkommen muss. 

(abc)*
Besagt, dass keinmal, einmal oder mehrmals die Zeichenfolge abc
vorkommen muss (in der Praxis ein eher unübliches Beispiel). 

!
Ein Ausrufezeichen vor einer Bedingung kehrt diese um. Sie ist
also dann erfüllt, wenn die nachfolgende Bedingung nicht
erfüllt ist.

10. Wie wendet man diese Bedingungen in der Praxis an?

Sie prüfen üblicherweise den Header der Nachricht auf das Vorkommen bestimmter Zeilen. Möchten Sie also eine Bedingung erstellen die dann erfüllt sein soll, wenn der Absender xyz@abc.de war, so sehen sie sich erst einmal eine Nachricht an. Hier werden Sie eine Zeile im Kopf finden, der etwa so aussieht:

  From: Hans Mustermann <xyz@abc.de>

Damit sollte Ihre Bedingung klar sein. Sie suchen ein FROM am Zeilenanfang, dann beliebig viele Zeichen gefolgt von der gesuchten eMail-Adresse. Alle Zeichen nach der eMail-Adresse interessieren nicht mehr, da die Regel hier bereits erfüllt ist.

  Zeilenanfang: ^
  Was ist zu Suchen in der neuen Zeile: From
  Keines, eins oder mehrere beliebige Zeichen: .*
  Die gesuchte eMail-Adresse: xyz@abc.de

  Die fertige Regel: ^From.*xyz@abc.de

Suchen sie eine Bedingung für alle Nachrichten, die nicht an Sie (mustermann@provider.de) gesendet wurden, so benutzen Sie diese Bedingung: Am Zeilenanfang muss To stehen, dann beliebige Zeichen gefolgt von Ihrer eMail-Adresse, jedoch darf diese Regel NICHT zutreffen. Die Bedingung lautet also:

  !^To.*mustermann@provider.de

11. Besondere Zeichen in der Regel

Mit den Zeichen < und > können Sie prüfen, ob eine Nachricht grösser oder kleiner als die angegebene Zahl ist. Somit besteht zum Beispiel die Möglichkeit, dass alle Nachrichten grösser als 20 MB automatisch gelöscht werden und der Absender eine Nachricht zurück bekommt. Dies ist sinnvoll, wenn Ihr Plattenplatz begrenzt ist.

12. Was passiert nun mit meiner Nachricht weiter?

Das hängt davon ab, welche Action-Line Sie angeben. Die Action-Line ist die letzte Zeile einer Regel. Hier geben Sie an, was mit der Nachricht geschehen soll, natürlich nur, wenn die vorhergehende Regel zutrifft. Folgende Möglichkeiten ergeben sich hier:

  mailboxname
  Geben Sie einfach nur einen Mailboxnamen ein, so wird diese
  Nachricht in der betreffenden Mailbox abgelegt.

  /pfad/dateiname
  Die Nachricht wird in der angegebenen Datei gespeichert.
  Existiert die Datei schon, so wird die Nachricht an die Datei
  angehängt.  

  ! email@adresse.de
  Die Nachricht wird an die angegebene eMail-Adresse
  weitergeleitet. Beachten Sie aber, die Nachricht nicht an
  eine Adresse zu Ihrem Postfach zu leiten, sonst senden Sie
  die Nachricht dauerhaft im Kreis.   

  | Programmname
  Die Nachricht wird an das genannte Programm übergeben.
  Erläuterungen siehe nächste Frage.

  { ... }
  Alle Befehle zwischen den Klammern werden ausgeführt. Dies
  entspricht einem Unterprogramm.

13. Wozu andere Programme?

2 weitere, oft in diesem Zusammenhang benötigten Programme sind Formail und Sendmail. Formail dient zur Bearbeitung der Header einer Nachricht. Dadurch lassen sich Antwortnachrichten generieren. Sendmail dient zum Versenden von eMails. Ich möchte hier lediglich die allerwichtigsten Parameter nennen.

13.1. Formail

  -r
  Erstellt aus dem übergebenen Header einen Antwort-Header
  (Reply). 

  -t
  Formail vertraut dem Absender, dass seine eMail-Adresse im
  FROM-Feld richtig eingetragen ist. 

  -a Kopfzeile
  Die angegebene Kopfzeile wird der Nachricht angefügt, jedoch
  nur, wenn eine entsprechende Kopfzeile noch nicht existiert.

  -A Kopfzeile
  Die angegebene Kopfzeile wird der Nachricht angefügt, auch
  wenn eine entsprechende Kopfzeile bereits existiert.

  -i Kopfzeile
  Die angegebene Kopfzeile wird der Nachricht angefügt.
  Existiert eine entsprechende Kopfzeile schon, so wird Sie
  umbenannt in "Old-.....".  

  -I Kopfzeile
  Die angegebene Kopfzeile wird der Nachricht angefügt.
  Existiert eine entsprechende Kopfzeile schon, so wird Sie
  einfach gelöscht.

13.2. Sendmail

  -Btyp
  Typ kann 7BIT oder 8BITMIME sein. Hiermit wird der Typ der
  Nachricht festgelegt. 

  -hx
  Mit dem h-Parameter legen Sie die Anzahl der Hops fest, die
  eine Nachricht zurücklegen darf, bevor sie mit einer
  Fehlermeldung zurückkommt. X ist dabei die Anzahl der Hops.
  Damit lassen sich Loops (Nachrichten, die immer im Kreis
  geschickt werden) vermeiden.    

  -t
  Liesst die Header der übergebenen Nachricht und sucht dort
  nach dem Absender und dem Empfänger. BCC-Zeilen werden vor
  dem Absenden gelöscht.

14. Gibt es auch Beispiele?

Klar. Hier werden jetzt einige Regeln veröffentlicht, die wohl die meisten Probleme regeln dürfte. Vorweg muss ich sagen, dass ich keinerlei Garantie für diese Regeln übernehmen kann.

Beachten Sie bitte: In der Datei .procmailrc werden mehrere Regeln verarbeitet. Wird die Nachricht durch eine oben stehende Regel verarbeitet, so gelten weiter unten stehende Regeln natürlich nicht mehr für diese Nachricht.

Weiterleiten aller Nachrichten an xyz@abc.de

  :0
  ! xyz@abc.de

Weiterleiten aller Nachrichten an xyz@abc.de, wenn die Absenderadresse @web.de enthält

  :0
  * ^From.*@web.de
  ! xyz@abc.de

Weiterleiten aller Nachrichten an xyz@abc.de, wenn im Titel „TEST“ vorkommt

  :0
  * ^Subject.*TEST
  ! xyz@abc.de

Weiterleiten aller Nachrichten, wenn im Absender „Mailer-Daemon“ und wenn im Titel „Return“ vorkommt

  :0
  * ^From.*Mailer-Daemon
  * ^Subject.*Return
  ! xyz@abc.de

Alle Nachrichten, die im Empfänger nicht qwe@asd.de stehen haben sollten mit einer Fehlermeldung zurückgeschickt werden. Aber Vorsicht dabei, sowas kann bei Spam-Attacken grauenhaft sein, da der eigene Mailer so tausende Fehlermeldungen erzeugt.

  :0
  * !^To.*qwe@asd.de
  {
  EXITCODE=67
  HOST
  }

Alle Nachrichten, die an news@asd.de geschickt werden, in einer Datei speichern.

  :0
  * ^To.*news@asd.de
  ! /home/user/dateiname.txt

Alle Nachrichten an spam@asd.de und junk@asd.de sofort löschen

Möglichkeit 1:

  :0
  * ^To.*(spam|junk)@asd.de
  /dev/null

Möglichkeit 2:

  :0
  * ^To.*spam@asd.de
  /dev/null

  :0
  * ^To.*junk@asd.de
  /dev/null

Die Datei test.txt zurücksenden, wenn die Nachricht an
test@asd.de geht

  :0c
  * ^TO.*test@asd.de
  | (formail -r -t -I "Return-path: <test@asd.de>"
    -I "From: test@asd.de"
    -I "Subject: Titel der Nachricht";
    cat /home/user/test.txt) | $SENDMAIL -t

Alle Nachrichten, die an verteiler@asd.de gehen an 3
eMail-Adressen weiterleiten

  :0
  * ^TO.*verteiler@asd.de
  {
  :0c
  ! erste@adresse.de
  :0c
  ! zweite@adresse.de
  :0
  ! letzte@adresse.de
  }

Wichtig hierbei: Alle Adressen bekommen eine Kopie (:0c), nur der Letzte bekommt die originale Nachricht. Der Grund hierfür ist klar: Würde der Erste Empfänger die Originalnachricht bekommen, so wäre beim zweiten Empfänger keine Nachricht mehr da.

Alternativ kann man mehrere Adresse auch mit einem Leerzeichen getrennt eintragen:

  :0
  * ^TO.*verteiler@asd.de
  :0
  ! erste@adresse.de zweite@adresse.de letzte@adresse.de

Eine Kopie der Nachricht an xyz@abc.de senden, wenn im Titel „Re:“ vorkommt.

  :0c
  * ^Subject.*Re:
  ! xyz@abc.de

15. Gibt es auch eine komplette Datei zum runterladen?

Nein. Wozu auch? Filter müssen ja sowieso immer individuell eingestellt werden. Ich kann natürlich eine Beispiel-Datei veröffentlichen, doch die Filter müssen Sie schon selbst anpassen.

  #
  # Zuerst werden alle Nachrichten gefiltert, die wie Spam
  # aussehen. Für Nutzer, die eMail nur national nutzen, sind
  # englische Nachrichten mit "wichtigem" Inhalt meist Spam.
  # Hierbei wird nur die eigentliche Nachricht untersucht.
  #

  :0B
  * (important|do not delete|sale|advertise|brandnew)
  /home/dafit/couldbespam.txt

  #
  # Nun lösche ich alle Nachrichten, die von einem Absender
  # oder von einem Mailer kommen, von denen ich schon einmal
  # Spam erhalten habe
  #

  :0
  * ^Reply-to.*@juno.com
  /dev/null

  :0
  * ^Received.*63.36.154.196
  /dev/null

  :0B
  * gotours@techie.com
  /dev/null

  :0B
  * signin4@123india.com
  /dev/null

  #
  # Nachrichten von einem Mailer-Daemon umleiten
  #

  :0
  * ^From.*MAILER-DAEMON
  ! error@butschek.de

  #
  # Nachrichten an freunde@butschek.de werden an alle meine
  # Freunde weitergeleitet, jedoch nur, wenn Sie mit meinem
  # Mailprogramm geschrieben wurden und von meiner Adresse
  # kamen.
  #

  :0
  * ^To.*freunde@butschek.de
  * ^From.*(mail|webmaster)@butschek.de
  * ^X-Mailer.*The Bat
  {
  :0c
  ! freund1@xyz.de
  :0c
  ! freund2@xyz.de
  :0c
  ! freund3@xyz.de
  :0c
  ! freund4@xyz.de
  :0
  ! freund5@xyz.de
  }

  #
  # Eine Nachricht an pgp@butschek.de wird mit meinem PGP-
  # Schlüssel beantwortet. Dazu wird die Datei pgp.msg
  # an den Absender zurückgeschickt. Diese muss natürlich
  # zuvor erstellt werden.
  #
  # WICHTIG: Alles von "(formail" bis "$SENDMAIL -t" muss
  # in eine Zeile geschrieben werden!
  #

  :0c
  * ^TO.*pgp@butschek.de
  | (formail -r -t
  -I "Return-path: <pgp@dafit.de>"
  -I "From: pgp@dafit.de"
  -I "Subject: PGP-Key von webmaster@dafit.de"
  -I "X-Loop: dafit.de";
  cat /home/dafit/pgp.msg) | $SENDMAIL -t

  #
  # Um verschiedene Projekte mit verschiedenen eMail-Adressen
  # zu versorgen, hat mein Freund Bernd bei mir auch eine
  # Adresse, die alle Nachrichten an seinen Account bei
  # seinem Provider weiterleitet. Und zwar alle Adressen,
  # die mit bernd@butschek.de enden, also auch Adressen wie
  # test.bernd@butschek.de oder xyz.bernd@butschek.de
  #

  :0
  * ^TO.*bernd@butschek.de
  ! bernd@provider.de

  #
  # Zum Schluss werden alle noch nicht sortierten Nachrichten
  # und auch alle Nachrichten an unbekannte Adressen mit
  # einer Fehlermeldung zurückgesendet.
  #

  :0
  * !^TO.*(mail|webmaster|mike|michael|butschek)@butschek.de
  {
  EXITCODE = 67
  HOST
  }
  /home/user/.procmailrc

16. Kann ich auch externe Dateien einbinden?

Klar, mit dem Befehl INCLUDERC=/pfad/dateiname läßt sich eine externe Datei in die Filterdatei .procmailrc einbinden. Wichtig ist jedoch, daß Sie Leserechte auf die externe Datei besitzen.

Sinnvoll ist dieser Befehl, wenn Sie zum Beispiel eine Spam-Datei für mehrere Benutzer anlegen möchten. Jeder Benutzer bindet die öffentliche Spam-Filter-Datei ein, wodurch sich diese Datei leicht administrieren läßt. Leider ist dies aufgrund des hohen Spam-Aufkommens heutzutage kaum noch möglich.

17. Kann ich ein Logfile erstellen lassen?

Zur Fehlersuche ist ein Logfile immer gut. Mit dem Befehl LOGFILE=procmail.log, möglichst am Anfang der Datei, läßt sich die Datei definieren, in der geloggt wird, in diesem Fall procmail.log im Home-Verzeichnis.

Die Logfiles sollten jedoch nicht im regulärbetrieb mitlaufen, zu groß ist die Gefahr, daß bei dem heutigen Spam-Aufkommen irgendwann die Platte mit Log-Daten voll ist.

18. Weitere Links zum Thema Procmail?

Etwas dreist, aber dennoch ein guter Tipp:
http://www.google.com/search?q=procmail

19. Ich habe noch Fragen, an wen kann ich mich wenden?

Keine Ahnung :-) Aber fragen Sie doch einfach mich, sofern ich
helfen kann, mache ich das gerne.

20. Virenschutz

Um ausführbare Dateien (meist eh nur Viren) auszufiltern nutze selbst Spamassassin und prüfe danach mit Procmail einfach auf den Spamassassin-Header, welcher die Tests enthält. Ausführbare Dateien werden mit dem Test „MICROSOFT_EXECUTABLE“ getaggt.

Klappt bisher Prima, seitdem habe ich absolut keine Viren mehr erhalten. Nachteil: Mir kann auch niemand mehr ausführbare Dateien oder Bildschirmschoner schicken. Aber gut, damit lebe ist, meine Bekannten kennen ZIP, womit das Problem wieder gelöst wäre.

21. Mail an ein Script weiterleiten

Manchmal wünscht man sich, bestimmte Mails an ein Script weiterzuleiten, um irgendwelche Dinge auszuführen (Mailingliste, etc). Dies ist nicht schwer, zuerst müssen wir Procmail sagen, daß die Mail an ein Script geht:

  :0
  * ^To.*script@butschek.de
  | /home/butschek/mailscript.php

Nun müssen sie noch ein passendes Script schreiben, das die Mail von Standardeingabe liest und weder eine Ausgabe erzeugt noch mit einem Exitcode <> 0 endet.

Im Beispiel hier ein PHP-Script, da auch diese Frage schon aufkam, wie man bei PHP die Standardeingabe liest. Daher hier ein kleines Beispiel:

  #! /usr/bin/php4 -q
  <?
   # Standardeingabe öffnen
   $stdin = fopen("php://stdin","r");

   /*
   Innerhalb dieses Scripts steht $stdin als
   normales Dateihandle (read only) zur
   Verfügung.
   */

   # Standardeingabe schliessen
   fclose($stdin);
  ?>

Für alle, die noch nie ein Shell-Script in PHP geschrieben haben: Die erste Zeile gibt Linux den Pfad des PHP-Interpreters an (unbedingt nötig, evtl Pfad anpassen), die Option q bedeutet, daß PHP der Ausgabe keine Header hinzufügen kann.

22. Darf ich dieses FAQ kopieren?

Ja. Ich habe diese FAQ nicht aus kommerziellem Hintergrund erstellt. Für mich war es einfach wichtig, alles übersichtlich zu haben. Ich selbst blicke oft auf diese Seite, wenn ich was ändern muß und mal wieder 1/4 Jahr nichts damit gemacht habe.

Wer will, darf sich die Seite gern kopieren. Ich würde nur gerne als Autor genannt werden. Da das Procmail-FAQ von mir gelegentlich überarbeitet wird, empfehle ich, entweder regelmäßig auf die Seite zu gucken, oder einen Link darauf anzubieten.

Written by Michael Butschek

April 21st, 2009 at 8:56 pm

Posted in

41 Responses to 'Procmail-FAQ'

Subscribe to comments with RSS or TrackBack to 'Procmail-FAQ'.

  1. Vielen Dank für diese FAQ, ich hab schon öfters nach so einer Zusammenstellung gesucht und bin nun endlich fündig geworden.
    Gruß Alex

    Alexander Gehrer

    25 Apr 09 at 13:26

  2. Hallo und ersteinmal danke für diese super informative und verständliche FAQ. Bei mir funktioniert der Procmail filter wunderbar!
    Ich benutze ihn um mehrere eMail-Alias-Empfänger in bestimmte imap ordner umzulenken.
    Ich habe allerdings zwei Fragen:
    :0 w
    * ^To: .*ALIAS01@fdomain.de
    ./Maildir/.ALIAS01/new
    Was bedeutet das „w“ hinter „:0“?
    und zweitens: wenn eine eMail an zwei Empfänger geschickt wird wie z.B. ALIAS01 und ALIAS02 dann kommen die zwei eMails nur in den Ordner von ALIAS01. Gibt es eine Möglichkeit das zu ändern?
    Vielen Dank,
    David Dwier

    david

    15 Mai 09 at 23:21

  3. Ich habe das bei Google kurz gesucht und habe dort folgende Antwort erhalten:

    In order to make sure the lockfile is not removed until the pipe has finished, you have to specify option ‚w‘; otherwise the lockfile would be removed as soon as the pipe has accepted the mail.

    Hilfreich in diesem Zusammenhang ist übrigens auch die Manpage zu procmailex(5), die gute Beispiele liefert.

    Die zweite Frage mit dem Alias habe ich nicht ganz verstanden, wenn du eine Mail per Procmail an 2 verschiedene User zustellst, kommen die auch in 2 unterschiedlichen Ordnern an – es sei denn, beide User haben das gleiche Home-Directory.

    Ich würde vorschlagen, in der /etc/procmailrc mit ‚VERBOSE=on‘ und einem Logfile genau zu protokollieren, um den Fehler zu finden.

    Mike

    16 Mai 09 at 16:16

  4. @Mike
    Danke Mike für die schnelle Antwort!
    Das Problem ist in der Tat kompliziert. Eine Mail die an zwei Empfänger läuft die beide in procmailrc stehen kommt auch doppelt an, da aber beide Empfänger vom Filter erfasst werden, orientiert procmail sich an der filterreihenfolge und verschiebt die mails nur in den ordner des ersten Empfängers und dahin auch doppelt:

    :0 w
    * ^To: .*erster@domain.de
    ./Maildir/.Erster/new
    :0 w
    * ^To: .*zweiter@domain.de
    ./Maildir/.Zweiter/new

    eMail TO: erster@domain.de, zweiter@domain.de landet nun zweimal beim ersten und nicht beim zweiten.
    Die Logdatei stimmt auch.
    Ich hoffe das ist irgendwie verständlich was ich meine. Mit BCC würde es natürlich gehen, da im Mail Header TO dann nur eine ADresse steht

    David

    16 Mai 09 at 16:53

  5. Das beschriebene Problem konnte ich rekonstruieren.

    Der Grund ist, dass die Mail 2x vom Mailer bearbeitet wird (einmal für den ersten, einmal für den zweiten) und er in beiden Fällen die Zeichenfolge „To: .*erster@domain.de“ findet.

    Die einzige Lösung, die mir einfällt, wäre eine Userspezifische procmailrc Daeti (INCLUDERC=$HOME/.procmailrc). Damit kannst du für ERSTER und ZWEITER jeweils eigene Regeln anlegen.

    Was anderes fällt mir leider nicht ein, auch wenn das kein besonders guter Weg ist. Ich kenne leider noch keine Möglichkeit, wie ich in Procmail-Regeln nach wirklichen Envelope-To Adressen filtern kann.

    PS: Ich werde für die bessere Lesbarkeit für Dritte unsere Unterhaltung später kürzen.

    Mike

    16 Mai 09 at 18:58

  6. … super Klasse! Ich vermisse allerdings noch, wie man Mailheader ändern bzw. modifizieren kann ;)

    Andreas

    18 Mai 09 at 16:41

  7. Guter Hinweis, danke!

    Zum Verändern einer Nachricht benutzen wir das f-Flag. Damit kann man eine Nachricht an ein Programm pipen, welches die Nachricht modifiziert.

    Mailheader kann man wie oben beschrieben mit formail ändern, doch in den Beispielen oben pipen wir die Mail danach an sendmail und erzeugen damit eine neue Nachricht, statt die bestehende zu bearbeiten.

    Hier ein Beispiel, wie man Header modifiziert:

    :0f
    * ^From:.*ehefrau@domain
    | formail -I "Subject: Schnell, deine Frau will was..."

    So kann man Flags setzen oder ändern. Einen Nachteil hat das Beispiel, der ursprüngliche Betreff geht verloren. Das läßt sich umgehen, indem man ihn vorher mit einer RegEx herausfiltert:

    :0
    * ^From:.*ehefrau@domain
    {
      :0
      * ^Subject:[ ]*/[^ ].*
      {
      SUBJECT=$MATCH
      }
    
      :0f
      | formail -I "Subject: [WICHTIG] $SUBJECT"
    }

    Mike

    18 Mai 09 at 20:18

  8. … procmail funktionierte bei mir absolut nicht, obwohl es laut yast installiert ist. Ich benutze Plesk 9 und Qmail. Lösung: Man muss dazu in der .qmail die .procmailrc erst einbinden (das wird dummerweise überall anders beschrieben):

    Bei mir sieht die .qmail also nun so aus:

    | /usr/bin/procmail -m -t ./.procmailrc
    | true
    | /usr/bin/deliverquota ./Maildir

    Mag einigen klar zu sein, aber wer mit diesem Thema bisher noch nicht zu tun hatte, verzweifelt leicht dran ;)

    Schönen Abend,
    Andreas

    Andreas

    19 Mai 09 at 19:12

  9. Super Arbeit!

    Hat mir wirklich geholfen. Vielen Dank!

    Thomas Vöcking

    14 Jul 09 at 22:40

  10. […] /fachartikel/procmail-faq/ Punkt 21. (wobei du alles andere auch lesen […]

  11. Das ist eine gute Übersicht der Funktionen von procmail :-)

    Mich laust seit langer Zeit das Problem (von Beginn an), dass ich keine Mails weiterleiten kann.

    :0 c
    * ^Subject.*test
    ! foo@bar.de

    Bevor irgendwelche Kontrollstrukturen die Mail abfangen wird dieser Filter angesteuert. Egal wie ich es drehe, diese Mails werden einfach nicht an dritte weitergeleitet..
    Ich benutze nicht das konfig monster exim4, sondern msmtp als MTA.

    Woran könnte es liegen, dass keine Mails von procmail versendet werden?

    Danke für die Hilfe

    Problemkind

    Problemkind

    27 Sep 09 at 19:41

  12. Wie immer hilft lesen. (man procmailrc)
    Ich musste nur die Umgebungsvariable SENDMAIL festlegen.

    SENDMAIL=/path/to/msmtp

    Damit geht alles wunderbar :-)

    Problemkind

    27 Sep 09 at 19:57

  13. Tolle Übersicht !!!

    mit dem INCLUDERC habe ich so meine Probleme:
    Setze Confixx ein und möchte meinen Usern die Möglichkeit einer eigenen procmailrc anbieten. Gibt es praktische Erfahrung zur Umsetzung und in welches Verzeichnis diese Datei zweckmäßigerweise abgelegt wird?

    CaroMan

    10 Okt 09 at 07:00

  14. Mit Confixx stell ich mir das schwer vor, denn Confixx hat web-Benutzer (web#) oder ftp-Benutzer (web#f#), die aber keinen Mailaccount haben. Und es gibt mail-Benutzer (web#p#), die aber wiederrum keinen ftp-Zugang haben.

    Es dürfte also schwer sein, einem mail-Benutzer (web#p#) eine eigene .procmailrc zu geben. Ich kann dir aber ein Forum empfehlen, wo Leute mit Ahnung unterwegs sind, vor allem in Sachen Mailserver:

    http://www.ipx-forum.de/

    Mike

    10 Okt 09 at 11:25

  15. Hallo,

    diese Seite ist die erste brauchbare Übersicht zu ProcMail! Vielen Dank dafür. Ich habe jedoch trotz dieser ganzen hilfreichen Informationen noch eine Sache, die ich nicht hinbekomme:
    Ich möchte bestimmte E-Mails von definierten Adressen in den Trash schieben – das funktioniert auch sehr gut dank dieser Seite.
    Jetzt möchte ich diese jedoch nach dem Verschieben gern als gelesen markieren…das bekomme ich irgendwie nicht hin bzw. weiß auch nicht, wo ich da ansetzten soll.

    Wäre super, wenn mir jemand dazu kurz etwas schreiben könnte.

    Vielen Dank

    Mikey

    28 Nov 09 at 13:29

  16. Die für die Abholung der Mail zuständige Software (also ein POP3 oder IMAP Server) erlaubt dem Benutzer von außen den Zugriff auf das Postfach. Und er merkt sich dabei auch den Zustand der Mail.

    Manche merken sich den Gelesen-Status indem Sie den Dateinamen ändern (Flags wie ,S), andere führen eine eigene kleine Datenbank, um die Datei nicht mehr anfassen zu müssen.

    Es mit Procmail (generell) also nicht möglich, eine Mail schon beim Filtern als gelesen zu markieren. Zumindest liegt dies nicht im Aufgabengebiet von Procmail.

    Es gibt aber einen Workaround, den ich jedoch ziemlich böse finde. Und zwar wird hier von einem IMAP-Server ausgegangen, der sich den Status im Dateisystem merkt (wie dies z.B. Courier tut).

    Der Workaround besteht darin, die Mail zuerst einliefern zu lassen um
    danach per Trap eine Umbenennung der Datei (mv) vorzunehmen, damit der IMAP-Server diese als bereits gelesen ansieht.

    Die Beschreibung dazu findest du hier:
    http://www.mhonarc.org/archive/html/procmail/2005-08/msg00176.html

    Ein interessanter Artikel, der das noch etwas näher erklärt ist hier zu finden:
    http://blog.raamdev.com/2007/11/14/using-procmail-to-mark-as-read

    Mike

    28 Nov 09 at 14:57

  17. @Mike
    Hey supi!
    Vielen Dank für diese Infos…
    Dann werd ich das wohl mal lieber so belassen.

    Mikey

    30 Nov 09 at 18:00

  18. Vielen Dank für diese FAQ :) .

    Hinweis: In den Bedingungszeilen scheint es einen Fehler zu geben:

    [a-z]*
    Praxisbeispiel: Es dürfen beliebig viele Buchstaben, mindestens
    jedoch ein Buchstabe vorkommen

    Das müsste wohl – wenn ich das richtig verstanden habe – eher heißen:
    [a-z]+
    Praxisbeispiel: Es dürfen beliebig viele Buchstaben, mindestens
    jedoch ein Buchstabe vorkommen

    Ergänzung:

    Hinweis: In den Bedingungszeilen, wie sie bei 9. in diesem Artikel beschrieben sind, scheint es einen Fehler zu geben.

    Veronika

    10 Mrz 10 at 08:53

  19. Das mit dem * und dem + war wirklich ein Fehler. Danke für den Hinweis, habe es sofort korrigiert.

    Zu der Bedingungszeile, kannst du mir die Textstelle nennen, damit ich finde, wo du den Fehler vermutest? Danke.

    Mike

    10 Mrz 10 at 09:44

  20. Sorry – ich hatte das lediglich ergänzt, damit klar wird, wo der (inzwischen wunderbarerweise schon korrigierte :)) Fehler zu finden ist.

    Ansosnten schlage ich mich gerade damit herum, ob es wohl möglich ist, zwei unterschiedliche Bedingungen zu formulieren, die nacheinander abgefragt werden sollen, da die Mails leider alle gebounct werden, aber nur einen Teil „beachtenswert“ ist – nachdem es mir nicht gelang, die o.a. „ehefrauen-modifikation“ anzuwenden:

    # Erstellt am 10.03.2010 09:00 Uhr
    :0f
    * ^Subject.*MAILER-DAEMON*
    | formail -I „Subject: [Mailer-Daemon-Post – bitte beachten]“

    :0c
    * ^Subject.BOUNCE
    ! name@provider

    Derzeit passiert zwar das, was ich in der ersten Bedingung angebe, aber leider keine (kopierte) Zustellung entsprechend der zweiten Bedingung. :(. Aber vielleicht hast Du ja auch DAFÜR eine Lösung?

    Veronika

    10 Mrz 10 at 15:36

  21. Drehe die Reihenfolge um.

    In der ersten Regel nimmst du die Nachricht selbst, in der zweiten erzeugst du eine Kopie. Wenn die erste Regel zutrifft kommt jedoch bei der zweiten Regel nichts mehr an.

    Mike

    10 Mrz 10 at 15:50

  22. Tja – das würde dann aber eben bedeuten, dass *alle* BOUNCE-Mails bei der fraglichen Adresse ankämen. Ich hätte aber gern einen Filter, der erst mal die „guten“ in Töpfchen tut – weshalb ich bewusst die Reihenfolge so herum ausprobiert habe. Inzwischen WERDEN (offenbar nach Entfernung einer bisher vorhandenen Leerzeile?) Mailkopien „weitgehend ordnungsgemäß“ zugestellt, Allerdings:

    Derzeit kommen verblüffenderweise mehr Kopien an als ich Originale auf dem Mailkonto vorfinde – vermutlich ist die Verarbeitungsreihenfolge

    komplette procmail -> whitelist -> spam-filter?

    Steht das „f“ als flag für „formail“?

    Veronika

    10 Mrz 10 at 18:13

  23. Die Überprüfung der bisher gesetzten eigenen Filter hat eine Bestätigung der o.a. Vermutung ergeben – es wird zunächst die procmail abgearbeitet und anschließend der spam-filter.

    Noch ne Flagfrage: wenn ich aufgrund von Body-Angaben filtern will, habe ich gesehen, dass das offenbar via Flag „B“ möglich ist – wie unter 8. beschrieben. Für die gleichzeitige Berücksichtigung von Angaben aus dem Betreff hilft es, dass der Betreff auch im Body offenbar wiederholt wird. Sollen jedoch alle Mails aussortiert werden, die einen http://-Link enthalten – wie muss dann die zweite Zeile aussehen?

    Veronika

    11 Mrz 10 at 19:07

  24. Ich arbete mit procmail als internen mail-verteiler. Das funktioniert auch sehr gut und verlässlich.
    Allerdings habe ich Probleme wenn mails an eine gruppe von adressen geschickt und diese emailadressen nicht ordentlich untereinander, also Zeile für Zeile in die mail geschrieben wird, sondern allesamt in eine Zeile.
    Procmail bricht hier nach der ersten erkannten Adresse ab und stellt sie demjenigen zu, der für alles unklare zuständig ist.
    Beispiel: To: empf1@xxx.yy, empf2@yyy.yy, empf3@zzz.yy, usw.

    Habe bisher im Netz gesucht, aber keine brauchbare Regel gefunden, wie ich procmail beibiegen könnte, dieses richtig auszulesen und nicht nach der ersten Emailadresse abzubrechen, sondern weiterzulesen, um zu prüfen, ob da dann adressen dirn sind, die tatsächlich zustellbar sind.

    wolf

    21 Mrz 10 at 21:08

  25. Mir ist keine direkte Möglichkeit bekannt. Ich schicke solche Mails dann gerne in ein Perl-Script und werte manuell aus.

    Mike

    28 Mrz 10 at 22:12

  26. Hallo Leute,

    bei mir funktioniert die verteilung der Mails nicht, die von SpamAssasin im Betreff mit [SPAM] markiert wurden.

    Meine .procmailrc liegt unter /root
    Nach meinen Linux-Einsteiger Kenntnissen ist das, das home Verzeichnis des Benutzers.

    Meine Domains verwalte ich mit Plesk und als Betriebssystem nutze ich Ubuntu.

    Meine .procmailrc sieht folgendermaßen aus:

    MAILDIR=/var/qmail/mailnames/DOMAIN/POSTFACH-NAME/Maildir/
    LOGABSTRACT=all
    LOGFILE=/procmail.log
    :0H:
    * ^Subject:.*[SPAM]
    .SPAM

    Was mache ich hier falsch bzw. warum werden die Mails nicht inden SPAM-Ordner verschoben?

    Ich freue mich auf eine hilfreiche Antwort, welche ich bereits aus div. Foren nicht erhalten habe.

    Viele Grüße,
    Sven

    sven

    30 Mrz 10 at 12:33

  27. Hey, auch von mir erstmal Daumen hoch!
    Muss mich durch ein Praktikum damit rumschlagen und damit gings echt flott.

    Nur eine Anmerkung:
    Bei dem Beispiel wo Mails in einem Text-File abgelegt werden ist ein Ausrufezeichen zu viel reingerutscht.

    :0
    * ^To.*news@asd.de
    ! /home/user/dateiname.txt

    Ist nicht tragisch aber für lesefaule Leute wie mich (weiter unten beim Mails löschen steht es ja korrekt ohne) heißt das erstmal bug suchen, denn in diesem Fall versucht procmail die Mail weiterzuleiten und speichert sie nicht.

    MfG
    Nico

    Nico

    31 Mrz 10 at 14:44

  28. @sven

    Ich habe gerade vom Support meines Providers erfahren, dass auf meinem Server es keine Homeverzeichnisse eines Users gibt, da die Meiste Konfiguration mit Plesk erfolgt. Damit ist dies so nicht vorgesehen.

    Hat jemand von Euch eine Idee, wie ich dann nun weiter fortfahren kann?

    Viele Grüße
    Sven

    sven

    31 Mrz 10 at 16:59

  29. Hallo, folgendes Problem
    meine Konfiguration: fetchmail holt die Post ab als root, übergeben wird sie Postfix, Postfix übergibt an procmail, procmail filtert und sortiert.
    Bis zur übergabe an procmail klappt alles, aber in der procmail.log steht: Opening „user1“
    Error while writing to „user1“
    als einzige Fehlerursache bleiben falsche Zugriffsrechte.
    Postfach user1: user1.praxis rw- — —
    ändere ich es auf user1.praxis rw- rw- rw-
    so kann procmail hineinschreiben. Diese manuelle Korrektur kann aber doch nicht die professionelle Lösung sein?
    Frage: wer hat ein funktionierendes system? Wie lauten für ein Postfach die regulären Zugriffsrechte?
    Wie konfiguriere ich procmail, das es in alle Postfächer schreiben kann?
    main.cf:

    mailbox_command = /usr/bin/procmail -a „$EXTENSION“

    master.cf:

    procmail unix – n n – – pipe
    flags=R user=nobody argv=/usr/bin/procmail -t -m /etc/procmailrc ${sender} ${recipient}

    etc/procmailrc:

    PATH=/bin:/usr/bin:/usr/sbin:/usr/local/bin
    MAILDIR=/var/spool/mail
    DEFAULT=/var/spool/mail/fischer
    LOGFILE=/var/log/procmail
    LOGABSTRACT=yes
    VERBOSE=yes
    SHELL=/bin/sh

    Danke
    Alexander

    alexander

    29 Apr 10 at 22:42

  30. Mein Tipp: Gebe jedem Schreibrechte in das Zielverzeichnis und lass Procmail eine Datei schreiben. Dann siehst du, welchen Benutzer und welche Gruppe Postfix dafür benutzt. Das kann helfen, das Problem zu analysieren.

    Mike

    19 Mai 10 at 10:19

  31. Ich hab’s bei Ihnen gefunden – müßte aber viel prominenter erwähnt werden: Dass procmail die Mail in die Standardeingabe schreibt, wenn man sie von einem anderen Skript verarbeiten lässt. Ich hab’s mir aus dem php-Beispiel erschlossen.
    Ansonsten: vielen Dank für die Mühe!
    Josef

    Josef Dschugashvili

    24 Mai 10 at 15:54

  32. Hallo! Ich suche Hilfe bei der Einrichtung von Pocmail (auf einem All Inkl Server) zur weiterleitung der mails an ein PHP Script. (Für ein Ticket System namens Kayako) Gerne gegen Bezahlung. Bitte mail an mich bei Interesse! Vielen Dank

    Stefan

    22 Jun 10 at 13:18

  33. Hi…

    Vielen dank erstmal fuer die super FAQ.
    Eine frage haett ich noch… ist es irgentwie moeglich einen Filter zu erstellen der mir alle Nachrichten loescht die aelter als x Tage sind ? Der Hintergrund ist das ich mehrere Filter angelegt hab der mir automatisch generierte Mails (z.B. errorlogs) in verschiedene ordner verschiebt… nun sollen die dort aber auch nicht ewig rumliegen sondern ich wuerd sie gern automatisch nach 5 Tagen oder so loeschen…

    Geht sowas ?

    Danke im vorraus…

    Tschuees… LordHelmchen….

    LordHelchen

    30 Jun 10 at 16:37

  34. @Josef: Ja das stimmt. Da die meisten Kommandos auf der U*ix-Shell aber so funktionieren, war es mir immer klar. Daher habe ich nie darauf geachtet, deutlicher darauf hinzuweisen.

    @Stefan: Auf All Inkl Server sollte das laufen, dort habe ich meine ersten Schritte gemacht. Frag im Support mal nach Tom (sofern er noch dabei ist, vor 5-8 Jahren war er es), er half mir oft mit guten Tipps, als ich die FAQ schrieb und er hat Ahnung! Kleine Fragen: Immer her damit…

    @LordHelchen: Nein das geht leider nicht. Procmail stellt die Mail nur zu, nach der Zustellung ist Procmail nicht mehr für die Mail zuständig. Das Löschen könnte dann nur der IMAP-Server (oder entsprechende Scripte) erledigen.

    Mike

    6 Jul 10 at 21:49

  35. Hallo!

    Vielen, vielen Dank für die F.A.Q.! Gute Arbeit!

    Ich möchte alle Lesebestätigungen nach Trash schieben. Hier ist mein Filter:

    :0: H
    * ^Subject:.*(Lesebestätigung|Gelesen|Read)
    $HOME/mail/Trash

    Leider rutschen auch die E-Mails durch, die im Betreff mit „WG: Lesebestätigung: Deine Nachricht.“ (WG steht für weiter geleitet) sind oder es könnte AW (als Antwort) sein. Wie schreibe ich die Bedingung richtig, dass nur die Lesebestätigungen gefiltert werden?

    Vielen Dank für die Tipps.

    sadko

    26 Aug 10 at 09:17

  36. Und kann man überhaupt die einkommende E-Mails als gelesen markieren?

    sadko

    26 Aug 10 at 09:20

  37. @David
    hi, sollte noch Bedarf an einer Lösung vorliegen, um das Problem zu lösen erstellt man sich einfach eine Cachedatei, welche Dubletten an der MessageID erkennt somit wird die Mail nur einmal bearbeitet. Einfach ein:

    :0 Wh: $PROCMAILDIR/msgid.lock
    |formail -D 32768 $PROCMAILDIR/msgid.cache
    /dev/null

    am Anfang hin und gut ist ;)
    noch eins, versuche alle möglichen Optionen zu bündeln ala:

    * ^(To|TO|cc|CC|Cc|Delivered-To):.*

    somit werden alle Varianten abgedeckt, wenn dir noch eine einfällt poste bitte. ;)

    bis den

    cu spaci76

    spaci76

    7 Sep 10 at 08:19

  38. Hallo !
    Ich habe den Absender einer Mail in procmail in einer Variablen gespeichert und möchte diese nun an ein bash script übergeben. Weis villeicht einer wie das geht :D
    Wäre echt super .. danke ^^

    Stefan

    14 Dez 10 at 23:25

  39. Hi,

    ich hab noch nen kleines problem, ich wuerde gern den Absender aendern der im Email client angezeigt wird:
    Hintergrund ist das unsere IT Abteilung alle Mails die von einem unserer Tools gesendet werden als „Immer der gleiche lange text hier(Absendername)“ sendet.. ich denke der absender ist irgentwie als „blalba@blub.de [Immer der gleiche lange Text hier (Absendername)]“ definiert… kann ich das irgentwie aender so das es: „blabla@blub.de [Bla (Absendername)] “ ist ?? Das problem ist das ich die absenderspalte im Thunderbird im moment sehr lang machen muss um zu sehen wer der eigentlich absender ist, umdrehen wills die IT nicht weil sie der meinung sind die leute denken dann es kaeme direkt von der person und nicht ueber das tool.

    Da spitze klammern rausgefiltert werden habe ich oben „[]“ benutzt.

    Vielen Dank fuer eure Antworten.

    Cheers LordHelmchen

    LordHelmchen

    6 Apr 11 at 10:51

  40. Hi,

    Ich möchte mit procmail nur Mails zustellen, die ich aus einer MySQL db lese.
    Hat da jemand eine Idee.

    Sven Olaf

    Sven Olaf

    5 Mai 11 at 23:49

  41. […] In die Datei “/var/qmail/mailnames/{Domain}.{TLD}/{Name}/.procmail” schreibt man dann die Filterregeln. Eine kleine Anleitung zur Konfiguration findet man hier. […]

Leave a Reply