Auto-hospedado, 2026.1.5 (commit 2727e4d). Operamos uma comunidade no modo de lista de discussão e recebemos respostas por e-mail.
Um membro respondeu pelo Outlook com uma mensagem bastante longa, e a cópia que apareceu no site — e foi reenviada para a lista — foi cortada no meio. Tudo a partir da primeira lista numerada em diante simplesmente desapareceu. Nenhum erro, nada nos logs, a mensagem simplesmente terminou no meio de uma frase.
O que me chamou a atenção inicialmente: as listas com marcadores (bullet points) no início do mesmo e-mail chegaram corretamente. Apenas a lista numerada foi cortada, junto com tudo que vinha depois.
O problema está em extract_from_word em lib/email/receiver.rb. Para e-mails do Outlook/Word, ele trata o primeiro filho de .WordSection1 que não seja <p> ou <ul> como o início de uma assinatura ou mensagem encaminhada, e o remove junto com todos os elementos irmãos subsequentes:
elided =
doc.css(
“.WordSection1 > :not(p):not(ul):first-of-type, .WordSection1 > :not(p):not(ul):first-of-type ~ *”,
).remove
O Outlook renderiza listas numeradas como <ol>, e o seletor não exclui <ol>. Portanto, a lista numerada é o primeiro elemento “não <p>, não <ul>”, e o receptor corta a mensagem exatamente ali. Listas com marcadores (<ul>) são excluídas, o que explica por que elas são preservadas e a lista numerada não.
Reprodução
- Pelo Outlook (desktop), responda a uma notificação. Escreva um parágrafo, depois uma lista numerada e, em seguida, outro parágrafo.
- A publicação criada mantém o texto até a lista numerada e remove a lista e tudo abaixo dela.
Corpo HTML mínimo que aciona o problema (fácil de inserir em um teste de receptor):
Parágrafo introdutório.
Passos:
- Primeiro
- Segundo
Este parágrafo final também desaparece.
Você recebe apenas os dois parágrafos introdutórios.
Ainda presente na branch principal — o seletor não mudou. Pesquisei na categoria de bugs primeiro e não encontrei esse problema já reportado.
Correção sugerida
Tratar <ol> da mesma forma que <ul>, já que uma lista numerada é conteúdo, não uma assinatura:
“.WordSection1 > :not(p):not(ul):not(ol):first-of-type, .WordSection1 > :not(p):not(ul):not(ol):first-of-type ~ *”
Isso preserva a lista e ainda remove as marcas reais de assinatura/encaminhamento (tabelas, divs, hr, imagens). Fico feliz em abrir um PR com um e-mail de teste e um teste falhando, se isso for útil.