"Nullmailer", "Return-Path" y GMail
En Generar un email diario a partir de un feed RSS (Slashdot), Mejoras a la hora de generar un email diario a partir de un feed RSS (Slashdot) y Los peligros de volcar a "pickle" cualquier cosa describo un programa para enviar por email las novedades diarias de un feed RSS.
Hace un tiempo modifiqué el programa para enviar los emails a varias direcciones de correo electrónico, no solo a mi cuenta. Todo ha ido bien hasta recientemente que añadí una dirección de GMail a la lista de destinatarios. GMail me rechazaba los mensajes por spam, sin un motivo claro a solucionar.
Tras dedicar unos ratos de diagnóstico y experimentos, he llegado a las siguientes conclusiones:
-
El remitente de mis emails era root@P2Ppriv.jcea.es. Ese dominio no existe. No es sorprendente que GMail no aceptase mis mensajes de las novedades diarias del feed RSS.
No había tenido problemas hasta ese momento porque todos los destinatarios de las novedades diarias del feed RSS de Slashdot eran usuarios locales de mi propio servidor de correo electrónico.
-
Incluso poniendo un dominio remitente que exista en la cabecera From, nullmailer estaba usando un envelope SMTP con el mismo dominio inválido. Leyendo la documentación de nullmailer, en concreto el componente nullmailer-inject, podemos leer lo siguiente:
-f sender Set the envelope sender address to sender.
Esto es esperanzador, pero no estamos usando nullmailer directamente para inyectar los mensajes en el sistema de correo, sino el comando estándar mail, que no tiene un parámetro para controlar el envelope SMTP.
Revisando otra vez el manual de nullmailer-inject, vemos algo interesante:
If the Return-Path header field is present and contains a single address, its contents will be used to set the envelope sender address.
Vaya, podemos utilizar la cabecera Return-Path para controlar el envelope SMTP utilizado por nullmailer.
Por tanto el parche es sencillo:
msg = MIMEText(html, 'html') msg['Subject'] = f'Feed Slashdot {time.strftime("%Y-%m-%d", ts_max)}' + msg['From'] = 'slashdot-sender@jcea.es' msg['To'] = addr msg['Date'] = email.utils.formatdate() msg['List-Id'] = 'Notificaciones Slashdot' msg['Message-Id'] = email.utils.make_msgid(domain='P2Ppriv') + # Esto es para controlar el "sender" del envelope que pone "nullmailer". + # Ver "man nullmailer-inject". + msg['Return-Path'] = 'slashdot-sender@jcea.es' + msg = msg.as_bytes()
Esta modificacion utiliza una cabecera From para indicar una dirección de correo electrónico que sí exista (en concreto, su dominio) y una cabecera Return-Path para controlar el envelope SMTP y que salga también con un dominio correcto.
Con esto GMail está satisfecho aceptando mis mensajes y tengo amigos felices con su dosis diaria de noticias curadas.