Bei Verwendung von Postfix möchte ich, dass alle eingehenden E-Mails an eine beliebige Adresse (einschließlich derjenigen, die keinen lokalen Benutzern zugeordnet sind) an ein Skript weitergeleitet werden. Ich habe versucht , Projektierungs - mailbox_command
in /etc/postfix/main.cf
:
mailbox_command = /path/to/myscript.py
Dies funktioniert hervorragend, wenn der Benutzer ein lokaler Benutzer ist, schlägt jedoch für "unbekannte" Benutzer fehl, die keine Aliase haben. Ich habe versucht, die Einstellung luser_relay
auf einen lokalen Benutzer festzulegen mailbox_command
, dies führt jedoch dazu , dass der Befehl nicht ausgeführt wird. Ich habe versucht local_recipient_maps=
(leere Zeichenfolge) zu setzen, aber die Nachricht ist immer noch zurückgeworfen (unbekannter Benutzer).
Gibt es einen magischen Aufruf, mit dem ich alle bekannten und unbekannten Benutzer dazu bringen kann, auch das Skript aufzurufen?
Voll /etc/postfix/main.cf
folgt - es ist das Standard-Ubuntu 10.04, mit Ausnahme der mailbox_command
Zeile:
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
myhostname = ... snip ...
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = sassafras, ... snip ...,localhost.localdomain, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
mailbox_command = /path/to/my/script.py
Antworten:
Ok, ich habe es gerade zum Laufen gebracht - obwohl haariger, als ich gedacht hatte. Ich ließ das
maildir_command
Teil fallen und ging mittransport_maps
. Der Schlüssel ist, 5 Dinge zu tun:/etc/postfix/master.cf
, dass E-Mails an das Skript weitergeleitet werden./etc/postfix/main.cf
den Transport db zu verwendentransport_maps
, und den Alias db fürvirtual_alias-maps
.(1) Erstellen
/etc/postfix/virtual_aliases
, um einen Sammelalias hinzuzufügen -localuser
muss ein vorhandener lokaler Benutzer sein:(2) Erstellen
/etc/postfix/transport
, um eine Transportzuordnung hinzuzufügen. "meinTransportname" kann sein, was immer Sie wollen; es wird unten verwendet inmaster.cf
:(3) Als nächstes müssen beide
transport
undvirtual_aliases
in Berkeley DB-Dateien kompiliert werden:(4) Fügen Sie den Transport hinzu zu
/etc/postfix/master.cf
:(5) In
/etc/postfix/main.cf
:Und ... gut zu gehen! Meine Güte.
quelle
relay_domains
(in diesem Fall kann die Transportdatei basierend auf der tatsächlichen An-Adresse gefiltert werden).virtual_transport = mailcaptcha:
inmain.cf
undmailcaptcha unix - n n - - pipe flags=FR user=vmail argv=/usr/bin/perl /usr/local/mail-captcha/verify.pl ${sender} ${recipient}
in an ein Skript weiterleiten könnenmaster.cf
. Siehe postfix.org/transport.5.html und postfix.org/VIRTUAL_README.html .postfix restart
oderreload
oder so etwas? Letzte Sache: gibt es eine Protokolldatei, um die Mails zu sehen, die bei Postfix angekommen sind?/var/log/mail.log
.Das einzige Mal, dass ich so etwas verwendet habe, war für das Postfach eines bestimmten Benutzers. Alles, was erforderlich war, war, den Namen dieses Benutzers einer Pipe und einem Prozess in Aliases zuzuweisen:
Dadurch wurde der für "[email protected]" bestimmte Datenverkehr an ein Perl-Skript gesendet, das ich geschrieben habe, um es zu verarbeiten.
gotit.pl (als Beispiel, wählen Sie mich nicht für beschissenes Programmieren skillz =). Die Aufgabe bestand darin, eine E-Mail zu verarbeiten, die ich an unseren Exchange-Server gesendet hatte (auf den über einen VB-Code automatisch geantwortet wurde), um sicherzustellen, dass Exchange E-Mails rechtzeitig verarbeitet. Andernfalls schickte der Mailserver eine Alarm-E-Mail an unsere Pager und schrieb eine Sperrdatei, damit wir nicht ständig Spam bekamen.
quelle
Ich habe eine "flache Datei" alten Stils verwendet
Mailbox
, um alle E-Mails zu empfangen (und sie dann alle paar Stunden zu bereinigen, wenn sie groß sind), anstatt die modernenmaildir/
Ordner zu verwenden, um E-Mails über Skripte zu verarbeiten. Sie könnten die Datei auch logrotieren, um sie überschaubar zu halten.Auf diese Weise können Sie einfach alle E-Mails als lokaler Benutzer in eine Mailbox kopieren.
quelle
Nachdem eine Menge Kopfschmerzen ich zusammen diese Lösung basiert auf einer Reihe von verschiedenen Quellen , die in viel weniger Aufwand geführt hat , wurden die Konfiguration der kritischen Schritte
virtual_alias_domains
sowievirtual_alias_maps
und dafür zu sorgen , dass die virtuelle Zuordnung war ,my-alias@localhost
anstatt nurmy-alias
. In meinem Beispiel besteht der Befehlsalias darin, die E-Mail an einen Website-API-Endpunkt weiterzuleiten, aber er könnte genauso einfach in etwas anderes weitergeleitet werden.Hier sind die Schritte, die Sie ausführen müssen:
10 mail.your-domain-name
sudo apt-get install postfix
sudo vi /etc/postfix/main.cf
mydestination
Werte hinzubis zum Ende der Datei
sudo apt-get vi /etc/aliases
sudo newaliases
sudo apt-get vi /etc/postfix/virtual_domains
(Die Felder #domain unterdrücken Warnungen.)
sudo postmap /etc/postfix/virtual_domains
sudo apt-get vi /etc/postfix/virtual
sudo postmap /etc/postfix/virtual
sudo /etc/init.d/postfix reload
quelle