
Eu tenho um servidor de e-mail (Linux) que consiste empostfix
para receber correspondência,amavisd-new
para filtragem de conteúdo (usando clamav
e SpamAssassin
), edovecot
para entrega e IMAP.
Gostaria de configurar as coisas para que um script seja acionado sempre que um email for entregue em uma caixa de correio específica. O script não precisa necessariamente saber nada sobre o conteúdo ou os cabeçalhos da mensagem. Conheço pelo menos algumas opções:
Usar
postfix
filtragem integrada. Configure uma verificação de cabeçalho para redirecionar quaisquer e-mails destinados a esta caixa de correio para o meu script, que poderá então passá-los de volta para o arquivopostfix
. A desvantagem aqui é que tudo acontece antesamavis
da filtragem do, então meu script será acionado mesmo para e-mails que acabam sendo bloqueados antes da entrega. Também pode haver penalidades de desempenho e risco de perda de e-mails se eu não executar a passagem do e-mail de voltapostfix
corretamente.Adicione meu script como filtro de conteúdo ao arquivo
amavis
. Isto pode ser uma melhoria no desempenho em comparação com o anterior e parece ser um lugar melhor para isso. Infelizmente, ele ainda sofre ao ser executado antes que a decisão de avançar/não avançar seja tomada na mensagem. Além disso, não consegui encontrar aamavis
documentação detalhando como isso realmente deveria ser feito, e os arquivos conf não são realmente conclusivos.
Parece que a etapa final dovecot
de entrega seria o melhor lugar para receber apenas mensagens filtradas, mas não tenho certeza se existe uma maneira de fazer isso funcionar.
Sugestões? Algo que estou negligenciando?
Editar:Esqueci de acrescentar que gostaria de evitar soluções do tipo polling (observação de logs, script de cliente IMAP, etc.)
Responder1
Encontrei outra opção que pode ser uma solução boa o suficiente: sequestrar a mensagem à medida que ela é passada de postfix
para dovecot
.
Para postfix
, altero as seguintes linhas em master.cf
:
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/dovecot-lda -d $(user)@$(domain)
Para:
dovecot unix - n n - - pipe
flags=DRhu user=vmail:mail argv=/scripts/emaildeliverycheck.py $(user)@$(domain)
Em seguida, crie /scripts/emaildeliverycheck.py
como o seguinte (Python 3.4):
#!/usr/bin/python3
from sys import argv, stdin, exit
from subprocess import Popen, check_call, CalledProcessError
# Define recipients that should trigger the script here
notifyusers = ('[email protected]',
'[email protected]')
recipient = argv[1]
if recipient in notifyusers:
# Run the script. Use Popen so that we don't have to wait for the
# script to finish
Popen(['/scripts/myscript.py', recipient])
try:
# Now pass the email to dovecot-lda. Use check_call because we *do*
# want to wait for it to finish
check_call(['/usr/lib/dovecot/dovecot-lda', '-d', recipient], stdin=stdin)
except CalledProcessError as error:
# Propagate any error codes back to Postfix
exit(error.returncode)
O processo do Postfix pipe
passa o e-mail para entrega final para o script acima, em vez de diretamente para dovecot-lda
. O script verifica o destinatário (passado na linha de comando, portanto não precisa olhar a mensagem) em uma lista e dispara outro script se houver uma correspondência. Em seguida, ele canaliza a mensagem para dovecot-lda
, que não deve ser capaz de dizer que não a está recebendo diretamente do Postfix, e propaga o status de saída de volta para o pipe
processo.
Funciona bem nos testes iniciais. Isso me dá apenas e-mails pós-filtrados, que é o que procuro.
Responder2
Eu uso procmail
como meu agente de entrega local. Isto permite uma filtragem extensiva usando regras aplicáveis ao usuário. Deveria ser possível configurar o postfix para usar o procmail para fazer a filtragem e, se desejar, entrega do email.
procmail
possui amplos recursos para aplicar filtros a cabeçalhos, conteúdo ou ambos. Você pode usar qualquer programa como filtro, portanto, você poderá acionar seu script para cada email enviado ao usuário especificado.