
Tengo un servidor de correo (Linux) que consta depostfix
para recibir correo,amavisd-new
para el filtrado de contenidos (usando clamav
y SpamAssassin
), ydovecot
para 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:
Usar
postfix
filtrado 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 apostfix
. La desventaja aquí es que todo sucede antesamavis
del 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ónicopostfix
correctamente.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 laamavis
documentación que detalle cómo se supone que se debe hacer esto, y los archivos conf no son realmente concluyentes.
Parece que el dovecot
paso 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 postfix
a 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.py
lo 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 pipe
pasa 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 pipe
proceso.
Funciona bien en las pruebas iniciales. Esto solo me proporciona correos electrónicos post-filtrados, que es lo que busco.
Respuesta2
Utilizo procmail
como 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.
procmail
tiene 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.