Resposta por e-mail no Outlook exclui tudo após uma lista numerada

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

  1. Pelo Outlook (desktop), responda a uma notificação. Escreva um parágrafo, depois uma lista numerada e, em seguida, outro parágrafo.
  2. 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:

  1. Primeiro
  2. 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.

Hmm, você poderia tentar atualizar seu site primeiro? Como sua versão não é a mais recente, isso pode ter sido corrigido ao longo do caminho.

Hmm. O status do Discourse no meu painel de administração diz que estou atualizado e executando a versão mais recente. Muito estranho.