Correo que llega
Un mensaje de bienvenida, enviado una sola vez la primera vez que se usa una cuenta, y un aviso a la persona con quien se ha compartido un documento.
Los dos necesitaron tres intentos. El aviso colgaba de un extremo que la aplicación nunca llama, luego salía después de la respuesta, de modo que la petición jamás abandonaba la función, y luego lo frenó una clave que faltaba de verdad en las primeras compilaciones. La entregabilidad pedía DMARC, no solo SPF y DKIM.
El correo de un producto es sobre todo algo de lo que desconfiar, así que conviene decir lo poco que hay aquí. Dos mensajes: una bienvenida, la primera vez que una cuenta se usa de verdad, y un aviso a la persona con quien una cuenta ha compartido un documento. Ni resúmenes, ni novedades del producto, ni nada de lo que haya que darse de baja.
Por qué no llegaban
Tres fallos, uno detrás de otro. El aviso estaba conectado primero a un extremo que la aplicación no llama nunca. Después se arregló para salir una vez enviada la respuesta, que es lo natural al escribirlo y lo equivocado en una función serverless, porque la plataforma puede congelar la instancia en el momento en que sale una respuesta, y una petición que aún no ha salido ya no sale. Se añadieron tres direcciones en un despliegue en servicio y el proveedor de correo no registró absolutamente nada: no un fallo, una ausencia.
Así que un envío forma ahora parte de la petición que lo provocó, y se espera a él, con un plazo de cuatro segundos para que un proveedor con un mal minuto no convierta un compartir en un compartir lento. El tercer fallo era más gris que los otros dos: la clave faltaba de verdad en las primeras compilaciones.
Por qué acababan en spam
SPF y DKIM estaban puestos desde el principio y nunca fueron el problema. Lo que faltaba era DMARC, el registro DNS que dice qué debe hacer un receptor con el correo que falla los otros dos, y a un dominio joven que manda correo automático sin él se le trata con dureza. Eso es DNS y no código, que es parte de por qué costó tres intentos encontrarlo.
Lo que el código sí puede hacer es no empeorarlo. Las dos partes MIME en lugar de solo texto, porque un correo automático de solo texto desde un dominio sin historial de envío es justo lo que más desconfianza da a un filtro. Un asunto que empieza por el nombre del documento y no por una dirección desnuda junto a un nombre de archivo entrecomillado, una pareja cuya forma los filtros conocen. Y un Reply-To que apunta a quien compartió, porque un mensaje que no se puede contestar se lee como maquinaria.
Lo que estos mensajes no son
Sin imágenes y sin píxel de seguimiento; la parte HTML son las mismas palabras que la parte de texto, compuestas por el conversor del propio producto. El nombre de un documento se imprime dentro de un fragmento de código, de modo que un archivo llamado [Confirm your account](https://elsewhere.example) llega como texto y no como enlace vivo en un mensaje que lleva nuestra firma. Un despliegue sin clave configurada no envía nada y no dice nada, y un compartir que funcionó nunca se comunica como fallido porque fallara el correo. Todo ello va en inglés sea cual sea tu idioma: se dirige a una dirección de la que no sabemos nada más.
Relacionado: compartir un documento como enlace y si un conversor en línea es seguro.