1 pontos por GN⁺ 2024-05-22 | 2 comentários | Compartilhar no WhatsApp

O mistério dos pontos finais que sumiram no corpo do e-mail

O Protocolo Simples de Transferência de Mail não é tão simples

  • Tjaart
    • 20 de fevereiro de 2024

Surgimento do problema

  • Um cliente relatou que os pontos finais haviam desaparecido do corpo do e-mail enviado a ele.
  • Quando o mesmo e-mail era enviado a outros clientes, os pontos finais não desapareciam.

Relembrando o projeto

  • Cerca de 7 anos atrás, foi desenvolvida uma solução para unificar templates de documentos em um único sistema.
  • O cliente usava templates do Microsoft Word para inserir marcadores de posição nos documentos.
  • Sempre que um funcionário enviava um documento por e-mail, era preciso substituir os marcadores pelo conteúdo real.

Problema de gerenciamento de templates

  • Existiam várias versões de templates, o que dificultava a gestão.
  • Alguns templates usavam termos e condições antigos, logos antigos, fontes antigas etc.
  • Foi desenvolvida uma solução para gerenciar todos os templates de forma centralizada.

Implementação da solução

  • O cliente podia gerenciar centralmente os templates para gerar documentos em PDF, mensagens de texto e corpos de e-mail.
  • Por exemplo, era possível configurar um template de carta de boas-vindas para novos clientes.
  • Também era possível configurar templates diferentes para cada meio de entrega (e-mail, SMS e correio).

Reprodução do problema

  • O problema dos pontos finais desaparecendo ocorria apenas em e-mails enviados a determinados clientes.
  • O código-fonte do template continha os pontos finais.
  • Ao visualizar a prévia do corpo do e-mail no ambiente local, os pontos finais apareciam.

Análise da causa

  • Havia um código que limitava o comprimento de cada linha ao gerar o corpo do e-mail.
  • Quando uma linha ultrapassava o limite, era criada uma nova linha e o restante do conteúdo era movido para ela.
  • De acordo com a especificação do SMTP, quando uma linha começa com um ponto, um ponto extra deve ser inserido, e o servidor remove o primeiro ponto.

Solução

  • Correção no código: quando uma linha começava com um ponto, era inserido um ponto extra para que, mesmo após o servidor remover um deles, ainda restasse um ponto.
  • Depois de testar o código corrigido, foi confirmado que os pontos finais não desapareciam mais.
  • O problema foi resolvido e o bug foi comunicado a outras equipes.

Problema posterior

  • Alguns meses depois, outra equipe não corrigiu o mesmo bug, e pontos finais desapareceram em e-mails importantes.
  • Alguns clientes receberam e-mails em que a nova cobrança mensal aparecia como $2700 em vez de $27.00.
  • O problema foi resolvido imediatamente após a aplicação de um patch no código.

A opinião do GN⁺

  1. Importância de entender a especificação do SMTP: para resolver problemas que podem ocorrer no envio de e-mails, é importante compreender bem a especificação do SMTP.
  2. Complexidade do gerenciamento de templates: administrar várias versões de templates pode ser complexo, e um sistema centralizado é necessário.
  3. Técnicas de depuração: é importante saber reproduzir o problema e analisar sua causa.
  4. Comunicação entre equipes: depois de resolver o problema, é importante compartilhar as informações com outras equipes.
  5. Testes automatizados: é recomendável adotar testes automatizados para evitar problemas desse tipo.

2 comentários

 
surfindia 2024-05-22

Parece que no título interpretaram period como período, e não como ponto final haha

 
GN⁺ 2024-05-22
Comentários do Hacker News

Resumo dos comentários do Hacker News

  • A dificuldade de implementar um cliente SMTP

    • Implementar um cliente SMTP é difícil e, se não for feito corretamente, é fácil surgirem bugs. A camada de template não deveria precisar se preocupar com SMTP.
    • Muitos acabam tendo esse tipo de problema porque não aprendem o protocolo básico pelo terminal. A regra de encerrar a mensagem com um "ponto isolado" é importante.
    • Muitos programadores não entendem o conceito de escaping. Não consideram o caso de enviar um e-mail que contenha um "ponto isolado".
  • A história da carta de recomendação na Alemanha

    • Na Alemanha, é comum receber uma carta de recomendação ao encerrar um vínculo empregatício. Se a última frase da carta não tiver ponto final, isso carrega um sentido negativo.
    • Quando um advogado revisou a carta de recomendação, houve problema porque faltava o ponto final na última frase.
  • Cron jobs e clientes SMTP

    • Um cron job que envia e-mail não precisa implementar seu próprio cliente SMTP. Dá para usar programas como o mailutils.
    • Implementar a interação básica de SMTP por socket é ineficiente. É preciso conexão TLS e autenticação.
    • O cron já tem funcionalidade para enviar e-mails. É possível definir o endereço usando a variável MAILTO.
  • Dois maus hábitos

    • Não se deve implementar padrões de qualquer jeito. É preciso dar a devida atenção ou usar bibliotecas prontas.
    • Não se deve vendorizar dependências. Bibliotecas precisam ser atualizadas regularmente. Adiar atualizações pode causar grandes problemas.
  • Necessidade de dot-stuffing

    • SMTP e POP3 precisam de dot-stuffing. É possível consultar os RFCs relacionados.
  • Problema com anexo MIME em HTML

    • A frase "We are happy to welcome you to our family." não atinge o limite de linha. Pode ser um anexo MIME em HTML.
    • Se o HTML for quebrado em linhas sem cuidado, as tags podem se romper.
  • Quando o primeiro caractere é um ponto

    • Se o primeiro caractere for um ponto e houver outros caracteres depois, o primeiro ponto é removido. Isso acontece porque um ponto isolado indica o fim do e-mail.
    • É difícil entender por que o ponto é removido. Seria possível guardar um byte para verificar o próximo caractere.
  • Aviso sobre correção de bug

    • Como o código do cliente SMTP foi trazido de um projeto anterior, o bug foi comunicado a outra equipe.
    • É possível que a outra equipe não tenha corrigido esse bug.
  • Experiência implementando um servidor NNTP

    • Ao implementar um servidor NNTP com base na especificação RFC, o problema de dot-stuffing ficou claro imediatamente. É um protocolo dos anos 80.