Responder por correo desde Outlook elimina todo lo que sigue a una lista numerada

Autoalojado, 2026.1.5 (commit 2727e4d). Operamos una comunidad en modo lista de correo y recibimos las respuestas por email.

Un miembro respondió desde Outlook con un mensaje bastante largo, y la copia que apareció en el sitio —y que se reenvió a la lista— se cortó a mitad de camino. Todo lo que venía después de su primera lista numerada simplemente había desaparecido. Sin errores, nada en los registros, el mensaje simplemente terminó a mitad de frase.

Lo que me llamó la atención al principio: las listas con viñetas anteriores en el mismo email llegaron bien. Solo la lista numerada se cortó, junto con todo lo que venía después.

El problema está en extract_from_word en lib/email/receiver.rb. Para correos de Outlook/Word, trata al primer hijo de .WordSection1 que no sea <p> o <ul> como el inicio de una firma o mensaje reenviado, y lo elimina junto con todos los siguientes elementos hermanos:

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

Outlook renderiza las listas numeradas como <ol>, y el selector no excluye ol. Por lo tanto, la lista numerada es el primer elemento “no p, no ul”, y el receptor corta el mensaje justo ahí. Las listas con viñetas (<ul>) están excluidas, por lo que esas sí llegan, pero la numerada no.

Reproducción

  1. Desde Outlook (escritorio), responde a una notificación. Escribe un párrafo, luego una lista numerada y luego otro párrafo.
  2. El mensaje creado conserva el texto hasta la lista numerada y descarta la lista y todo lo que viene después.

Cuerpo HTML mínimo que lo provoca (fácil de incluir en una prueba del receptor):

<div class=WordSection1>
  <p class=MsoNormal>Párrafo introductorio.</p>
  <p class=MsoNormal>Pasos:</p>
  <ol><li>Primero</li><li>Segundo</li></ol>
  <p class=MsoNormal>Este párrafo final también desaparece.</p>
</div>

Solo recibirás los dos párrafos introductorios.

Sigue presente en main; el selector no ha cambiado. Busqué primero en la categoría de errores y no encontré que este ya hubiera sido reportado.

Corrección sugerida

Tratar <ol> igual que <ul>, ya que una lista numerada es contenido, no una firma:

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

Esto conserva la lista y sigue eliminando las marcas reales de firma/reenvío (tablas, divs, hr, imágenes). Estaré encantado de abrir una PR con un email de prueba y una prueba fallida si eso ayuda.

Hmm, ¿podrías intentar actualizar tu sitio primero? Dado que tu versión no es la más reciente, es posible que esto se haya corregido en alguna de las actualizaciones intermedias.

Mmm. El estado de Discourse en mi panel de administración indica que estoy actualizado y ejecutando la última versión. Es realmente extraño.