
Gostaria de gerenciar todos os emails recebidos *@example.com
com 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 postfix
eapt-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.com
para 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 .forward
arquivos 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 .forward
método Sendmail ou descubra como fazer isso corretamente no Eximese. (Eu abortei porque estava demorando muito para vasculhar os documentos do Exim.) Háelspy
se você quiser fazer a varredura no tempo SMTP no estilo MILTER ...
Pós-fixo
Nossa, isso parece longo e complicado.
Enviar correio
Defina uma mailertable
entrada para encaminhar todos os e-mails do domínio (e .domain
dos subdomínios, se necessário) para um usuário local, aquijdoe
example.com local:jdoe
.example.com local:jdoe
e então configure um .forward
arquivo 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 process
forem 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 mailertable
o suporte esteja habilitado, confFORWARD_PATH
configurado, 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.
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:
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
habilite o
sieve_extprograms
plug-in:modifique
\etc\dovecot\conf.d\90-sieve.conf
a 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
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.py
para ação.
Peneira Pigeonhole: Plug-in Extprogramspara referência