1 puntos por GN⁺ 2024-05-22 | 2 comentarios | Compartir por WhatsApp

El misterio de los puntos que desaparecían del cuerpo de un correo

El Protocolo Simple de Transferencia de Correo no es tan simple

  • Tjaart
    • 20 de febrero de 2024

Aparece el problema

  • Un cliente reportó que los puntos desaparecían del cuerpo de los correos enviados.
  • Al enviar el mismo correo a otros clientes, los puntos no desaparecían.

Recordando el proyecto

  • Hace unos 7 años, se desarrolló una solución para unificar las plantillas de documentos en un solo sistema.
  • El cliente usaba plantillas de Microsoft Word para insertar marcadores de posición en los documentos.
  • Cada vez que un empleado enviaba un documento por correo, había que reemplazar esos marcadores con el contenido real.

Problema de gestión de plantillas

  • Existían múltiples versiones de plantillas y era difícil administrarlas.
  • Algunas plantillas usaban términos y condiciones antiguos, logos, tipografías, etc.
  • Se desarrolló una solución para gestionar todas las plantillas de forma centralizada.

Implementación de la solución

  • El cliente podía administrar centralmente las plantillas para generar documentos PDF, mensajes de texto y cuerpos de correo.
  • Por ejemplo, podía configurar una plantilla de carta de bienvenida para enviar a nuevos clientes.
  • También se podían definir plantillas distintas según el medio de entrega: correo, mensaje de texto o correo postal.

Reproducción del problema

  • El problema de los puntos desaparecidos solo ocurría en correos enviados a cierto cliente.
  • El código fuente de la plantilla sí incluía los puntos.
  • Al previsualizar localmente el cuerpo del correo, los puntos aparecían correctamente.

Análisis de la causa

  • Había código que limitaba la longitud de cada línea al generar el cuerpo del correo.
  • Si una línea excedía esa longitud, se creaba una nueva línea y el resto del contenido se movía allí.
  • Según la especificación de SMTP, si una línea comienza con un punto, se inserta un punto adicional, y el servidor elimina el primero.

Solución

  • Se modificó el código: si una línea comenzaba con un punto, se insertaba un punto adicional para que, aunque el servidor eliminara uno, el punto siguiera presente.
  • Tras probar el código corregido, se confirmó que los puntos ya no desaparecían.
  • El problema se resolvió y también se notificó el bug a otros equipos.

Problema posterior

  • Meses después, otro equipo no corrigió el mismo bug y los puntos desaparecieron en correos importantes.
  • Algunos clientes recibieron correos donde la nueva tarifa mensual aparecía como $2700 en vez de $27.00.
  • Se aplicó un parche de inmediato y el problema quedó resuelto.

La opinión de GN⁺

  1. La importancia de entender la especificación de SMTP: para resolver problemas que pueden surgir al enviar correos, es importante comprender a fondo la especificación de SMTP.
  2. La complejidad de gestionar plantillas: administrar múltiples versiones de plantillas puede ser complicado, y hace falta un sistema de gestión centralizada.
  3. Técnicas de depuración: es importante saber reproducir un problema y analizar su causa.
  4. Comunicación entre equipos: después de resolver el problema, es importante compartir la información con otros equipos.
  5. Pruebas automatizadas: conviene introducir pruebas automatizadas para prevenir este tipo de problemas.

2 comentarios

 
surfindia 2024-05-22

Parece que en el título interpretaron period como período y no como punto final, jaja.

 
GN⁺ 2024-05-22
Comentarios de Hacker News

Resumen de comentarios de Hacker News

  • La dificultad de implementar un cliente SMTP

    • Implementar un cliente SMTP es difícil y, si no se hace correctamente, es fácil que aparezcan errores. La capa de plantillas no debería tener que preocuparse por SMTP.
    • Muchos no aprenden el protocolo básico a través de la terminal, y por eso surgen este tipo de problemas. La regla de terminar el mensaje con un "punto único" es importante.
    • Muchos programadores no entienden el concepto de escape. No consideran el caso de enviar un correo que incluya un "punto único".
  • La historia de las cartas de recomendación en Alemania

    • En Alemania es común recibir una carta de recomendación al terminar una relación laboral. Si la última oración de la carta no tiene punto final, implica una connotación negativa.
    • Cuando un abogado revisó la carta de recomendación, surgió un problema porque a la última oración le faltaba el punto final.
  • Cron jobs y clientes SMTP

    • Un cron job que envía correos no necesita implementar su propio cliente SMTP. Se puede usar un programa como mailutils.
    • Implementar interacciones básicas de SMTP directamente sobre sockets es ineficiente. Se necesita conexión TLS y autenticación.
    • Cron ya tiene una función para enviar correo. Se puede configurar una dirección usando la variable MAILTO.
  • Dos malos hábitos

    • No hay que implementar estándares a medias. Hay que poner la atención necesaria o usar bibliotecas ya preparadas.
    • No hay que vendorizar dependencias. Las bibliotecas deben actualizarse con regularidad. Posponer actualizaciones puede causar problemas graves.
  • Necesidad de dot-stuffing

    • SMTP y POP3 requieren dot-stuffing. Se pueden consultar los RFC relacionados.
  • Problema con adjuntos MIME HTML

    • La frase "We are happy to welcome you to our family." no supera el límite de línea. Podría tratarse de un adjunto MIME HTML.
    • Si se divide HTML en líneas sin cuidado, las etiquetas pueden romperse.
  • Cuando el primer carácter es un punto

    • Si el primer carácter es un punto y hay más caracteres después, se elimina el primer punto. Esto se debe a que un punto único significa el final del correo.
    • Es difícil entender por qué se elimina el punto. Se podría guardar un byte para comprobar el siguiente carácter.
  • Aviso de parche de bug

    • Como el código del cliente SMTP fue tomado de un proyecto anterior, se le informó del bug a otro equipo.
    • Es posible que el otro equipo no haya parcheado este bug.
  • Experiencia implementando un servidor NNTP

    • Al implementar un servidor NNTP basándose en la especificación RFC, el problema de dot-stuffing se entendió de inmediato. Es un protocolo de los años 80.