Führen Sie das Skript nach Erhalt der E-Mail aus

8

Ich betreibe einen Postfix / Dovecot-Mailserver für den persönlichen Gebrauch. Es gibt nur eine Handvoll Postfächer, im Wesentlichen nur [email protected]und [email protected].

Ich verwende die virtualDatei häufig , um virtuelle Postfächer zu erstellen, an die weitergeleitet wird [email protected]. Ich habe eine Reihe davon für Wegwerfkonten wie einmalige Einkäufe in Online-Shops, Online-Spiele, die ich ausprobieren möchte, ohne mir Gedanken über laufenden Spam zu machen usw. Dazu setze ich SSH und führe die folgenden Befehle aus:

sudo vim /etc/postfix/virtual
# add a line that looks like:
# # [email protected]      [email protected]
sudo postmap virtual
sudo service postfix restart

Ich mache das so oft, dass ich den Prozess bis zu einem gewissen Grad automatisieren möchte. Ich habe überlegt, einfach ein Shell-Skript zu schreiben, das die virtuelle Mailbox und die reale Mailbox als Argumente verwendet und die Änderungen selbst vorgenommen hat, hoffe aber auf etwas, das noch mehr Hände weg ist.

Ich möchte in der Lage sein, eine E-Mail von [email protected]einem anderen Postfach auf dem Server mit dem Namen des virtuellen Postfachs als Hauptteil der Nachricht zu senden . Das Problem wären die sudoAnrufe, aber ich kann einen neuen Benutzer erstellen, dessen alleinige Verantwortung darin besteht, dies zu erledigen, der das erledigen sollte.

Meistens lautet die Frage: Wie würde ich ein Ereignis erstellen, das durch eine E-Mail ausgelöst wird? Gibt es irgendwo einen Dienst, der dies tut? Kann ich Postfix oder Dovecot so konfigurieren, dass diese E-Mail abgehört und Befehle für dieses Ereignis ausgeführt werden?

Adam Smith
quelle
Hast du diesen Link überprüft ?
Kirill-a
@ kirill-a nein ich hatte nicht. Es sieht so aus, als könnte dies dazu dienen, dieses Problem zu lösen, und jetzt habe ich endlich einen guten Grund, PHP zu lernen
Adam Smith
Sie müssen PHP nicht lernen: Ersetzen Sie einfach Ihr eigenes Shell-Skript durch das PHP-Skript, und fertig.
Marius Matutiae
@MariusMatutiae Wenn Sie oder kirill-a eine Antwort zu diesem Thema schreiben möchten, dann (vorausgesetzt, es funktioniert) werde ich das Kopfgeld gerne vergeben
Adam Smith
@ kirill-ein Höflichkeitsping für meinen Kommentar, oben.
Adam Smith

Antworten:

8

Das richtige Verfahren zum Ausführen eines Skripts (ich verwende ein Shell-Skript) beim Empfang einer E-Mail-Nachricht ist das folgende. Dazu muss die Konfigurationsdatei von postfix , master.cf (die sich in meinem Debian in / etc / postfix befindet ) geändert werden, indem die folgende Zeile hinzugefügt wird:

 my_shell_script unix - n n - - pipe flags=F user=MY_USERNAME argv=/path/to/my/shell/script ${sender} ${size} ${recipient}

Hiermit wird postfix angewiesen , das Skript auszuführen (Sie müssen es ausführbar machen), wenn ein Ereignis auftritt.

Um festzulegen, wann das Skript ausgeführt werden soll, gehen Sie wie folgt vor: Angenommen, Sie möchten, dass es ausgeführt wird, wenn [email protected] eine Nachricht empfängt. Platzieren Sie die folgende Zeile

 [email protected] FILTER my_shell_script:dummy

in der Datei /etc/postfix/address.txt ; Sie müssen eine geeignete Datenbank für Postfix erstellen , um diese Datei verwenden zu können. Dies erreichen Sie mithilfe von

  postmap /etc/postfix/address.txt

Dies erzeugt als Ausgabe eine Datei mit dem Namen /etc/postfix/address.db . Gehen Sie nun zurück zur Datei /etc/postfix/main.cf und fügen Sie die folgende Zeile hinzu:

 smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access, permit_mynetworks, reject_unauth_destination

Starten Sie nun postfix neu .

  postfix reload

und du solltest gut gehen.

MariusMatutiae
quelle
2
Meinen Sie hier nicht "check_recipient_access hash: / etc / postfix / address"? Sie haben "Zugang" verwendet, wo Sie meiner Meinung nach "Adresse" gemeint haben, basierend auf Ihren Anweisungen.
Lee Fuller
3
Ist dies dasselbe, wenn Sie virtual_mailboxes für verschiedene virtuelle Domänen ausführen? Ich habe diese Anweisungen wörtlich befolgt - und wenn ich keinen virtuellen_Alias ​​deklariere, bekomme ich einen Sprung. In diesem Fall wird die Nachricht an die Mailbox gesendet, das Skript jedoch nicht ausgelöst.
Lee Fuller
Ich habe das nicht zum Laufen gebracht. Diese Antwort funktionierte: serverfault.com/questions/322657/…
jlh
Soweit ich weiß, hat diese Lösung auch das Problem, dass sie nur für Nachrichten ausgelöst wird, die über SMTP empfangen werden. sendmailDirekt auf dem Server wird dies nicht auslösen.
Philip Couling
@PhilipCouling Siehe diese Antwort: unix.stackexchange.com/a/179407 . Sie können die pickupOption verwenden.
Stephan
4

