1 points par GN⁺ 2024-05-22 | 2 commentaires | Partager sur WhatsApp

Le mystère du point disparu dans le corps d’un e-mail

Un protocole simple de transfert de courrier qui ne l’est pas tant que ça

  • Tjaart
    • 20 février 2024

Apparition du problème

  • Un client a signalé que des points avaient disparu du corps d’un e-mail qui lui avait été envoyé.
  • En envoyant le même e-mail à d’autres clients, les points ne disparaissaient pas.

Souvenir du projet

  • Il y a environ 7 ans, une solution a été développée pour unifier les modèles de documents dans un système unique.
  • Le client utilisait des modèles Microsoft Word avec des espaces réservés insérés dans les documents.
  • Chaque fois qu’un employé envoyait un document par e-mail, il fallait remplacer ces espaces réservés par le contenu réel.

Problème de gestion des modèles

  • Il existait plusieurs versions des modèles, ce qui les rendait difficiles à gérer.
  • Certains modèles utilisaient d’anciennes conditions générales, d’anciens logos, d’anciennes polices, etc.
  • Une solution a été développée pour gérer tous les modèles de manière centralisée.

Mise en œuvre de la solution

  • Le client pouvait gérer de façon centralisée les modèles servant à générer des documents PDF, des SMS et le corps des e-mails.
  • Par exemple, il était possible de configurer un modèle de lettre de bienvenue à envoyer à un nouveau client.
  • Des modèles différents pouvaient être définis selon le canal d’envoi (e-mail, SMS ou courrier).

Reproduction du problème

  • Le problème de disparition des points ne se produisait que dans les e-mails envoyés à un client précis.
  • Le point était bien présent dans le code source du modèle.
  • Lors de la prévisualisation locale du corps de l’e-mail, le point apparaissait correctement.

Analyse de la cause

  • Lors de la génération du corps de l’e-mail, un code limitait la longueur de chaque ligne.
  • Lorsqu’une ligne dépassait cette longueur, une nouvelle ligne était créée et le reste du contenu y était déplacé.
  • Selon la spécification SMTP, lorsqu’une ligne commence par un point, un point supplémentaire est inséré, puis le serveur supprime le premier point.

Solution

  • Correction du code : lorsqu’une ligne commence par un point, insérer un point supplémentaire afin qu’un point reste après la suppression du premier par le serveur.
  • Les tests du code corrigé ont confirmé que les points ne disparaissaient plus.
  • Le problème a été résolu et le bug a également été signalé aux autres équipes.

Problème survenu ensuite

  • Quelques mois plus tard, une autre équipe n’ayant pas corrigé le même bug, des points ont disparu d’un e-mail important.
  • Certains clients ont reçu un e-mail indiquant un nouveau tarif mensuel de $2700 au lieu de $27.00.
  • Le problème a été résolu immédiatement après l’application d’un correctif.

L’avis de GN⁺

  1. Importance de la compréhension de la spécification SMTP : pour résoudre les problèmes pouvant survenir lors de l’envoi d’e-mails, il est important de bien comprendre la spécification SMTP.
  2. Complexité de la gestion des modèles : gérer plusieurs versions de modèles peut être complexe, et un système de gestion centralisée est nécessaire.
  3. Techniques de débogage : la capacité à reproduire le problème et à en analyser la cause est essentielle.
  4. Communication entre équipes : après avoir résolu un problème, il est important de partager l’information avec les autres équipes.
  5. Tests automatisés : il est recommandé d’introduire des tests automatisés pour éviter ce type de problème.

2 commentaires

 
surfindia 2024-05-22

On dirait qu’ils ont interprété « period » comme une durée et non comme un point dans le titre, haha.

 
GN⁺ 2024-05-22
Avis Hacker News

Résumé d’un recueil de commentaires Hacker News

  • La difficulté d’implémenter un client SMTP

    • Implémenter un client SMTP est difficile, et s’il est mal implémenté, des bugs peuvent facilement apparaître. La couche de template ne devrait pas avoir à se soucier de SMTP.
    • Beaucoup de gens n’apprennent pas le protocole de base via le terminal, ce qui provoque ce genre de problème. La règle qui consiste à terminer un message par un « point seul » est importante.
    • Beaucoup de programmeurs ne comprennent pas le concept d’échappement. Ils n’envisagent pas le cas d’envoyer un e-mail contenant un « point seul ».
  • L’histoire de la lettre de recommandation en Allemagne

    • En Allemagne, il est courant de recevoir une lettre de recommandation à la fin d’un emploi. Si la dernière phrase de la lettre ne se termine pas par un point, cela véhicule une signification négative.
    • Lorsqu’un avocat a examiné la lettre de recommandation, l’absence de point à la dernière phrase a posé problème.
  • Les tâches cron et les clients SMTP

    • Une tâche cron qui envoie des e-mails n’a pas besoin d’implémenter son propre client SMTP. Il suffit d’utiliser un programme comme mailutils.
    • Implémenter les interactions SMTP de base via des sockets est inefficace. Il faut une connexion TLS et une authentification.
    • cron dispose déjà d’une fonctionnalité d’envoi d’e-mails. On peut définir l’adresse e-mail avec la variable MAILTO.
  • Deux mauvaises habitudes

    • Il ne faut pas implémenter les standards à la va-vite. Il faut y accorder l’attention nécessaire ou utiliser une bibliothèque déjà prête.
    • Il ne faut pas vendorer les dépendances. Les bibliothèques doivent être mises à jour régulièrement. Remettre les mises à jour à plus tard peut entraîner de gros problèmes.
  • Nécessité du dot-stuffing

    • Le dot-stuffing est nécessaire dans SMTP et POP3. On peut se référer aux documents RFC associés.
  • Problème de pièce jointe MIME HTML

    • La phrase « We are happy to welcome you to our family. » ne dépasse pas la limite de ligne. Il s’agit peut-être d’une pièce jointe MIME HTML.
    • Si l’on découpe du HTML en lignes sans précaution, les balises peuvent être cassées.
  • Quand le premier caractère est un point

    • Si le premier caractère est un point et qu’il y a d’autres caractères ensuite, le premier caractère est supprimé. En effet, un point seul signifie la fin du message.
    • Il est difficile de comprendre pourquoi le point est supprimé. On pourrait stocker un octet pour vérifier le caractère suivant.
  • Notification de correctif de bug

    • Comme le code du client SMTP avait été repris d’un projet précédent, le bug a été signalé à une autre équipe.
    • Il est possible que l’autre équipe n’ait pas corrigé ce bug.
  • Expérience d’implémentation d’un serveur NNTP

    • En implémentant un serveur NNTP à partir des spécifications RFC, le problème du dot-stuffing devient immédiatement clair. C’est un protocole des années 80.