Come configurare postfix per reindirizzare tutta la posta elettronica in arrivo a uno script?


24

Usando postfix, vorrei che tutta la posta in arrivo, a qualsiasi indirizzo (compresi quelli che non fossero mappati agli utenti locali), venisse reindirizzata a uno script. Ho provato a configurare mailbox_commandin /etc/postfix/main.cf:

mailbox_command = /path/to/myscript.py

Funziona alla grande se l'utente è un utente locale, ma fallisce per gli utenti "sconosciuti" che non hanno alias. Ho provato a impostare luser_relayun utente locale, ma questo mailbox_commandimpedisce e quindi il comando non viene eseguito. Ho provato a impostare local_recipient_maps=(stringa vuota), ma il messaggio è ancora rimbalzato (utente sconosciuto).

C'è una chiamata magica che posso usare per convincere anche tutti gli utenti noti e sconosciuti ad andare allo script?

Full /etc/postfix/main.cfsegue: è Ubuntu 10.04 predefinito, ad eccezione della mailbox_commandriga:

# 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

Dopo la sceneggiatura, cosa succede? Sembra il tipo di cose che fanno gli scanner antivirus e i filtri antispam, forse puoi trovare una guida per configurare uno di questi e usare la sua configurazione per il tuo script?
DerfK,

I messaggi vanno a un'applicazione web. Quindi dopo lo script: un database, altre elaborazioni, altre cose, ma non cose normali di posta. La domanda chiave è far sì che gli utenti sconosciuti non rimbalzino - questo è al di fuori del normale scenario di virus / spam, in cui rimbalzare gli utenti non mappati.
user67641

@ user67641 ciao devo iniettare la posta in postfix nel mio script o aggiungendo qualche altra riga in master.cf
merveotesi

Risposte:


32

Ok, ho appena funzionato, anche se più peloso di quanto pensassi. Ho lasciato cadere la maildir_commandparte e ci sono andato transport_maps. La chiave è fare 5 cose:

  1. Imposta un file db per gestire gli alias (e aggiungi un alias generale)
  2. Impostare un file db per mappare il "trasporto" per il dominio in questione a un gestore speciale.
  3. Compilare i file db nel formato db berkeley desiderato da postfix.
  4. Imposta il gestore /etc/postfix/master.cfper reindirizzare la posta allo script.
  5. Impostare /etc/postfix/main.cfper utilizzare il trasporto db per transport_mapse l'alias db per virtual_alias-maps.

(1) Crea /etc/postfix/virtual_aliasesper aggiungere un alias generale - localuserdeve essere un utente locale esistente:

@mydomain.tld   localuser@mydomain.tld

(2) Crea /etc/postfix/transportper aggiungere una mappatura di trasporto. "mytransportname" può essere quello che vuoi; viene utilizzato di seguito in master.cf:

mydomain.tld    mytransportname:

(3) Successivamente, entrambi transporte virtual_aliasesdevono essere compilati in file db berkeley:

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

(4) Aggiungi il trasporto a /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

E ... bello andare! Sheesh.


1
risposta estremamente utile
merveotesi,

1
Le mappe di alias virtuali non sono necessarie. Puoi ottenere lo stesso risultato con relay_domains(nel qual caso il file di trasporto può filtrare in base all'indirizzo reale A:).
Brilliand,

Ho scoperto che puoi instradare tutta la posta virtuale a uno script con virtual_transport = mailcaptcha:in main.cfe mailcaptcha unix - n n - - pipe flags=FR user=vmail argv=/usr/bin/perl /usr/local/mail-captcha/verify.pl ${sender} ${recipient}in master.cf. Vedi postfix.org/transport.5.html e postfix.org/VIRTUAL_README.html .
Chloe,

Il (4) dovrebbe essere su una sola riga, giusto? Inoltre non richiede un postfix restarto reloado qualcosa del genere? Ultima cosa: c'è un file di registro per vedere le mail che sono arrivate a Postfix?
Basj,

@Basj, il file di registro è /var/log/mail.log.
Fiedl,

4

L'unica volta che ho usato qualcosa del genere era per la cassetta postale di un utente specifico. Tutto ciò che era necessario era alias il nome dell'utente in una pipe e un processo in alias:

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

Questo ha inviato il traffico destinato a "pong@mymailserver.com" a uno script perl che ho scritto per elaborarlo.

gotit.pl (ad esempio, non prendermi in giro per la programmazione schifosa skillz =). Il suo compito era quello di elaborare un messaggio di posta elettronica che avevo inviato al nostro server Exchange (dove era stata risposta automaticamente tramite un codice VB) per verificare che Exchange stesse elaborando la posta in modo tempestivo. In caso contrario, il server di posta invierebbe un'e-mail di avviso ai nostri cercapersone e scriverebbe un file di blocco in modo da non essere costantemente sottoposti a spam.

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

Sì, e reindirizza @ mydomain.tld a pong e tutto il main in arrivo per mydomain.tld verrà reindirizzato.
Zaar Hai,

e per quelli di noi che usano più domini virtuali, non dimenticare di reindirizzarlo a pong @ localhost in modo che non
associ

0

Ho usato un "file flat" vecchio stile Mailboxper ricevere tutta la posta (e quindi eliminarla ogni poche ore se è grande), invece di utilizzare le maildir/cartelle moderne , per elaborare la posta tramite script. Potresti eseguire anche logrotate sul file, suppongo di mantenerlo gestibile.

In questo modo puoi semplicemente copiare tutta la posta in una mailbox come utente locale.


0

Dopo un sacco di mal di testa ho messo insieme questa soluzione basata su un paio di fonti diverse che ha provocato molto sforzo meno, i punti critici sono stati configurando virtual_alias_domainscosì come virtual_alias_mapse fare in modo che la mappatura virtuale è stato quello my-alias@localhostinvece di appena my-alias. Nel mio esempio il comando alias è reindirizzare l'e-mail a un endpoint dell'API del sito Web, ma potrebbe altrettanto facilmente reindirizzare a qualcos'altro.

Ecco i passaggi che devi eseguire:

  • Imposta i tuoi record A e MX per il tuo dominio, il record A che indica l'IP del server su cui riceverai le e-mail e MX con il nome host @ e il valore 10 mail.your-domain-name
  • sudo apt-get install postfix
  • Seleziona "Sito Internet" e inserisci il tuo nome di dominio (completo)
  • sudo vi /etc/postfix/main.cf
  • Aggiungi mail.your-domain-name all'elenco di mydestinationvalori
  • Aggiungere
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual

fino alla fine del file

  • 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

(i campi #dominio eliminano gli avvisi)

  • 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.