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.