Postfix, eingehende Mail an pipe weitergeben, wie?

Debian macht sich hervorragend als Web- und Mailserver. Schau auch in den " Tipps und Tricks"-Bereich.
Antworten
dmant
Beiträge: 195
Registriert: 09.10.2017 10:28:29

Postfix, eingehende Mail an pipe weitergeben, wie?

Beitrag von dmant » 07.12.2017 15:19:14

Hallo,

Ich möchte Mails die an eine bestimmte Adresse gehen z.b. foo@bar.de an ein Script weiterleiten.

Eigentlich würde man das ja über die aliases machen, mein Postfix läuft allerdings komplett virtual und mit MySQL.

Wie kriege ich es nun hin Mails an eine pipe zu übergeben?

r4pt0r
Beiträge: 1225
Registriert: 30.04.2007 13:32:44
Lizenz eigener Beiträge: MIT Lizenz

Re: Postfix, eingehende Mail an pipe weitergeben, wie?

Beitrag von r4pt0r » 07.12.2017 15:42:28

lege eine zusätzliche hashtable für lokale user an und definiere sie vor den virtual_* Einträgen in der main.cf:

Code: Alles auswählen

local_recipient_maps = hash:/etc/postfix/localusers
In /etc/postfix/localusers werden dann lokale user die mails empfangen können sollen mit "<username> OK" eingetragen und per postmap die zugehörige .db generiert.

Dann kann wie gewohnt die .forward des users für alle weitere aktionen genutzt werden.
Um mails bzw deren inhalt an scripte weiter zu leiten bietet sich procmail an, damit lassen sich auch einfach filter definieren, damit z.b. nur mails an scripte weitergeleitet werden die dem gewünschten format entsprechen oder von bestimmten Absendern stammen.

Benutzeravatar
weshalb
Beiträge: 905
Registriert: 16.05.2012 14:19:49

Re: Postfix, eingehende Mail an pipe weitergeben, wie?

Beitrag von weshalb » 08.12.2017 10:07:49

Mit Procmail.

dmant
Beiträge: 195
Registriert: 09.10.2017 10:28:29

Re: Postfix, eingehende Mail an pipe weitergeben, wie?

Beitrag von dmant » 08.12.2017 10:47:38

procmail verstehe ich irgendwie nicht. schon gar nicht mit virtuellen Usern. Ich habe es installiert aber verstehe 0. Es wäre schon super wenn ich da noch viele Filter nutzen könnte nur soll alles weitere ganze normal weiter funktionieren. Also nur das was an eine einzige Adresse geht soll gepiped werden. Genial wäre es natürlich wenn man sofort noch den Inhalt vom Betreff, Body und das Attachment bekommen würde zur weiter verarbeitung. Allerdings sollen wie erwähnt alle anderen eMail Adressen unberührt bleiben und weiter so laufen wie bisher.

Den Postfix habe ich nach dem workaround.org Tutorial aufgesetzt.

dmant
Beiträge: 195
Registriert: 09.10.2017 10:28:29

Re: Postfix, eingehende Mail an pipe weitergeben, wie?

Beitrag von dmant » 09.12.2017 13:24:27

Ok procmail ist da definitiv für meine Anwendung die bessere Alternative. Hab ihn nun auch am laufen aber nun kommen keine Mails mehr an. Also die werden gepiped. "delivered to procmail Service" aber wie sage ich procmail das er die mails erstmal einfach alle ungefiltert und die Postfächer zustellt? Diese sind natürlich virtuell.

Benutzeravatar
weshalb
Beiträge: 905
Registriert: 16.05.2012 14:19:49

Re: Postfix, eingehende Mail an pipe weitergeben, wie?

Beitrag von weshalb » 09.12.2017 14:01:19

Habe ich auf die schnelle gefunden, ob es klappt, musst du sehen.

http://standish.home3.org/virtual-procmail

dmant
Beiträge: 195
Registriert: 09.10.2017 10:28:29

Re: Postfix, eingehende Mail an pipe weitergeben, wie?

Beitrag von dmant » 09.12.2017 14:58:00

