Procmailrc - Syntax für automatic respond
Merkwürdige Syntax das 
Guten Morgen,
Nachdem ich nun mit Hilfe unseres Mailadmins eine standard procmailrc datei für unsere User erstellt habe, haben wir aus verschiedensten Gründen die Notwendigkeit eine automatische Antwort zu senden sobald eine mail an eine bestimmte adresse ankommt (die muss allerdings nicht unterschieden werden da jeder user seine eigene Datei hat
)
Das ist das eine Problem, das zweite scheint ein wenig komplexer zu sein
folgendes Szenario: Ich bekomme eine Spammail, unser Server besitzt einen spamfilter, in der procmailrc wird angegeben das die mail im fiklter getestet werden soll und dann weitergeleitet an eine zweite mailbox (zwecks archivierung) gut unser Spamfilter erkennt allerdings nicht das es sich um spam handelt und leitet sie demnach weiter an einen Server (im speziellen Fall T-Zones) Dieser erkennt allerdings den Spam und sendet eine Fehlermeldung an unseren Mailserver zurück mit der eigendlichen mail, da unser Spamfilter immernoch nicht reagiert und noch keine Filtermöglichkeit existiert (nach der ich hier frage) wird die mail wieder an t-zones weitergeleitet und das spiel beginnt von Vorn. Gut nach ca 50 mal ist schluss da der mailserver was gegen loops hat aber das ist kein Zustand
Meine Fragen beinhalten also die Syntax wie ich
1. Automatische Antworten erstellen kann
2. die Errormessages von T-Zones filtere
Herzlichen Dank
PS: No Idea about syntax of procmail... first contact yesterday morning
Guten Morgen,
Nachdem ich nun mit Hilfe unseres Mailadmins eine standard procmailrc datei für unsere User erstellt habe, haben wir aus verschiedensten Gründen die Notwendigkeit eine automatische Antwort zu senden sobald eine mail an eine bestimmte adresse ankommt (die muss allerdings nicht unterschieden werden da jeder user seine eigene Datei hat
Das ist das eine Problem, das zweite scheint ein wenig komplexer zu sein
folgendes Szenario: Ich bekomme eine Spammail, unser Server besitzt einen spamfilter, in der procmailrc wird angegeben das die mail im fiklter getestet werden soll und dann weitergeleitet an eine zweite mailbox (zwecks archivierung) gut unser Spamfilter erkennt allerdings nicht das es sich um spam handelt und leitet sie demnach weiter an einen Server (im speziellen Fall T-Zones) Dieser erkennt allerdings den Spam und sendet eine Fehlermeldung an unseren Mailserver zurück mit der eigendlichen mail, da unser Spamfilter immernoch nicht reagiert und noch keine Filtermöglichkeit existiert (nach der ich hier frage) wird die mail wieder an t-zones weitergeleitet und das spiel beginnt von Vorn. Gut nach ca 50 mal ist schluss da der mailserver was gegen loops hat aber das ist kein Zustand
Meine Fragen beinhalten also die Syntax wie ich
1. Automatische Antworten erstellen kann
2. die Errormessages von T-Zones filtere
Herzlichen Dank
PS: No Idea about syntax of procmail... first contact yesterday morning
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 36721
Url: https://administrator.de/forum/procmailrc-syntax-fuer-automatic-respond-36721.html
Ausgedruckt am: 07.04.2025 um 12:04 Uhr
14 Kommentare
Neuester Kommentar
Allgemeine procmail - Syntax zum eintragen in die procmailrc
:0[Flags][[:]Sperrdatei]
*Bedingung
Aktion
Anmerkung: die Bedingung muß als Regulärer Ausdruck angegeben werden und Kommentare werden mit # eingeleitet.
#Autoresponse
:0
echo "Dies ist eine automatisch erzeugte Antwort."; \
echo "Mail wurde abgelehnt; sie wird niemals gelesen werden." ) \
| sendmail -t -oi
#T-Zones Errormessage
:0
Hinweis: Die Reihenfolge der Rezepte ist wichtig. Wenn eine Bedingung für eine zu prüfende Nachricht zutrifft, so werden die nachfolgenden Bedingungen nicht mehr beachtet, es sei denn eine oder mehrere der direkt nachfolgenden Bedingungen haben als Flags A, a oder e gesetzt.
Wenn als Aktion in eine Datei geschrieben wird, so sollte zumindest ein Doppelpunkt nach :0[Flags] gesetzt werden, damit bei hohem Nachrichtenaufkommen nicht mehrere Prozesse von procmail gleichzeitig versuchen in die selbe Datei zu schreiben. Wird da nur der Doppelpunkt angegeben, so erstellt sich procmail seine eigene Sperrdatei. Wird explizit eine Sperrdatei angegeben, so wird diese verwendet.
:0[Flags][[:]Sperrdatei]
*Bedingung
Aktion
Anmerkung: die Bedingung muß als Regulärer Ausdruck angegeben werden und Kommentare werden mit # eingeleitet.
#Autoresponse
:0
- ^From:.*absender@boese-jungens\.org
- !X-Loop: Benutzer@meinedomaene.com
echo "Dies ist eine automatisch erzeugte Antwort."; \
echo "Mail wurde abgelehnt; sie wird niemals gelesen werden." ) \
| sendmail -t -oi
#T-Zones Errormessage
:0
- ^Subject:.*Errormessage-Betreff
Hinweis: Die Reihenfolge der Rezepte ist wichtig. Wenn eine Bedingung für eine zu prüfende Nachricht zutrifft, so werden die nachfolgenden Bedingungen nicht mehr beachtet, es sei denn eine oder mehrere der direkt nachfolgenden Bedingungen haben als Flags A, a oder e gesetzt.
Wenn als Aktion in eine Datei geschrieben wird, so sollte zumindest ein Doppelpunkt nach :0[Flags] gesetzt werden, damit bei hohem Nachrichtenaufkommen nicht mehrere Prozesse von procmail gleichzeitig versuchen in die selbe Datei zu schreiben. Wird da nur der Doppelpunkt angegeben, so erstellt sich procmail seine eigene Sperrdatei. Wird explizit eine Sperrdatei angegeben, so wird diese verwendet.
Zu erstens:
Eine Bedingung wird negiert, indem vor die Bedingung ein Ausrufezeichen gestellt wird. Das Ausrufezeichen steht für das logische NOT.
Zu zweitens:
Wenn Du die From-Zeile filtern willst:
Du hast es im Ansatz eigentlich richtig gemacht, nur muß man beim Umgang mit regulären Ausdrücken einiges beachten:
Ein Punkt steht immer für ein beliebiges Zeichen und ein Sternchen ist ein Multiplikator der angibt, daß das Zeichen/Ausdruck direkt vor dem Sternchen entweder keinmal, einmal oder beliebig oft vorkommen darf. Das Dach steht für den Zeilenanfang und ein $ steht für das Zeilenende.
Obige Zeile bedeutet also im einzelnen:
Die Zeile beginnt mit From: ( ^From: )
Danach können beliebig viele oder auch keine beliebigen Zeichen stehen ( .* )
Danach muß die genaue Gruppe MAILER-DAEMON@muni.cz folgen, hierbei ist es wichtig die Sonderfunktion des Punktes mit Hilfe des Backslashes auszuschalten.
Anschließend können wieder beliebig viele Zeichen kommen ( .* )
Generell solltest Du überall dort wo ein Leerzeichen steht die Kombination ( .* ) verwenden, es können ja auch mal mehrere sein, dann würde das nicht erkannt. Außerdem kann es sein, daß Sonderzeichen wie < oder > als Suchkriterien verwendet werden, daher solche Zeichen, auch Klammern immer mit dem Backslash eindeutig als Schriftzeichen markieren.
Hoffe, ich konnte helfen.
Eine Bedingung wird negiert, indem vor die Bedingung ein Ausrufezeichen gestellt wird. Das Ausrufezeichen steht für das logische NOT.
Zu zweitens:
Wenn Du die From-Zeile filtern willst:
- ^From:.*MAILER-DAEMON@muni\.cz.*
Du hast es im Ansatz eigentlich richtig gemacht, nur muß man beim Umgang mit regulären Ausdrücken einiges beachten:
Ein Punkt steht immer für ein beliebiges Zeichen und ein Sternchen ist ein Multiplikator der angibt, daß das Zeichen/Ausdruck direkt vor dem Sternchen entweder keinmal, einmal oder beliebig oft vorkommen darf. Das Dach steht für den Zeilenanfang und ein $ steht für das Zeilenende.
Obige Zeile bedeutet also im einzelnen:
Die Zeile beginnt mit From: ( ^From: )
Danach können beliebig viele oder auch keine beliebigen Zeichen stehen ( .* )
Danach muß die genaue Gruppe MAILER-DAEMON@muni.cz folgen, hierbei ist es wichtig die Sonderfunktion des Punktes mit Hilfe des Backslashes auszuschalten.
Anschließend können wieder beliebig viele Zeichen kommen ( .* )
Generell solltest Du überall dort wo ein Leerzeichen steht die Kombination ( .* ) verwenden, es können ja auch mal mehrere sein, dann würde das nicht erkannt. Außerdem kann es sein, daß Sonderzeichen wie < oder > als Suchkriterien verwendet werden, daher solche Zeichen, auch Klammern immer mit dem Backslash eindeutig als Schriftzeichen markieren.
Hoffe, ich konnte helfen.
Also, ich würde erstmal Kommentare verwenden, das macht das ganze übersichtlicher.
#Schicke alle ankommenden Mails zum Spamfilter und warte darauf, daß sie bearbeitet werden
:0fw
|/usr/local/bin/spamc
#Schiebe alle Mails, die als Spam gekennzeichnet sind in das Verzeichnis MAILDIR/mail/spam
:0:
So weit so gut. Was dann kommt, daraus werde ich leider noch nicht schlau. Du wilst eine Kopie aller Mails machen die von dem angegebenen Mailerdeamon kommen. Aber die zeile backup@muni.cz würde hier ja bedeuten, daß diese Kopien im Verzeichnis MAILDIR/backup@muni.cz gespeichert würden. Da mußt Du mir nochmal sagen, was Du damit machen willst.
Dann die Sache mit dem Autoresponder. Zum versenden ist eigentlich nur der Teil nach der Pipe notwendig. Mit formail -r wird eine Antwort generiert und bestehende Header und Body gelöscht. Mit der Option -a Header: Text wird der angegebene Header angefügt, wenn er nicht schon vorhanden ist. Die Echo-Befehle schreiben dann jeweils eine Zeile in den Message-Body und schließlich wird die Nachricht hier an sendmail zur Auslieferung übergeben (Wenn ihr ein anderes Programm zum ausliefern verwendet, dann mußt du nochmal zu deinem Mail-Admin). Hierbei bedeutet die Option -t, daß sendmail den Empfänger der Nachricht aus dem Nachrichten-Header feststellen soll, und -oi sorgt dafür, daß es keine Zeile behandelt, die nur aus einem einzigen Punkt als Eingabe enthält (wird nur selten gebraucht, wird aber üblicherweise eingefügt, um sicherzugehen).
Damit jetzt nicht der Empfänger deiner Nachricht, diese einfach wieder zurückschickt, haben wird den X-Loop Header eingefügt (formail -r -a "X-Loop: ich@meinedomaene.com";) und durch die Prüfung der Bedingung
#Prüfe Mails auf Zurückgesendeten Autoresponse und schicke sie ins Nirvana
:0
ins Datennirvana schicken.
#Schicke alle ankommenden Mails zum Spamfilter und warte darauf, daß sie bearbeitet werden
:0fw
|/usr/local/bin/spamc
#Schiebe alle Mails, die als Spam gekennzeichnet sind in das Verzeichnis MAILDIR/mail/spam
:0:
- ^X-Spam-Status: Yes
So weit so gut. Was dann kommt, daraus werde ich leider noch nicht schlau. Du wilst eine Kopie aller Mails machen die von dem angegebenen Mailerdeamon kommen. Aber die zeile backup@muni.cz würde hier ja bedeuten, daß diese Kopien im Verzeichnis MAILDIR/backup@muni.cz gespeichert würden. Da mußt Du mir nochmal sagen, was Du damit machen willst.
Dann die Sache mit dem Autoresponder. Zum versenden ist eigentlich nur der Teil nach der Pipe notwendig. Mit formail -r wird eine Antwort generiert und bestehende Header und Body gelöscht. Mit der Option -a Header: Text wird der angegebene Header angefügt, wenn er nicht schon vorhanden ist. Die Echo-Befehle schreiben dann jeweils eine Zeile in den Message-Body und schließlich wird die Nachricht hier an sendmail zur Auslieferung übergeben (Wenn ihr ein anderes Programm zum ausliefern verwendet, dann mußt du nochmal zu deinem Mail-Admin). Hierbei bedeutet die Option -t, daß sendmail den Empfänger der Nachricht aus dem Nachrichten-Header feststellen soll, und -oi sorgt dafür, daß es keine Zeile behandelt, die nur aus einem einzigen Punkt als Eingabe enthält (wird nur selten gebraucht, wird aber üblicherweise eingefügt, um sicherzugehen).
Damit jetzt nicht der Empfänger deiner Nachricht, diese einfach wieder zurückschickt, haben wird den X-Loop Header eingefügt (formail -r -a "X-Loop: ich@meinedomaene.com";) und durch die Prüfung der Bedingung
- !X-Loop: ich@meinedomaene.com
#Prüfe Mails auf Zurückgesendeten Autoresponse und schicke sie ins Nirvana
:0
- ^X-Loop:.*ich@meinedomaene.com.*
ins Datennirvana schicken.
Off Topic: Ich muß jetzt mal Einkaufen gehen und kann mich erst später wieder um dein Problem kümmern, sorry.
On Topic: Leider habe ich immer noch nicht ganz begriffen, was du machen willst. Hier mal so wie ich es verstanden habe:
1. alle Mails durch den Spamfilter schicken
2. Diejenigen Mails, die der Spamfilter als Spam gekennzeichnet hat in ein Spamverzeichnis schieben.
3. Bei den restlichen prüfen, ob sie von dem Mailerdeamon stammen und falls ja soll eine Kopie davon an backup@muni.cz schicken
4. Alle restlichen Mails, zusätzlich die vom Mailerdeamon ins Mailpostfach verschieben.
5. Für Kollegen, die im Urlaub sind, soll für jede reguläre (also gültige) Mail, die nicht von dem Mailerdeamon sind, eine entsprechende Mitteilung, daß der Empfänger im Urlaub ist an den Absender geschickt werden.
On Topic: Leider habe ich immer noch nicht ganz begriffen, was du machen willst. Hier mal so wie ich es verstanden habe:
1. alle Mails durch den Spamfilter schicken
2. Diejenigen Mails, die der Spamfilter als Spam gekennzeichnet hat in ein Spamverzeichnis schieben.
3. Bei den restlichen prüfen, ob sie von dem Mailerdeamon stammen und falls ja soll eine Kopie davon an backup@muni.cz schicken
4. Alle restlichen Mails, zusätzlich die vom Mailerdeamon ins Mailpostfach verschieben.
5. Für Kollegen, die im Urlaub sind, soll für jede reguläre (also gültige) Mail, die nicht von dem Mailerdeamon sind, eine entsprechende Mitteilung, daß der Empfänger im Urlaub ist an den Absender geschickt werden.
Ich würde es mal so probieren:
procmailrc
| formail -z
|/usr/local/bin/spamc
mail/inbox
Anmerkung zur 4. Regel: In die Datei urlaub.txt trägst Du für jeden Kollegen, der im Urlaub ist eine Zeile mit seiner Email-Adresse ein. So mußt Du nicht jedesmal eine neue Regel für jeden Kollegen erstellen, sondern nur die entsprechenden Adressen in die Datei eintragen, bzw. entfernen, sobald der Kollege wieder im Dienst ist.
Da ich noch nie mit procmail gearbeitet habe und derzeit auch kein entsprechendes System zum testen, kann ich leider nicht prüfen, ob es funktioniert. Vor allem die Konstrukte mit den regulären Ausdrücken. Da kann es sein, daß die Negierung evtl. geklammert werden muß, also !(was auch immer) Das mußt du halt ausprobieren, dabei lernt man sowieso am meisten. Ich habe meine Infos nur aus einem Unix-Administrationsbuch zusammengebastelt, wo procmail nicht sehr ausführlich beschrieben ist. Hier noch zwei Internetseiten, die vielleicht hilfreich sein könnten:
1. Procmail Quickstart von Nancy McGough / Infinite Ink
www.ii.com/internet/robots/procmail/qs/
2. Timo Salmis Seite "Procmail Tips and Recipes"
www.uwasa.fi/~ts/info/proctips.html
procmailrc
- Standardisiert das Headerformat, und sorgt dafür,
- daß nach jedem Header-Feldnamen ein Lehrzeichen steht
| formail -z
- 1. Regel
- Jede Mail an den Spamfilter schicken
|/usr/local/bin/spamc
- 2.Regel
- Jede Mail, die als Spam gekennzeichnet wurde ins Spamverzeichnis verschieben
- ^X-Spam: Yes
- 3. Regel
- Prüfen, ob Mail von Mailerdaemon stammt, wenn nicht, dann an eine Kopie an die Backup adresse schicken
- !^From:.*MAILER-DAEMON@muni\.cz.*
- 4. Regel
- Prüfen, ob Empfänger im Urlaub ist, wenn ja wird eine Antwort erzeugt
- Benötigt die Textdatei /verwaltung/urlaub.txt
- Wird nur auf Nachrichten angewandt, die auch dem Muster der vorhergehenden Regel entsprechen (Option A)
- Hier auf alle Nachrichten, die nicht von dem Mailer-daemon stammen
- ? formail -x"To:" | egrep -i -f /verwaltung/urlaub.txt
- 5.Regel
- Alle Mails, welche die oben aufgeführten Regeln passiert haben in die Inbox verschieben
mail/inbox
Anmerkung zur 4. Regel: In die Datei urlaub.txt trägst Du für jeden Kollegen, der im Urlaub ist eine Zeile mit seiner Email-Adresse ein. So mußt Du nicht jedesmal eine neue Regel für jeden Kollegen erstellen, sondern nur die entsprechenden Adressen in die Datei eintragen, bzw. entfernen, sobald der Kollege wieder im Dienst ist.
Da ich noch nie mit procmail gearbeitet habe und derzeit auch kein entsprechendes System zum testen, kann ich leider nicht prüfen, ob es funktioniert. Vor allem die Konstrukte mit den regulären Ausdrücken. Da kann es sein, daß die Negierung evtl. geklammert werden muß, also !(was auch immer) Das mußt du halt ausprobieren, dabei lernt man sowieso am meisten. Ich habe meine Infos nur aus einem Unix-Administrationsbuch zusammengebastelt, wo procmail nicht sehr ausführlich beschrieben ist. Hier noch zwei Internetseiten, die vielleicht hilfreich sein könnten:
1. Procmail Quickstart von Nancy McGough / Infinite Ink
www.ii.com/internet/robots/procmail/qs/
2. Timo Salmis Seite "Procmail Tips and Recipes"
www.uwasa.fi/~ts/info/proctips.html