Como configurar o postfix para canalizar todos os emails recebidos para um script?


24

Usando o postfix, eu gostaria que todos os emails recebidos, em qualquer endereço (incluindo aqueles que não mapeiam para usuários locais) fossem canalizados para um script. Eu tentei configurar mailbox_commandem /etc/postfix/main.cf:

mailbox_command = /path/to/myscript.py

Isso funciona muito bem se o usuário é um usuário local, mas falha para usuários "desconhecidos" que não têm aliases. Eu tentei configurar luser_relaypara um usuário local, mas isso é um empecilho mailbox_commandpara que o comando não seja executado. Tentei definir local_recipient_maps=(sequência vazia), mas a mensagem ainda é devolvida (usuário desconhecido).

Existe uma invocação mágica que eu possa usar para fazer com que todos os usuários conhecidos e desconhecidos também acessem o script?

A /etc/postfix/main.cfseguir, é o Ubuntu 10.04 padrão, com exceção da mailbox_commandlinha:

# 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

Após o script, o que então? Parece o tipo de coisa que os antivírus e os filtros de spam fazem. Talvez você encontre um guia para configurar um deles e use sua configuração para o seu script?
DerfK

As mensagens vão para um aplicativo da web. Então, após o script: um banco de dados, outro processamento, outras coisas, mas não as mensagens normais. A questão principal é fazer com que os usuários desconhecidos não retornem - isso está fora do cenário normal de vírus / spam, onde você rejeitaria usuários não mapeados.
user67641

@ user67641 oi eu preciso fazer para injetar o correio em postfix no meu script ou adicionando mais algumas linhas em master.cf
merveotesi

Respostas:


32

Ok, acabei de fazer isso funcionar - embora mais cabeludo do que pensei que seria. Larguei a maildir_commandpeça e fui com ela transport_maps. A chave é fazer 5 coisas:

  1. Configure um arquivo db para manipular aliases (e adicione um alias catch-all)
  2. Configure um arquivo db para mapear o 'transporte' do domínio em questão para um manipulador especial.
  3. Compile os arquivos db no formato berkeley db que o postfix deseja.
  4. Configure o manipulador /etc/postfix/master.cfpara canalizar as mensagens para o script.
  5. Defina /etc/postfix/main.cfpara usar o transporte db para transport_mapse o alias db para virtual_alias-maps.

(1) Crie /etc/postfix/virtual_aliasespara adicionar um alias genérico - localuserprecisa ser um usuário local existente:

@mydomain.tld   localuser@mydomain.tld

(2) Crie /etc/postfix/transportpara adicionar um mapeamento de transporte. "mytransportname" pode ser o que você quiser; é usado abaixo em master.cf:

mydomain.tld    mytransportname:

(3) Em seguida, ambos transporte virtual_aliasesprecisam ser compilados nos arquivos berkeley db:

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

(4) Adicione o transporte a /etc/postfix/master.cf:

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

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

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

E ... bom ir! Sheesh.


1
resposta extremamente útil
merveotesi 12/11/2013

1
Mapas de alias virtuais não são necessários. Você pode realizar o mesmo com relay_domains(nesse caso, o arquivo de transporte pode filtrar com base no endereço To:).
Brilliand

Descobri que você pode rotear todo o correio virtual para um script com 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. Consulte postfix.org/transport.5.html e postfix.org/VIRTUAL_README.html .
Chloe

O (4) deve estar em uma única linha, certo? Também não requer um postfix restartou reloadou algo assim? Última coisa: existe um arquivo de log para ver os e-mails que chegaram ao postfix?
Basj

@Basj, o arquivo de log é /var/log/mail.log.
fiedl 22/07

4

A única vez que usei algo assim foi para a caixa de correio de um usuário específico. Tudo o que era necessário era alias o nome do usuário para um canal e um processo em alias:

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

Isso enviou o tráfego destinado a "pong@mymailserver.com" para um script perl que eu escrevi para processá-lo.

gotit.pl (como exemplo, não me peguem na programação de baixa qualidade skillz =). Seu trabalho era processar um email que eu enviei ao nosso servidor Exchange (onde foi respondido automaticamente por meio de algum código VB) para verificar se o Exchange estava processando emails em tempo hábil. Caso contrário, o servidor de email enviaria um email de alerta para nossos pagers e gravaria um arquivo de bloqueio, para que não recebêssemos spam constantemente.

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

Sim, e apenas redirecione @ meudominio.tld para pong e todo o main de entrada para meudominio.tld será canalizado.
Zaar Hai

e para aqueles que usam vários domínios virtuais, não se esqueça de redirecioná-lo para pong @ localhost para que ele não anexe o nome de domínio padrão ao alias
therightstuff

0

Usei um "arquivo simples" antigo Mailboxpara receber todos os emails (e removê-los a cada poucas horas, se forem grandes), em vez de usar as maildir/pastas modernas , para processar emails por meio de scripts. Você também pode executar o logrotate sobre o arquivo, para mantê-lo gerenciável.

Dessa forma, você pode simplesmente copiar todo o correio para uma Caixa de Correio como um usuário local.


0

Depois de muita dor de cabeça eu coloquei esta solução com base em um par de diferentes fontes que resultou em muito menos esforço, as etapas críticas foram configurando virtual_alias_domains, assim como virtual_alias_mapse certificando-se que o mapeamento virtual foi a my-alias@localhostvez de apenas my-alias. No meu exemplo, o alias de comando é canalizar o email para o ponto de extremidade da API do site, mas poderia facilmente ser canalizado para outra coisa.

Aqui estão as etapas que você precisará seguir:

  • Configure seus registros A e MX para o seu domínio, o registro A @ apontando para o IP do servidor no qual você receberá emails e o MX com o nome do host @ e o valor 10 mail.your-domain-name
  • sudo apt-get install postfix
  • Selecione "Site da Internet" e digite seu nome de domínio (totalmente qualificado)
  • sudo vi /etc/postfix/main.cf
  • Adicione mail.your-domain-name à lista de mydestinationvalores
  • Acrescentar
virtual_alias_domains = hash:/etc/postfix/virtual_domains
virtual_alias_maps = hash:/etc/postfix/virtual

até o final do arquivo

  • 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

(os campos #domain suprimem avisos)

  • 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.