¿Cómo puedo ejecutar un script cada vez que un usuario en particular recibe un correo electrónico?

¿Cómo puedo ejecutar un script cada vez que un usuario en particular recibe un correo electrónico?

Tengo un servidor de correo (Linux) que consta depostfixpara recibir correo,amavisd-newpara el filtrado de contenidos (usando clamavy SpamAssassin), ydovecotpara entrega e IMAP.

Me gustaría configurar las cosas para que se active un script cada vez que se entregue un correo electrónico a un buzón de correo en particular. El script no necesariamente necesita saber nada sobre el contenido o los encabezados del mensaje. Conozco al menos un par de opciones:

  1. Usarpostfixfiltrado incorporado. Configure una verificación de encabezado para redirigir cualquier correo electrónico destinado a este buzón a mi script, que luego puede pasarlo nuevamente a postfix. La desventaja aquí es que todo sucede antes amavisdel filtrado, por lo que mi secuencia de comandos se activará incluso para los correos electrónicos que terminan bloqueados antes de la entrega. También puede haber penalizaciones de rendimiento y riesgo de perder correos electrónicos si no ejecuto el paso del correo electrónico postfixcorrectamente.

  2. Agregue mi script como filtro de contenido a amavis. Esto puede suponer una mejora en el rendimiento en comparación con el anterior y simplemente parece un mejor lugar para ello. Desafortunadamente, todavía sufre por ser ejecutado antes de que se haya tomado la decisión de ir/no ir en el mensaje. Además, no he podido encontrar la amavisdocumentación que detalle cómo se supone que se debe hacer esto, y los archivos conf no son realmente concluyentes.

Parece que el dovecotpaso de entrega final sería el mejor lugar para recibir solo correo filtrado, pero no estoy seguro de si hay una manera de hacer que eso funcione.

¿Sugerencias? ¿Algo que esté pasando por alto?

Editar:Olvidé agregar, me gustaría evitar soluciones de tipo sondeo (ver registros, script de cliente IMAP, etc.)

Respuesta1

Encontré otra opción que puede resultar una solución bastante buena: secuestrar el mensaje a medida que pasa de postfixa dovecot.

Para postfix, cambio las siguientes líneas en master.cf:

dovecot      unix   -        n      n       -       -   pipe
  flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/dovecot-lda -d $(user)@$(domain)

A:

dovecot      unix   -        n      n       -       -   pipe
  flags=DRhu user=vmail:mail argv=/scripts/emaildeliverycheck.py $(user)@$(domain)

Luego cree /scripts/emaildeliverycheck.pylo siguiente (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)

El proceso de Postfix pipepasa el correo electrónico para su entrega final al script anterior en lugar de hacerlo directamente a dovecot-lda. El script compara al destinatario (pasado en la línea de comando, por lo que no necesita mirar el mensaje en absoluto) con una lista y activa otro script si hay una coincidencia. Luego canaliza el mensaje a dovecot-lda, que no debería poder saber que no lo está recibiendo directamente de Postfix, y propaga el estado de salida nuevamente al pipeproceso.

Funciona bien en las pruebas iniciales. Esto solo me proporciona correos electrónicos post-filtrados, que es lo que busco.

Respuesta2

Utilizo procmailcomo mi agente de entrega local. Esto permite un filtrado exhaustivo utilizando reglas aplicables al usuario. Debería ser posible configurar postfix para usar procmail para realizar el filtrado y, si se desea, la entrega del correo electrónico.

procmailtiene amplias capacidades para aplicar filtros a encabezados, contenido o ambos. Puede utilizar cualquier programa como filtro, por lo que debería poder activar su secuencia de comandos para cada correo electrónico enviado al usuario especificado.

información relacionada