Ich kann zwei offensichtliche Lösungen sehen.

Wenn Sie procmail als MDA auf Ihrem Server verwenden oder bereit sind, es zu verwenden, können Sie über die |Rezeptaktion von procmail (Pipe) ein beliebiges Skript für eine beliebige E-Mail ausführen . Es wird hoffentlich nicht als root gestartet, aber es sollte einfach sein, ein Skript zu erstellen, das die erforderliche Magie ausführt und das von einem relevanten Benutzer ohne Passwort als root aufgerufen werden kann. Die Ausgabe des Skripts könnte sogar in dieselbe E-Mail und die später zugestellte E-Mail zurückgeführt werden, indem das Rezept zu einer Filteraktion gemacht wird.

Eine Alternative (die weniger praktische Wartung erfordern sollte) besteht darin , ein einzelnes Postfach$recipient_delimiter zu erstellen und Postfixes so zu konfigurieren , dass sie normalerweise nicht für diesen Zweck verwendet werden. zum Beispiel .oder -. Beachten Sie, dass Empfänger_Delimeter eine serverweite Einstellung ist. Angenommen, Sie richten die Mailbox ein [email protected]und legen sie fest $recipient_delimeter = .. Dies ermöglicht dann dummy.<anything>@example.comdie Zustellung an das entsprechende lokale Postfach [email protected]. Fügen Sie hinzu, um eine dieser Optionen zu deaktivierendummy.<whatever>@example.comzu einer geeigneten Empfängertabelle mit einer Ablehnungsaktion. Der Nachteil ist, dass es sich um ein Sammelpostfach für das Präfix handelt. Daher sollten Sie das Präfix durch versehentliche oder Wörterbuchangriffe nur schwer stolpern lassen. Der Vorteil ist, dass im Normalfall (der Absender respektiert Ihre Wünsche und verkauft Ihre E-Mail-Adresse nicht weiter) dieser Ansatz wartungsfrei ist. Sie können Ihr Präfix später jederzeit ändern und die Kombinationen explizit auflisten, für die Sie weiterhin E-Mails erhalten möchten .

ein CVn
quelle
Ich bin aus keinem anderen Grund als dem, was ich derzeit habe, an Postfix gebunden. Ich würde es jedoch vorziehen, eine Lösung zu finden, die mit meinem aktuellen MDA / MTA funktioniert. Was das Trennzeichen betrifft: Ich vertraue kaum darauf, dass der Absender meine Wünsche respektiert und meine E-Mail-Adresse nicht weiterverkauft, oder ich würde ihnen die permanente Adresse geben :)
Adam Smith
@AdamSmith Der Unterschied ist, mit so etwas wie meine zweite Alternative, können Sie die Adresse deaktivieren Sie ohne Probleme zu verursachen anderswo ein bestimmtes Unternehmen gab, und die Adressen aussehen sinnvoll , auch stumm automatisierte Verifizierer. Für die Beibehaltung des MDA / MTA kann procmail als Ersatz für das Postfix-MDA verwendet werden. Postfix muss nicht als MTA ersetzt werden.
Ein CVn
procmail wird nicht mehr gepflegt: siehe lwn.net/Articles/416901 , ein Artikel mit dem Titel: Berichte über den Tod von procmail sind nicht schrecklich übertrieben. Gehen Sie besser auf Nummer sicher und folgen Sie dem Vorschlag von @ kirill-a.
Marius Matutiae
procmail wird immer noch häufig verwendet und (IMHO) bleibt die beste Lösung für die Ad-hoc-Filterung. @ MariusMatutiaes Hinweis, dass es tatsächlich tot ist, gilt ausschließlich für seine Entwicklung. Ich kann mir keine Procmail-Fehler vorstellen, die ich jemals erlebt habe, und ich habe lächerliche Dinge getan, wie das Implementieren ausgewachsener Mailinglisten. Vielleicht wurde es nicht weiterentwickelt, weil die einzige Richtung, die es einschlagen würde, über seinen Rahmen hinausgehen würde (z. B. Anti-Spam, besser von SpamAssassin bedient oder zB Milter-Greylist ).
Adam Katz
Und du sagst mir das, weil ...?
Marius Matutiae
2

Falls der Link ausfällt, finden Sie hier eine Zusammenfassung.

Gehen Sie zuerst zu master.cfIhrem Skript "myhook" und registrieren Sie es, indem Sie die folgende Zeile hinzufügen:

myhook unix - n n - - pipe flags=F user=www-data argv=/path/to/script.sh ${sender} ${size} ${recipient}

Bearbeiten Sie auch die SMTP-Zeile, um Postfix anzuweisen, den Filter für alle E-Mails auszuführen, die über die SMTP-Zustellung eingehen:

smtp inet n - - - - smtpd -o content_filter=myhook:dummy

Bitte beachten Sie, dass der Filter nicht ausgelöst wird, wenn Sie E-Mails mit dem Befehl "sendmail" senden. Fügen Sie in diesem Fall die Option nach der Versandart "Abholung" hinzu:

pickup fifo n - - 60 1 pickup -o content_filter=myhook:dummy

Postfix neu starten: postfix reload

Machen Sie Ihr Skript für jedermann lesbar und ausführbar: chmod +rx script.sh

Beachten Sie, dass das Skript immer für eingehende E-Mails ausgelöst wird. Um die genaue Adresse anzugeben, siehe @MariusMatutiae Antwort.

kirill-a
quelle
das brachte mir "unbekannter Posttransportfehler" ...
user1133275