
Me gustaría administrar todo el correo electrónico entrante *@example.com
con un script de Python ejecutándose en mi servidor, que realizará varios trabajos.
Ya hice un registro DNS MX para
example.com
, dirigiéndolo a mi servidor:mx.example.com MX mailforwarder.example.com mailforwarder.example.com A 1.2.3.4
He realizado muchas pruebas y errores tanto con postfix como con exim, y nada funcionaba, así que los eliminé todos:
apt-get remove postfix
yapt-get remove exim4
, así que estoy listo para comenzar con una instalación nueva de uno de ellos (cuál permitiría el ¿La solución más corta para esta tarea específica?)
¿Cuáles son los pasos principales para dirigir todo el correo electrónico entrante *@example.com
a un script de Python?(incluido: decirle al MTA que acepte correos electrónicos provenientes de fuera del servidor, de todo Internet, etc.)
Respuesta1
procmail
se considera problemáticopor Philip Guenther (y posiblemente sea inútil en este caso, ya que .forward
los archivos o equivalentes pueden enviar los correos directamente a su programa, omitiendo la complejidad innecesaria de procmail
).
Resumen ejecutivo: eliminar el puerto procmail; El código no es seguro y no debe utilizarse como base para ningún trabajo posterior.
Como la gente sabrá, yo era el mantenedor principal de procmail desde finales de los años 1990 hasta 2001.
Por tanto, puede ser aconsejable alguna otra solución; esto depende del Agente de Transporte de Correo (MTA). Otra opción sería usar el MTA para entregarlo a un archivo local o IMAP y luego hacer que su programa analice ese archivo o IMAP. Esto tiene la ventaja de seguir aceptando correos electrónicos y guardarlos en algún lugar; ¿Qué sucede cuando su programa tiene errores o no se ejecuta? Un problema menor que durante la entrega de correo en vivo...
Exim
Probablemente copie el .forward
método Sendmail o descubra cómo hacerlo correctamente en Eximese. (Aborté porque me estaba tomando mucho tiempo revisar los documentos Exim).elspy
si desea realizar un escaneo en tiempo SMTP de manera MILTER...
Sufijo
Dios, eso parece largo y complicado.
Enviar correo
Configure una mailertable
entrada para reenviar todos los correos electrónicos del dominio (y .domain
de los subdominios, si es necesario) a un usuario local, aquíjdoe
example.com local:jdoe
.example.com local:jdoe
y luego configurar un .forward
archivo para que ese usuario ejecute el código necesario
$ cat ~jdoe/.forward
"|/etc/smrsh/process"
$
que podría ser tan simple como
$ cat /etc/smrsh/process
#!/bin/sh
cat >> /home/jdoe/allmails
$
porque los correos electrónicos se ingresan en la entrada estándar (esto podría ser malo si process
se ejecutan varias instancias de esto a la vez; presumiblemente su código real maneja tales condiciones de carrera o es idempotente... ¿verdad?). Este método también puede funcionar para cualquier otro MTA que copie la sintaxis de reenvío de Sendmail, suponiendo que pueda hacer que el MTA redirija todos los correos a un usuario en particular.
Esto supone que mailertable
el soporte está habilitado, confFORWARD_PATH
configurado, que Sendmail puede ejecutar el código (tenga smrsh(8)
en cuenta que algunos proveedores pueden cambiar el directorio sin actualizar la documentación (ejecutarlo strings /the/path/to/smrsh | fgrep /
puede ayudar)) y que algo como selinux tampoco está rompiendo las cosas.
Otra opción para Sendmail es utilizar un MILTER comoMIMEDefangy realizar cualquier lógica de negocios que sea necesaria allí. (Varios otros MTA admiten MILTER o tienen algo parecido).
Demonio del Protocolo simple de transferencia de correo (OpenBSD)
De una mirada asmtpd.conf(5)
(actualizado para cambios de OpenBSD 6.4)
action "mymda" mda "/path/to/your/command" user jdoe
match from any for domain example.com action "mymda"
Respuesta2
Esta parecía una pregunta bastante común... Encontré que ya estaba respondida, que es lo que sugeriría. Procmail es un agente de entrega local... queCreosignifica que algo ya recibió el correo de la red y lo entregó a procmail para su entrega local u otro filtrado. En este caso, postfix sería esa cosa. Habiendo ejecutado postfix en producción, es una herramienta sólida y muy flexible para el manejo de correo personalizado.
Respuesta3
Me gusta la pila de correo en buzón que utiliza Postfix y Dovecot. Una vez que los tenga instalados, puede hacer lo siguiente para ejecutar un script al recibir correo a direcciones específicas:
cree su script (es decir,
mail_processor.py
) en el/usr/lib/dovecot/sieve-execute/
directorio:#!/usr/bin/python3 from sys import stdin with open('/var/log/mail_processor.log', 'a') as logfile: for line in stdin: print(line.rstrip(), file=logfile)
asegúrese de que su script y sus archivos de destino tengan los permisos correctos:
$ chmod +rx /usr/lib/dovecot/sieve-execute/mail_processor.py $ chmod 0777 /var/log/mail_processor.log
habilitar el
sieve_extprograms
complemento:modifique
\etc\dovecot\conf.d\90-sieve.conf
la sección del complemento con lo siguiente:sieve_extensions = +vnd.dovecot.execute sieve_plugins = sieve_extprograms sieve_execute_bin_dir = /usr/lib/dovecot/sieve-execute
recargar palomar:
$ service dovecot restart
crear un filtro de tamiz (es decir, en Roundcube ir a
settings
->filters
->actions
->edit filter set
):require ["vnd.dovecot.execute"]; # rule:[mail processing] if true { execute :pipe "mail_processor.py"; }
Ahora todo el correo entregado a cualquier buzón con este filtro de tamiz será canalizado mail_processor.py
para tomar acción.
Pigeonhole Sieve: complemento de programas externospara referencia