Frage Wie man Postfix so konfiguriert, dass alle eingehenden E-Mails an ein Skript weitergeleitet werden?


Mit postfix möchte ich, dass alle eingehenden E-Mails an alle Adressen (einschließlich derer, die nicht lokalen Benutzern zugeordnet sind) an ein Skript weitergeleitet werden. Ich habe versucht, zu konfigurieren mailbox_command im /etc/postfix/main.cf:

mailbox_command = /path/to/myscript.py

Dies funktioniert hervorragend, wenn der Benutzer ein lokaler Benutzer ist, aber es schlägt für "unbekannte" Benutzer fehl, die keine Aliase haben. Ich habe es versucht luser_relay zu einem lokalen Benutzer, aber dies pre-empt mailbox_commandund so wird der Befehl nicht ausgeführt. Ich habe es versucht local_recipient_maps= (leere Zeichenfolge), aber die Nachricht wird immer noch zurückgewiesen (unbekannter Benutzer).

Gibt es eine magische Invokation, mit der ich alle bekannten und unbekannten Benutzer dazu bringen kann, auch zum Skript zu gehen?

Voll /etc/postfix/main.cf folgt - es ist das Standard Ubuntu 10.04, mit Ausnahme der mailbox_command Linie:

# 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

22
2018-04-11 20:34


Ursprung


Nach dem Skript, was dann? Das hört sich an, als ob Virenscanner und Spam-Filter funktionieren. Vielleicht finden Sie eine Anleitung zum Konfigurieren eines dieser Skripts und dessen Konfiguration für Ihr Skript. - DerfK
Die Nachrichten werden an eine Webanwendung gesendet. Also nach dem Skript: eine Datenbank, andere Verarbeitung, andere Sachen, aber nicht normale Postsendungen. Die Schlüsselfrage ist, dass die unbekannten Benutzer nicht abprallen - das ist außerhalb des normalen Viren / Spam-Szenarios, wo Sie nicht zugeordnete Benutzer abprallen lassen würden. - user67641
@ user67641 Hi, ich muss die Mail in Postfix in meinem Skript einfügen oder indem ich einige Zeilen in master.cf hinzufüge - merveotesi


Antworten:


Ok, ich habe gerade funktioniert - obwohl haariger als ich dachte, es wäre. Ich ließ die fallen maildir_command Teil und ging mit transport_maps. Der Schlüssel ist, 5 Dinge zu tun:

  1. Richten Sie eine db-Datei ein, um Aliase zu behandeln (und fügen Sie einen Alias ​​mit allen Einträgen hinzu)
  2. Richten Sie eine db-Datei ein, um den 'Transport' für die betreffende Domäne einem speziellen Handler zuzuordnen.
  3. Kompilieren Sie die DB-Dateien in das Berkeley-DB-Format, das Postfix benötigt.
  4. Richten Sie den Handler ein /etc/postfix/master.cf Mail an das Skript übergeben.
  5. einstellen /etc/postfix/main.cf die Transportdatenbank für verwenden transport_mapsund der Alias ​​db für virtual_alias-maps.

(1) Erstellen /etc/postfix/virtual_aliases einen Catch-Alias ​​hinzufügen localuser muss ein vorhandener lokaler Benutzer sein:

@mydomain.tld   localuser@mydomain.tld

(2) Erstellen /etc/postfix/transport ein Transport-Mapping hinzufügen. "MeinTransportname" kann sein, was auch immer Sie wollen; Es wird unten in verwendet master.cf:

mydomain.tld    mytransportname:

(3) Als nächstes beide transport und virtual_aliases müssen in berkeley db-Dateien kompiliert werden:

$ sudo postmap /etc/postfix/virtual_aliases
$ sudo postmap /etc/postfix/transport

(4) Fügen Sie den Transport hinzu /etc/postfix/master.cf:

mytransportname   unix  -       n       n       -       -       pipe
  flags=FR user=localuser argv=/path/to/my/script.py
  ${nexthop} ${user}

(5) /etc/postfix/main.cf:

  ...
  transport_maps = hash:/etc/postfix/transport
  virtual_alias_maps = hash:/etc/postfix/virtual_aliases

Und ... gut zu gehen! Meine Güte.


25
2018-04-11 21:44



sehr nützliche Antwort - merveotesi
Virtuelle Alias-Maps werden nicht benötigt. Sie können dasselbe mit erreichen relay_domains (In diesem Fall kann die Transportdatei basierend auf der tatsächlichen An: -Adresse filtern). - Brilliand
Ich habe festgestellt, dass Sie alle virtuellen E-Mails mit einem Skript anleiten können virtual_transport = mailcaptcha: im main.cf und mailcaptcha unix - n n - - pipe flags=FR user=vmail argv=/usr/bin/perl /usr/local/mail-captcha/verify.pl ${sender} ${recipient} im master.cf. Sehen postfix.org/transport.5.html und postfix.org/VIRTUAL_README.html. - Chloe
Die (4) sollte in einer einzigen Zeile sein, ist das richtig? Benötigt es auch nicht a postfix restart oder reload oder sowas? Letzte Sache: Gibt es eine Log-Datei, um die Mails zu sehen, die in Postfix angekommen sind? - Basj


Das einzige Mal, dass ich so etwas verwendet habe, war das Postfach eines bestimmten Benutzers. Alles, was erforderlich war, war, den Namen dieses Benutzers in eine Pipe und einen Prozess in Aliasnamen umzubenennen:

pong: "| / usr/local/bin/gotit.pl"

Dieser schickte den für "pong@mymailserver.com" bestimmten Verkehr an ein Perl-Skript, das ich geschrieben hatte, um es zu verarbeiten.

gotit.pl (als Beispiel, wählen Sie mich nicht für beschissene Programmierung skillz =). Die Aufgabe bestand darin, eine E-Mail zu verarbeiten, die ich an unseren Exchange-Server gesendet hatte (wo sie automatisch über VB-Code beantwortet wurde), um sicherzustellen, dass Exchange E-Mails zeitnah verarbeiten konnte. Wenn nicht, würde der Mail-Server eine Benachrichtigungs-E-Mail an unsere Pager senden und eine Sperrdatei schreiben, so dass wir nicht ständig mit Spam-Nachrichten konfrontiert werden.

#! /usr/bin/perl -w
use vars qw ( $mung $sent $tvalue $remainder $delta $fout );
$mung = time;
while (<STDIN>) {
    ($sent, $tvalue, $remainder ) = split /: /, $_, 3;
    $tvalue =~ s/(\D+)//g;
    chomp($tvalue);
    $delta = $mung-$tvalue;
    if ( $sent =~ "Sent" ) {
        $fout = "/var/spool/mailcheck/$tvalue";
        next unless ( -e $fout );
        open (TMP, "> $fout") or die "Couldn't open output file: $!\n";
        print TMP "Received in: $delta seconds.\n";
                close TMP;
        last;
    }
}

4
2018-04-11 21:24



Ja, und redirect @ mydomain.tld zu pong und alle eingehenden maindomain.tld werden weitergeleitet. - Zaar Hai


Ich habe eine "flache Datei" im alten Stil verwendet Mailbox um alle Post zu erhalten (und sie dann alle paar Stunden zu schneiden, wenn sie groß ist), anstatt das moderne zu verwenden maildir/ Ordner, um Mail über Skripte zu verarbeiten. Sie könnten logrotate auch über die Datei laufen lassen, um es überschaubar zu halten.

Auf diese Weise können Sie einfach alle E-Mails als lokaler Benutzer in eine Mailbox kopieren.


0
2018-04-11 21:11