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
- Da Outlook (desktop), rispondi a una notifica. Scrivi un paragrafo, poi una lista numerata, poi un altro paragrafo.
- 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:
- Primo
- 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.