Wie konfiguriere ich Postfix, um alle eingehenden E-Mails an ein Skript weiterzuleiten?


24

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_commandin /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_relayauf 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.cffolgt - es ist das Standard-Ubuntu 10.04, mit Ausnahme der mailbox_commandZeile:

# 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

Was dann nach dem Drehbuch? Das klingt nach der Art von Virenscannern und Spam-Filtern. Vielleicht finden Sie eine Anleitung zum Konfigurieren dieser und können die Konfiguration für Ihr Skript verwenden?
DerfK

Die Nachrichten werden an eine Webanwendung gesendet. Also nach dem Skript: eine Datenbank, andere Verarbeitung, andere Sachen, aber keine normalen Mail-Sachen. Die Schlüsselfrage ist, die unbekannten Benutzer dazu zu bringen, nicht zu bouncen - dies liegt außerhalb des normalen Viren- / Spam-Szenarios, in dem Sie nicht zugeordnete Benutzer bouncen würden.
user67641

@ user67641 Hallo, muss ich die E-Mail in Postfix in meinem Skript einfügen oder indem ich weitere Zeilen in master.cf
merveotesi

Antworten:


32

Ok, ich habe es gerade zum Laufen gebracht - obwohl haariger, als ich gedacht hatte. Ich ließ das maildir_commandTeil fallen und ging mit transport_maps. Der Schlüssel ist, 5 Dinge zu tun:

  1. Richten Sie eine DB-Datei für die Behandlung von Aliasen ein (und fügen Sie einen Catch-All-Alias ​​hinzu).
  2. Richten Sie eine Datenbankdatei ein, um den 'Transport' für die betreffende Domäne einem speziellen Handler zuzuordnen.
  3. Kompilieren Sie die DB-Dateien in das von Postfix gewünschte Berkeley-DB-Format.
  4. Richten Sie den Handler so ein /etc/postfix/master.cf, dass E-Mails an das Skript weitergeleitet werden.
  5. Stellen Sie /etc/postfix/main.cfden Transport db zu verwenden transport_maps, und den Alias db für virtual_alias-maps.

(1) Erstellen /etc/postfix/virtual_aliases, um einen Sammelalias hinzuzufügen - localusermuss ein vorhandener lokaler Benutzer sein:

@mydomain.tld   localuser@mydomain.tld

(2) Erstellen /etc/postfix/transport, um eine Transportzuordnung hinzuzufügen. "meinTransportname" kann sein, was immer Sie wollen; es wird unten verwendet in master.cf:

mydomain.tld    mytransportname:

(3) Als nächstes müssen beide transportund virtual_aliasesin Berkeley DB-Dateien kompiliert werden:

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

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

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

(5) In /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.


1
äußerst nützliche Antwort
merveotesi

1
Virtuelle Aliaskarten werden nicht benötigt. Sie können dasselbe mit ausführen relay_domains(in diesem Fall kann die Transportdatei basierend auf der tatsächlichen An-Adresse gefiltert werden).
Brilliand

Ich habe festgestellt, dass Sie alle virtuellen E-Mails mit virtual_transport = mailcaptcha:in main.cfund mailcaptcha 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önnen master.cf. Siehe postfix.org/transport.5.html und postfix.org/VIRTUAL_README.html .
Chloe

Die (4) sollte in einer einzigen Zeile stehen, ist das richtig? Auch erfordert es nicht ein postfix restartoder reloadoder so etwas? Letzte Sache: gibt es eine Protokolldatei, um die Mails zu sehen, die bei Postfix angekommen sind?
Basj

@Basj, die Protokolldatei ist /var/log/mail.log.
Fiedl

4

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:

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

Dadurch wurde der für "pong@mymailserver.com" 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.

#! /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;
    }
}

Ja, und leite einfach @ mydomain.tld zu pong um und alle eingehenden main für mydomain.tld werden weitergeleitet.
Zaar Hai

und für diejenigen von uns, die mehrere virtuelle Domänen verwenden, vergessen Sie nicht, sie an pong @ localhost umzuleiten, damit der Standarddomänenname nicht an den Alias
angehängt wird

0

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 modernen maildir/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.


0

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_domainssowie virtual_alias_mapsund dafür zu sorgen , dass die virtuelle Zuordnung war , my-alias@localhostanstatt 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:

  • Richten Sie Ihre A- und MX-Einträge für Ihre Domain ein, wobei der A-Eintrag @ auf die IP des Servers verweist, auf dem Sie E-Mails empfangen möchten, und MX mit dem Hostnamen @ und dem Wert 10 mail.your-domain-name
  • sudo apt-get install postfix
  • Wählen Sie "Internet Site" und geben Sie Ihren Domainnamen ein (vollqualifiziert)
  • sudo vi /etc/postfix/main.cf
  • Fügen Sie mail.your-domain-name zur Liste von hinzu mydestination Werte hinzu
  • Anhängen
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual

bis zum Ende der Datei

  • sudo apt-get vi /etc/aliases
curl_email: "|curl --data-binary @- http://your-domain-name/email"
  • sudo newaliases
  • sudo apt-get vi /etc/postfix/virtual_domains
example.net   #domain
example.com   #domain
your-domain-name   #domain

(Die Felder #domain unterdrücken Warnungen.)

  • sudo postmap /etc/postfix/virtual_domains
  • sudo apt-get vi /etc/postfix/virtual
info@your-domain-name bob@gmail.com
everyone@your-domain-name bob@gmail.com jim@gmail.com
email_processor@your-domain-name curl_email@localhost
@your-domain-name catchall@whereveryouwant.com
ted@example.net jane@outlook.com
  • sudo postmap /etc/postfix/virtual
  • sudo /etc/init.d/postfix reload
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.