Redirecione todos os emails recebidos para um script Python

Redirecione todos os emails recebidos para um script Python

Gostaria de gerenciar todos os emails recebidos *@example.comcom um script Python em execução no meu servidor, que realizará vários trabalhos.

  • Já fiz um registro MX de DNS para example.com, direcionando-o para meu servidor:

    mx.example.com                   MX     mailforwarder.example.com
    mailforwarder.example.com        A      1.2.3.4
    
  • Eu fiz muitas tentativas e erros com o postfix e o exim, e nada estava funcionando, então removi todos eles: apt-get remove postfixe apt-get remove exim4, então estou pronto para começar com uma nova instalação de um deles (qual permitiria o solução mais curta para esta tarefa específica?)

Quais são as principais etapas para direcionar todos os emails recebidos *@example.compara um script Python?(incluindo: dizer ao MTA para aceitar e-mails vindos de fora do servidor, de toda a Internet, etc.)

Responder1

procmailé considerado problemáticopor Philip Guenther (e é possivelmente inútil neste caso, já que .forwardarquivos ou equivalentes podem enviar os e-mails diretamente para o seu programa, ignorando a complexidade desnecessária do procmail).

Resumo executivo: exclua a porta procmail; o código não é seguro e não deve ser usado como base para qualquer trabalho futuro.

Como as pessoas devem saber, eu era o mantenedor do procmail no final da década de 1990 até 2001.

Portanto, alguma outra solução pode ser aconselhável; isso depende do Mail Transport Agent (MTA). Outra opção seria usar o MTA para entregar em um arquivo local ou IMAP e, em seguida, fazer com que seu programa analise esse arquivo ou IMAP. Isso tem a vantagem de continuar aceitando e-mails e salvando-os em algum lugar; o que acontece quando seu programa apresenta erros ou falha na execução? Menos problemático do que durante a entrega de correio ao vivo ...

Exim

Provavelmente copie o .forwardmétodo Sendmail ou descubra como fazer isso corretamente no Eximese. (Eu abortei porque estava demorando muito para vasculhar os documentos do Exim.) Háelspyse você quiser fazer a varredura no tempo SMTP no estilo MILTER ...

Pós-fixo

https://serverfault.com/questions/258469/how-to-configure-postfix-to-pipe-all-incoming-email-to-a-script#258491

Nossa, isso parece longo e complicado.

Enviar correio

Defina uma mailertableentrada para encaminhar todos os e-mails do domínio (e .domaindos subdomínios, se necessário) para um usuário local, aquijdoe

example.com     local:jdoe
.example.com    local:jdoe

e então configure um .forwardarquivo para esse usuário executar o código necessário

$ cat ~jdoe/.forward
"|/etc/smrsh/process"
$ 

que poderia ser tão simples quanto

$ cat /etc/smrsh/process
#!/bin/sh
cat >> /home/jdoe/allmails
$ 

porque os e-mails são alimentados na entrada padrão (isso pode ser ruim se várias instâncias disso processforem executadas ao mesmo tempo; presumivelmente, seu código real lida com essas condições de corrida ou é idempotente ... certo?). Este método também pode funcionar para qualquer outro MTA que copie a sintaxe de encaminhamento do Sendmail, supondo que você consiga fazer com que o MTA redirecione todos os e-mails para um usuário específico.

Isso pressupõe que mailertableo suporte esteja habilitado, confFORWARD_PATHconfigurado, que o Sendmail tenha permissão para executar o código (veja, smrsh(8)porém, observe que alguns fornecedores podem alterar o diretório sem atualizar a documentação (a execução strings /the/path/to/smrsh | fgrep /pode ajudar)) e que algo como o selinux também não está quebrando as coisas.

Outra opção para Sendmail é usar um MILTER comoMIMEDefange execute qualquer lógica de negócios necessária. (Vários outros MTA suportam MILTER ou têm algo parecido.)

Daemon de protocolo de transferência de correio simples (OpenBSD)

De uma olhadasmtpd.conf(5)(atualizado para alterações do OpenBSD 6.4)

action "mymda" mda "/path/to/your/command" user jdoe
match from any for domain example.com action "mymda"

Responder2

Esta parecia uma pergunta bastante comum... Já achei isso respondido, e é isso que eu sugeriria. Procmail é um agente de entrega local.. queEu pensosignifica que algo já recebeu o e-mail da rede e o entregou ao procmail para entrega local ou outra filtragem. Nesse caso, o postfix seria essa coisa. Tendo executado o postfix em produção, é uma ferramenta sólida e muito flexível para tratamento de mensagens personalizadas.

https://serverfault.com/questions/258469/how-to-configure-postfix-to-pipe-all-incoming-email-to-a-script#258491

Responder3

Gosto da pilha mail-in-a-box que usa Postfix e Dovecot. Depois de instalá-los, você pode fazer o seguinte para executar um script ao receber mensagens em endereços específicos:

  1. crie seu script (ou seja, mail_processor.py) no /usr/lib/dovecot/sieve-execute/diretório:

    #!/usr/bin/python3
    from sys import stdin
    with open('/var/log/mail_processor.log', 'a') as logfile:
        for line in stdin:
            print(line.rstrip(), file=logfile)
    
    • certifique-se de que seu script e arquivos de destino tenham as permissões corretas:

      $ chmod +rx /usr/lib/dovecot/sieve-execute/mail_processor.py
      $ chmod 0777 /var/log/mail_processor.log
      
  2. habilite o sieve_extprogramsplug-in:

    • modifique \etc\dovecot\conf.d\90-sieve.confa seção do plugin com o seguinte:

      sieve_extensions = +vnd.dovecot.execute
      sieve_plugins = sieve_extprograms
      sieve_execute_bin_dir = /usr/lib/dovecot/sieve-execute
      
    • recarregar pombal:

      $ service dovecot restart
      
  3. crie um filtro de peneira (ou seja, em Roundcube vá para settings-> filters-> actions-> edit filter set):

    require ["vnd.dovecot.execute"];
    # rule:[mail processing]
    if true
    {
        execute :pipe "mail_processor.py";
    }
    

Agora, todas as mensagens entregues em qualquer caixa de correio com esse filtro de peneira serão canalizadas mail_processor.pypara ação.

Peneira Pigeonhole: Plug-in Extprogramspara referência

informação relacionada