Ja das habe ich auch schon gefunden. Klappt aber nicht. :(

dmant
Beiträge: 195
Registriert: 09.10.2017 10:28:29

Re: Postfix, eingehende Mail an pipe weitergeben, wie?

Beitrag von dmant » 09.12.2017 21:46:05

Also die Mails werden umgeleitet, soviel passt schonmal

/var/log/Mail.log

Code: Alles auswählen

Dec  9 21:37:21 ns3067246 postfix/pipe[29479]: 51AE5FFBC3: to=<XXXXX@dmant.ovh>, relay=procmail, delay=0.17, delays=0.12/0.02/0/0.03, dsn=2.0.0, status=sent (delivered via procmail service)
Dec  9 21:37:21 ns3067246 postfix/qmgr[26438]: 51AE5FFBC3: removed
in meiner master.cf

Code: Alles auswählen

procmail unix - n n - - pipe
 flags=DORX user=vmail argv=/usr/bin/procmail -t -o SENDER=${sender} -m USER=${user}@${domain} DOMAIN=${domain} EXTENSION=${extension} RECIPIENT=${recipient} /etc/procmailrc
 
In der /etc/procmailrc

Code: Alles auswählen

LOGFILE=/var/log/procmail.log
VERBOSE=yes

HOME=/secure/vmail/$DOMAIN/$USER/Maildir

MAILDIR=$HOME/Maildir

SH=/bin/sh PATH=/bin:/usr/bin:/usr/local/bin

:0:
$MAILDIR
Procmail loggt garnichts und passieren tut auch nichts. Auch werden die Mails nicht zugestellt. Also nur ab procmail übergeben und das war es dann.

r4pt0r
Beiträge: 1225
Registriert: 30.04.2007 13:32:44
Lizenz eigener Beiträge: MIT Lizenz

Re: Postfix, eingehende Mail an pipe weitergeben, wie?

Beitrag von r4pt0r » 11.12.2017 16:28:17

Du lässt gerade _alle_ mails an procmail weitergeben, das ist dir klar? Wozu procmail als zusätzliches relay wenn du nur Nachrichten an einen bestimmen user per script verarbeiten willst :?:

Hast du es wie von mir beschrieben mit local_recipients in der postfix zustellkette probiert? Das ist die deutlich schlankere und schnellere Variante. Zudem muss procmail dafür nicht dauerhaft als dienst laufen, sondern wird nur angestoßen wenn wirklich eine mail an den/die user eingehen die in der local_recipients map definiert sind. Ansonsten arbeitet Postfix wie gewohnt seine Zustellkette ab.

Die .forward eines solchen users kann dann z.b. so aussehen:

Code: Alles auswählen

"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75"
exit code 75 ist eine temporärer fehler, postfix würde daher eine erneute Zustellung versuchen (mails gehen nicht verloren!). Procmail agiert eigentlich nur als client damit an postfix entweder eine korrekte Zustellung gemeldet oder ein Fehlercode zurückgegeben wird - dann hast du auch saubere logeinträge von postfix im Falle eines Fehlers.

Die .procmailrc eines users in der local_recipients:

Code: Alles auswählen

:0:
*!^From(.*@mydomain.tld||someone@myotherdomain.tld)
/dev/null

:0:
*.*\<html\>.*
/dev/null

:0:
* ^From(.*@mydomain.tld||someone@myotherdomain.tld)
| ( formail -f -k -X "From:" ) | sed 's/^From:.*<//g;s/>$//g;/^--/,$d;/^ *$/d' | $HOME/myscript.sh
Der erste Eintrag verwirft alles was nicht von irgend einem user aus mydomain.tld kommt oder vom user@myotherdomain.tld.
Der zweite Eintrag verwirft alle html-formatierten mails (katastrophe beim parsen in scripten und völliger Unsinn für automatisierte Auswertung)
Der dritte Eintrag matcht nochmal ausschließlich auf authorisierte domain + user aus anderer domain, piped die email an formail (einfaches filtern/parsen der header), sed reduziert mir die "From: " zeile auf die mailadresse des absenders und diese wird dann zusammen mit dem inhalt der mail an das script übergeben.

Eingriff in den MTA (postfix) ist minimal; procmail wird nur gestartet wenn wirklich nötig (nicht noch ein dienst der dauerhaft ressourcen frisst...) und procmail + script werden nur als der lokale user ausgeführt -> deutlich sicherer.


Diese Variante läuft bei mir auf mehreren MX- und lokalen relays zum abfangen und verarbeiten von diversen Statusnachrichten und Warnungen von externen Diensten oder lokalen Geräten (Drucker) die kein brauchbares SNMP beherrschen und nur mails versenden können.

dmant
Beiträge: 195
Registriert: 09.10.2017 10:28:29

Re: Postfix, eingehende Mail an pipe weitergeben, wie?

Beitrag von dmant » 11.12.2017 17:11:05

Ich habe procmail nun am laufen. War doch garnicht so kompliziert paar Änderungen und dann ging es

master.cf

Code: Alles auswählen

procmail unix - n n - - pipe
 flags=DORX user=vmail argv=/usr/bin/procmail -t -m /etc/procmailrc ${sender} ${recipient} ${user} ${domain}
/etc/procmailrc

Code: Alles auswählen

LOGNAME = $1
EXTENSION = $2
SHELL=/bin/sh
LOGFILE=/tmp/procmail_log
DEFAULT=$HOME/$4/$3/
VERBOSE=yes

:0
$DEFAULT
Das klappt jetzt soweit. Es passiert nun halt nichts ausser das alle Mails einmal durch procmail gehen. Zugestellt werden sie auch, geloggt wird auch. Also das funktioniert.

Jetzt muss ich mir nur noch eine Regel bauen wo ich auf Betreff Inhalt und Anhang prüfe und die Daten dann, bzw die Anhang als PDF weiter gebe, also prüfen ob an "fax@domain.tld" geht, der Betreff eine Nummer bzw nur aus Nummern besteht und ob in der ersten Zeile der Email eine "PIN" steht. Passt alles, das ganze an ein Programm weiter geben.

Benutzeravatar
bluestar
Beiträge: 667
Registriert: 26.10.2004 11:16:34
Wohnort: Rhein-Main-Gebiet

Re: Postfix, eingehende Mail an pipe weitergeben, wie?

Beitrag von bluestar » 10.01.2018 14:05:41

dmant hat geschrieben: ↑ zum Beitrag ↑
11.12.2017 17:11:05
Jetzt muss ich mir nur noch eine Regel bauen wo ich auf Betreff Inhalt und Anhang prüfe und die Daten dann, bzw die Anhang als PDF weiter gebe, also prüfen ob an "fax@domain.tld" geht, der Betreff eine Nummer bzw nur aus Nummern besteht und ob in der ersten Zeile der Email eine "PIN" steht. Passt alles, das ganze an ein Programm weiter geben.
Schau mal dir mal den Link an, da wird erklärt wie man Mail2Fax realisiert.

http://www.1tn.de/papers/hylafax-email2 ... teway.html

TomL
Beiträge: 3706
Registriert: 24.07.2014 10:56:59

Re: Postfix, eingehende Mail an pipe weitergeben, wie?

Beitrag von TomL » 10.01.2018 18:12:33

dmant hat geschrieben: ↑ zum Beitrag ↑
09.12.2017 13:24:27
Ok procmail ist da definitiv für meine Anwendung die bessere Alternative.
Ist es leider nicht... die Entwicklung ist eingestellt und der Entwickler selber (P. Günther) empfiehlt es, aufgrund von Sicherheitsmängeln nicht mehr zu nutzen. Mein Rat wäre, es an solch sensibler Stelle keinesfalls mehr zu benutzen.

Siehe https://en.wikipedia.org/wiki/Procmail
Procmail was an early example of a mail filtering tool and language. Procmail is no longer maintained, yet as it had just a single publicized security vulnerability since its Philip Gunther stopped maintaining it[3], it remains in wide use as its capabilities are better than its alternatives.

und https://marc.info/?l=openbsd-ports&m=14 ... 915839&w=2
Unfortunately, I don't see procmail as a good base for mail filtering now.
vg, Thomas

Antworten