Como posso disparar um script sempre que um usuário específico recebe um email?

Como posso disparar um script sempre que um usuário específico recebe um email?

Eu tenho um servidor de e-mail (Linux) que consiste empostfixpara receber correspondência,amavisd-newpara filtragem de conteúdo (usando clamave SpamAssassin), edovecotpara 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:

  1. Usarpostfixfiltragem 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 arquivo postfix. A desvantagem aqui é que tudo acontece antes amavisda 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 volta postfixcorretamente.

  2. 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 a amavisdocumentação detalhando como isso realmente deveria ser feito, e os arquivos conf não são realmente conclusivos.

Parece que a etapa final dovecotde 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 postfixpara 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.pycomo 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 pipepassa 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 pipeprocesso.

Funciona bem nos testes iniciais. Isso me dá apenas e-mails pós-filtrados, que é o que procuro.

Responder2

Eu uso procmailcomo 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.

procmailpossui 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.

informação relacionada