
Ich möchte alle eingehenden E-Mails *@example.com
mit einem auf meinem Server laufenden Python-Skript verwalten, das verschiedene Aufgaben übernimmt.
Ich habe bereits einen DNS-MX-Eintrag für erstellt
example.com
und ihn an meinen Server weitergeleitet:mx.example.com MX mailforwarder.example.com mailforwarder.example.com A 1.2.3.4
Ich habe sowohl mit Postfix als auch mit Exim viel herumprobiert und nichts hat funktioniert. Daher habe ich sie alle entfernt:
apt-get remove postfix
undapt-get remove exim4
. Jetzt bin ich bereit, mit einer Neuinstallation von einem der beiden zu beginnen (welches würde die kürzeste Lösung für diese spezielle Aufgabe bieten?)
Was sind die wichtigsten Schritte, um alle eingehenden E-Mails an ein Python-Skript weiterzuleiten *@example.com
?(einschließlich: Dem MTA mitteilen, dass er E-Mails von außerhalb des Servers, aus dem gesamten Internet usw. akzeptieren soll.)
Antwort1
procmail
gilt als problematischvon Philip Guenther (und ist in diesem Fall möglicherweise nutzlos, da .forward
Dateien oder Ähnliches die E-Mails direkt an Ihr Programm senden und die somit unnötige Komplexität von überspringen können procmail
).
Zusammenfassung: Löschen Sie den Procmail-Port. Der Code ist nicht sicher und sollte nicht als Grundlage für weitere Arbeiten verwendet werden.
Wie einige vielleicht wissen, war ich von Ende der 1990er bis 2001 der Upstream-Betreuer von Procmail.
Daher ist möglicherweise eine andere Lösung ratsam; dies hängt vom Mail Transport Agent (MTA) ab. Eine andere Möglichkeit wäre, den MTA für die Zustellung an eine lokale Datei oder IMAP zu verwenden und diese Datei oder IMAP dann von Ihrem Programm analysieren zu lassen. Dies hat den Vorteil, dass weiterhin E-Mails angenommen und irgendwo gespeichert werden; was passiert, wenn Ihr Programm fehlerhaft ist oder aus anderen Gründen nicht ausgeführt werden kann? Das ist weniger ein Problem als bei der Live-E-Mail-Zustellung ...
Exim
Wahrscheinlich kopieren Sie entweder die Sendmail- .forward
Methode oder finden heraus, wie man das in Eximese richtig macht. (Ich habe abgebrochen, weil es zu lange dauerte, die Exim-Dokumente zu durchforsten.) Es gibtelspy
wenn Sie das Scannen während der SMTP-Zeit im MILTER-Modus durchführen möchten ...
Postfix
Meine Güte, das scheint lang und kompliziert zu sein.
Sendmail
Setzen Sie einen mailertable
Eintrag, um alle Mails für die Domäne (und .domain
ggf. für Subdomänen) an einen lokalen Benutzer weiterzuleiten, hierjdoe
example.com local:jdoe
.example.com local:jdoe
und richten Sie dann eine .forward
Datei für diesen Benutzer ein, um den erforderlichen Code auszuführen
$ cat ~jdoe/.forward
"|/etc/smrsh/process"
$
Das könnte so einfach sein wie
$ cat /etc/smrsh/process
#!/bin/sh
cat >> /home/jdoe/allmails
$
weil die E-Mails über die Standardeingabe eingespeist werden (das kann schlecht sein, wenn mehrere Instanzen davon process
gleichzeitig ausgeführt werden; vermutlich behandelt Ihr eigentlicher Code solche Race Conditions oder ist anderweitig idempotent ... richtig?). Diese Methode kann auch für jeden anderen MTA funktionieren, der die Weiterleitungssyntax von Sendmail kopiert, vorausgesetzt, Sie können den MTA dazu bringen, alle E-Mails an einen bestimmten Benutzer umzuleiten.
Dies setzt voraus , dass mailertable
die Unterstützung aktiviert und confFORWARD_PATH
eingestellt ist, dass Sendmail den Code ausführen darf (beachten Sie smrsh(8)
jedoch, dass einige Anbieter das Verzeichnis ändern könnten, ohne die Dokumentation zu aktualisieren (Ausführen strings /the/path/to/smrsh | fgrep /
könnte hilfreich sein)) und dass etwas wie Selinux nicht ebenfalls Probleme verursacht.
Eine weitere Option für Sendmail ist die Verwendung eines MILTER wieMIMEDefangund führen Sie dort die erforderliche Geschäftslogik aus. (Verschiedene andere MTAs unterstützen MILTER oder haben etwas Ähnliches.)
Simple Mail Transfer Protocol-Daemon (OpenBSD)
Aus einem Blick aufsmtpd.conf(5)
(aktualisiert für Änderungen in OpenBSD 6.4)
action "mymda" mda "/path/to/your/command" user jdoe
match from any for domain example.com action "mymda"
Antwort2
Dies schien eine recht häufig gestellte Frage zu sein... Ich fand, dass dies bereits beantwortet wurde, was ich auch vorschlagen würde. Procmail ist ein lokaler Zustelldienst... wasIch findebedeutet, dass etwas die E-Mail bereits vom Netzwerk empfangen und an procmail zur lokalen Zustellung oder anderen Filterung übergeben hat. In diesem Fall wäre das Postfix. Nachdem ich Postfix in der Produktion eingesetzt habe, weiß ich, dass es ein solides und sehr flexibles Tool für die benutzerdefinierte E-Mail-Verarbeitung ist.
Antwort3
Mir gefällt der Mail-in-a-Box-Stack, der Postfix und Dovecot verwendet. Sobald Sie diese installiert haben, können Sie Folgendes tun, um beim Empfang von E-Mails an bestimmte Adressen ein Skript auszuführen:
Erstellen Sie Ihr Skript (z. B.
mail_processor.py
) im/usr/lib/dovecot/sieve-execute/
Verzeichnis:#!/usr/bin/python3 from sys import stdin with open('/var/log/mail_processor.log', 'a') as logfile: for line in stdin: print(line.rstrip(), file=logfile)
Stellen Sie sicher, dass Ihr Skript und Ihre Zieldateien über die richtigen Berechtigungen verfügen:
$ chmod +rx /usr/lib/dovecot/sieve-execute/mail_processor.py $ chmod 0777 /var/log/mail_processor.log
Aktivieren Sie das
sieve_extprograms
Plugin:Ändern Sie
\etc\dovecot\conf.d\90-sieve.conf
den Plugin-Abschnitt von mit Folgendem:sieve_extensions = +vnd.dovecot.execute sieve_plugins = sieve_extprograms sieve_execute_bin_dir = /usr/lib/dovecot/sieve-execute
Taubenschlag neu laden:
$ service dovecot restart
Siebfilter erstellen (z. B. in Roundcube gehe zu
settings
->filters
->actions
->edit filter set
):require ["vnd.dovecot.execute"]; # rule:[mail processing] if true { execute :pipe "mail_processor.py"; }
mail_processor.py
Jetzt wird die gesamte E-Mail, die an ein Postfach mit diesem Siebfilter zugestellt wird , zur Bearbeitung weitergeleitet .
Pigeonhole Sieve: Extprograms-Pluginals Referenz