Como configurar o postfix para enviar todo o email recebido para um script?

22

Usando o postfix, gostaria que todos os e-mails recebidos, para qualquer endereço (incluindo aqueles que não são mapeados para usuários locais) fossem canalizados para um script. Eu tentei configurar mailbox_command em /etc/postfix/main.cf :

mailbox_command = /path/to/myscript.py

Isso funciona muito bem se o usuário for um usuário local, mas falha para usuários "desconhecidos" que não possuem aliases. Eu tentei definir luser_relay para um usuário local, mas isso pré-processa mailbox_command e, portanto, o comando não é executado. Eu tentei definir local_recipient_maps= (string vazia), mas a mensagem ainda é devolvida (usuário desconhecido).

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

Completa /etc/postfix/main.cf segue - é o padrão do Ubuntu 10.04, com exceção da linha mailbox_command :

# 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
    
por user67641 11.04.2011 / 22:34

3 respostas

25

Ok, acabei de fazer isso funcionar - apesar de parecer mais cabeludo do que pensei. Larguei a parte maildir_command e usei transport_maps . A chave é fazer 5 coisas:

  1. Configurar um arquivo db para manipular aliases (e adicionar um alias genérico)
  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 do banco de dados berkeley que o postfix deseja.
  4. Configure o manipulador em /etc/postfix/master.cf para enviar mensagens para o script.
  5. Defina /etc/postfix/main.cf para usar o banco de dados de transporte para transport_maps e o alias db para virtual_alias-maps .

(1) Crie /etc/postfix/virtual_aliases para adicionar um apelido pega-tudo - localuser precisa ser um usuário local existente:

@mydomain.tld   [email protected]

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

mydomain.tld    mytransportname:

(3) Em seguida, tanto transport como virtual_aliases precisam ser compilados em arquivos db de berkeley:

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

(4) Adicione o transporte para /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.

    
por 11.04.2011 / 23:44
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 codificar esse nome de usuário para um canal e um processo em aliases:

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

Este tráfego enviado destinado a "[email protected]" para um script perl que escrevi para processá-lo.

gotit.pl (por exemplo, não me agregue por skillz de programação de baixa qualidade =). O trabalho era processar um email que eu enviei para o nosso servidor Exchange (onde era auto-respondido via algum código VB) para verificar se o Exchange estava processando e-mail em tempo hábil. Caso contrário, o servidor de e-mail enviaria um e-mail de alerta para nossos pagers e escreveria 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;
    }
}
    
por 11.04.2011 / 23:24
0

Eu usei um estilo antigo "arquivo simples" Mailbox para receber todos os e-mails (e depois removê-los em intervalos de algumas horas), em vez de usar as pastas maildir/ modernas para processar e-mails através de scripts. Você pode executar o logrotate sobre o arquivo também, suponho que seja manejável.

Dessa forma, você pode simplesmente copiar todos os e-mails para uma Caixa de Correio como um usuário local.

    
por 11.04.2011 / 23:11