La risposta via email da Outlook elimina tutto ciò che segue un elenco numerato

Self-hosted, 2026.1.5 (commit 2727e4d). Gestiamo una comunità in modalità mailing-list e riceviamo le risposte via email.

Un membro ha risposto da Outlook con un post piuttosto lungo, e la copia apparsa sul sito — e rimandata alla lista — è stata troncata a metà. Tutto ciò che seguiva la prima lista numerata è semplicemente scomparso. Nessun errore, nulla nei log, il post si è semplicemente interrotto a metà frase.

Ciò che mi ha sorpreso inizialmente: le liste con punti elenco presenti più indietro nella stessa email erano arrivate correttamente. Solo la lista numerata è stata tagliata, insieme a tutto ciò che seguiva.

Il problema risiede in extract_from_word in lib/email/receiver.rb. Per le email di Outlook/Word, considera il primo figlio di .WordSection1 che non sia un <p> o un <ul> come l’inizio di una firma o di un messaggio inoltrato, e lo rimuove insieme a tutti gli elementi fratelli successivi:

elided =
doc.css(
“.WordSection1 > :not(p):not(ul):first-of-type, .WordSection1 > :not(p):not(ul):first-of-type ~ *”,
).remove

Outlook rende le liste numerate come <ol>, e il selettore non esclude <ol>. Quindi la lista numerata è il primo elemento “non p, non ul”, e il ricevitore tronca il messaggio proprio lì. Le liste con punti elenco (<ul>) sono escluse, ecco perché queste sopravvivono mentre quella numerata no.

Riproduzione

  1. Da Outlook (desktop), rispondi a una notifica. Scrivi un paragrafo, poi una lista numerata, poi un altro paragrafo.
  2. Il post creato conserva il testo fino alla lista numerata e scarta la lista e tutto ciò che segue.

Corpo HTML minimo che lo innesca (facile da inserire in uno spec del ricevitore):

Paragrafo introduttivo.

Passaggi:

  1. Primo
  2. Secondo

Anche questo paragrafo finale scompare.

Otterrai solo i due paragrafi introduttivi.

Il problema è ancora presente su main — il selettore non è cambiato. Ho cercato nella categoria bug e non ho trovato questo problema già segnalato.

Correzione suggerita

Trattare <ol> allo stesso modo di <ul>, poiché una lista numerata è contenuto, non una firma:

“.WordSection1 > :not(p):not(ul):not(ol):first-of-type, .WordSection1 > :not(p):not(ul):not(ol):first-of-type ~ *”

Questo mantiene la lista e continua a elidere le vere firme/marchi di inoltramento (tabelle, div, hr, immagini). Sono felice di aprire una PR con un’email di test e uno spec che fallisce, se può essere utile.

Mmm, potresti provare a aggiornare prima il tuo sito? Dato che la tua versione non è l’ultima, è possibile che il problema sia stato risolto nel frattempo.

Mmm. Lo stato di Discourse nel mio pannello di amministrazione indica che sono aggiornato e che sto utilizzando l’ultima versione. Davvero strano.