Redirigir todos los correos electrónicos entrantes a un script de Python

Redirigir todos los correos electrónicos entrantes a un script de Python

Me gustaría administrar todo el correo electrónico entrante *@example.comcon 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 postfixy apt-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.coma un script de Python?(incluido: decirle al MTA que acepte correos electrónicos provenientes de fuera del servidor, de todo Internet, etc.)

Respuesta1

procmailse considera problemáticopor Philip Guenther (y posiblemente sea inútil en este caso, ya que .forwardlos 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 .forwardmétodo Sendmail o descubra cómo hacerlo correctamente en Eximese. (Aborté porque me estaba tomando mucho tiempo revisar los documentos Exim).elspysi desea realizar un escaneo en tiempo SMTP de manera MILTER...

Sufijo

https://serverfault.com/questions/258469/how-to-configure-postfix-to-pipe-all-incoming-email-to-a-script#258491

Dios, eso parece largo y complicado.

Enviar correo

Configure una mailertableentrada para reenviar todos los correos electrónicos del dominio (y .domainde los subdominios, si es necesario) a un usuario local, aquíjdoe

example.com     local:jdoe
.example.com    local:jdoe

y luego configurar un .forwardarchivo 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 processse 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 mailertableel soporte está habilitado, confFORWARD_PATHconfigurado, 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.

https://serverfault.com/questions/258469/how-to-configure-postfix-to-pipe-all-incoming-email-to-a-script#258491

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:

  1. 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
      
  2. habilitar el sieve_extprogramscomplemento:

    • modifique \etc\dovecot\conf.d\90-sieve.confla 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
      
  3. 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.pypara tomar acción.

Pigeonhole Sieve: complemento de programas externospara referencia

información relacionada