Como posso disparar um script toda vez que um usuário em particular recebe um email?

3

Eu tenho um servidor de email (Linux) que consiste em postfix para receber email, amavisd-new para filtragem de conteúdo (usando clamav e SpamAssassin ) e dovecot para entrega e IMAP.

Gostaria de configurar as coisas para que um script seja disparado sempre que um email for entregue a uma determinada caixa de correio. O script não precisa necessariamente saber nada sobre o conteúdo ou os cabeçalhos da mensagem. Eu conheço pelo menos algumas opções:

  1. Use a filtragem interna de postfix . Configure uma verificação de cabeçalho para redirecionar todos os emails destinados a essa caixa de correio para o meu script, o que pode, então, repassá-lo para postfix . A desvantagem aqui é que tudo acontece antes da filtragem de amavis , então meu script será disparado mesmo para emails que acabam sendo bloqueados antes da entrega. Também pode haver penalidades de desempenho e risco de e-mails perdidos se eu não executar a passagem do e-mail de volta para postfix corretamente.

  2. Adicione meu script como um filtro de conteúdo a amavis . Isso pode ser uma melhoria no desempenho em comparação com o anterior, e apenas parece um lugar melhor para isso. Infelizmente ainda sofre de ser executado antes da decisão de ir / não ir foi tomada na mensagem. Além disso, não consegui encontrar a documentação amavis detalhando como isso deve ser feito, e os arquivos conf não são realmente conclusivos.

Parece que a etapa final de entrega dovecot seria o melhor lugar para receber apenas mensagens filtradas, mas não tenho certeza se há uma maneira de fazer isso funcionar.

Sugestões? Alguma coisa que eu estou negligenciando?

Editar: Esqueci de adicionar, gostaria de evitar soluções do tipo pesquisa (ver logs, script de cliente IMAP, etc.)

    
por glibdud 24.09.2015 / 01:54

2 respostas

3

Encontrei outra opção que pode ser uma solução boa o suficiente: seqüestrar a mensagem quando 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 pipe do Postfix passa o email da entrega final para o script acima, em vez de diretamente para dovecot-lda . O script verifica o destinatário (transmitido na linha de comando para que não precise examinar a mensagem) contra uma lista e dispara outro script se houver uma correspondência. Em seguida, ele envia a mensagem para dovecot-lda , que não deve ser capaz de dizer que não está obtendo diretamente do Postfix, e propaga o status de saída de volta para o processo pipe .

Funciona bem no teste inicial. Isso só me traz e-mails pós-filtrados, o que é o que eu estou procurando.

    
por 24.09.2015 / 03:17
1

Eu uso procmail como meu agente de entrega local. Isso 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 desejado, a entrega do email.

procmail tem recursos abrangentes para aplicar filtros a cabeçalhos, conteúdo ou ambos. Você pode usar qualquer programa como um filtro, portanto, ele deve ser capaz de acionar seu script para cada e-mail enviado ao usuário especificado.

    
por 24.09.2015 / 03:09