Quieres guardar una newsletter en tus notas, citar un aviso de un proveedor en un documento o pasar un hilo de correo a un LLM como contexto. Sea cual sea el motivo, al abrir el código fuente de un correo HTML te encuentras con un marcado sucio de una forma que las páginas web normales no lo son: tablas de maquetación anidadas en varios niveles, un atributo style en cada elemento e imágenes de rastreo invisibles mezcladas en el cuerpo. Esta guía muestra, con mediciones, cómo el mismo correo se convierte de forma completamente distinta según de dónde copies — y después recorre cómo extraer el HTML desde Gmail, Outlook y archivos .eml, y la limpieza posterior.
Decide qué necesitas conservar — eso elige la ruta
Empieza por el resultado, no por la herramienta. Lo que quieras conservar determina el camino más corto.
- Solo el cuerpo, de unos pocos correos abiertos — la conversión en el navegador es la ruta más corta. Copia el HTML del bloque de contenido y pégalo en HTML a Markdown. Gratis, sin registro, y nada de lo que pegas se envía a ningún sitio
- Cabeceras From / Subject / fecha, cadenas de respuestas citadas o la lista de adjuntos — o decenas de archivos .eml — usa una CLI que lea .eml directamente (la familia eml2md, más abajo)
- Un pipeline de ingesta recurrente — usa el módulo
emailde Python para elegir la parte MIME correcta y conviértela después
Dos advertencias antes de empezar. Primera: los conversores en el navegador trabajan sobre texto HTML extraído, no sobre archivos .eml. Un .eml es un contenedor MIME, no un documento HTML, así que pegarlo no funcionará. Segunda: la mayoría de los correos son multipart/alternative y ya llevan una versión text/plain junto a la HTML — si el texto plano te basta, quizá no necesites convertir nada. Para elegir formato al alimentar un LLM, consulta Markdown vs HTML para LLMs.
Medido: de dónde copias lo cambia todo
Construimos un correo de muestra representativo con estructura de newsletter (una pieza hecha a mano, no estadísticas de envíos reales) y lo pasamos por Turndown 7.2.4 con la configuración exacta que usa el conversor de FormatArc. Medido el 2026-07-17; el script de reproducción, las muestras y los datos en bruto están en el repositorio, en scripts/benchmarks/html-email-to-markdown/. Todos los números siguientes salen de esa ejecución.
Pegar el código completo lo colapsa en una tabla de 12 columnas
El código completo de la muestra ocupa 6,491 bytes. Dentro hay 8 elementos <table> (anidados, todos de maquetación), 33 atributos style, 3 comentarios condicionales MSO, un píxel de rastreo de 1x1 y 4 enlaces de redirección para medir clics.
Si lo conviertes tal cual, la salida colapsa en una tabla de 12 columnas (10 filas contando el separador). Las filas de todas las tablas anidadas se aplanan en una sola tabla, así que las mismas frases aparecen duplicadas en varias celdas — inservible como tabla e inservible como texto. Además, el texto del <title> y los 380 bytes de CSS del bloque <style> se filtran al principio de la salida como texto plano.
La forma concreta en que colapsa la tabla viene de la regla propia de FormatArc, que reúne todas las filas de una <table> en una única tabla de tuberías. Funciona bien con una tabla de datos normal y fatal con tablas de maquetación anidadas. Pero uses la herramienta que uses, convertir un correo completo con tablas de maquetación dentro nunca acaba bien.
Pegar solo el bloque de contenido da 477 caracteres de Markdown limpio
Toma el mismo correo y convierte solo el bloque de contenido (el HTML del elemento que envuelve el cuerpo, 1,086 bytes) y el resultado cambia por completo. La salida son 477 caracteres de Markdown utilizable tal cual: el titular se vuelve #, los párrafos siguen siendo párrafos, los enlaces siguen siendo enlaces. Los 8 atributos style desaparecen.
Sobrevive una cosa: la URL de redirección de rastreo se mantiene como destino del enlace. Eso es tarea de posprocesado (más abajo). La conclusión es simple — no pegues el código completo; pega el bloque de contenido.
Por qué el HTML de correo está tan sucio
El HTML de correo se diferencia del HTML web por razones concretas.
- La maquetación se hace con tablas anidadas porque los clientes de correo soportan solo una parte limitada de CSS. El Outlook clásico de Windows, por ejemplo, renderiza el correo HTML con el motor HTML de Microsoft Word, como documenta oficialmente MicrosoftSe abre en una pestaña nueva — y la lista de propiedades no soportadas de ese documento incluye
float,positionymax-width. Las tablas son la única herramienta de maquetación que queda - Los comentarios condicionales MSO (
<!--[if mso]>) sirven marcado alternativo solo a Outlook. Los conversores los tratan como comentarios HTML, así que desaparecen de la salida - Como muchos clientes ignoran las hojas de estilo externas, cada decisión visual va incrustada como atributo style en el propio elemento
- El rastreo de apertura añade una imagen de 1x1, y el rastreo de clics envuelve cada enlace en una URL de redirección (algo como
https://click.…/track?dest=...)
Extraer el HTML de tu cliente de correo
Este paso decide si la conversión funciona. Cliente por cliente:
La forma fiable: copiar el bloque de contenido con las herramientas de desarrollo
Funciona en Gmail y en cualquier otro webmail, y corresponde al caso "solo el bloque de contenido" de nuestras mediciones.
- Abre el correo, haz clic derecho sobre el texto del cuerpo y elige Inspeccionar.
- En las herramientas de desarrollo, sube hasta el elemento que envuelve todo el cuerpo (con todos sus párrafos y titulares dentro).
- Haz clic derecho sobre él y elige Copiar, luego Copiar outerHTML.
Ya tienes en el portapapeles el HTML del cuerpo, decodificado y sin la interfaz del buzón alrededor.
La trampa de "Mostrar original": quoted-printable
"Mostrar original" en Gmail (y la vista de código en Thunderbird) muestra el mensaje MIME completo. La parte HTML suele venir codificada como Content-Transfer-Encoding: quoted-printable, así que copiarla te da HTML roto:
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
<td style=3D"padding:24px 32px 12px 32px; font-family:Arial, Helvetica, san=
s-serif;">
=3D es la forma codificada de =, y un = suelto al final de línea es un salto de línea blando que se une al decodificar. Las reglas de la Sección 6.7 del RFC 2045Se abre en una pestaña nueva van más allá de =3D, así que un buscar-y-reemplazar no restaurará el HTML correctamente. La decodificación pertenece al nivel de la parte MIME — si acabas en el código en bruto, cambia a la ruta CLI o Python.
Outlook, Apple Mail, Thunderbird
- El Outlook clásico de Windows puede mostrar el código del mensaje desde el menú contextual, que abre HTML ya decodificado en un editor. Copiar desde ahí evita por completo el problema del quoted-printable
- Apple Mail y Thunderbird pueden guardar cualquier mensaje como archivo .eml (arrástralo fuera o usa guardar como). Como .eml es un contenedor MIME, pasárselo a la CLI de la siguiente sección es más rápido y seguro que buscar la parte HTML en un editor de texto
Convertir con FormatArc — en el navegador, sin subir nada
Con el HTML del bloque de contenido en la mano, la conversión son tres pasos.
- Abre HTML a Markdown.
- Pega el HTML copiado a la izquierda.
- Pulsa el botón de convertir y el Markdown aparece a la derecha.


La conversión se ejecuta por completo en tu navegador como JavaScript; nada de lo que pegas se transmite. Para correo que no pondrías en el servidor de un tercero — correspondencia con clientes, avisos internos — esta es la diferencia práctica frente a los conversores basados en subida. El razonamiento está en ¿son seguros los conversores online?. Para el manejo básico de la herramienta y la tabla de equivalencias HTML a Markdown, consulta la guía de HTML a Markdown; para los patrones generales de limpieza al pegar desde Word o páginas web, mira pegar HTML como Markdown. Este artículo se centra en lo específico del correo.
Lista de limpieza tras la conversión
Incluso una conversión limpia del bloque de contenido deja residuos propios del correo en el Markdown. Revisa estos cinco puntos antes de archivarlo o publicarlo.
- Restaura los enlaces rastreados. Las URLs de redirección tipo
https://click.example.com/track?dest=https%3A%2F%2F...deben reescribirse al destino real decodificando el parámetrodest=(o similar) — o elimina el enlace. Evita "comprobar" las URLs abriéndolas en bloque: eso dispara el rastreo de apertura y clics que intentas eliminar - Borra los restos de píxeles de rastreo, como referencias de imagen con alt vacío del tipo
 - Gestiona las imágenes
cid:. Una referencia comoapunta a una imagen adjunta dentro del mensaje (multipart/related) y no se resuelve fuera del correo. Si necesitas la imagen, expórtala del .eml y sustituye la referencia - Barre los espacios y líneas en blanco sobrantes que dejan los espaciadores
- Decide cuánto conservar de la firma, el pie legal, el bloque de baja y la cadena de respuestas citadas
Convertir .eml por lotes — CLI y Python
Cuando tienes muchos archivos .eml, o quieres conservar las cabeceras, delega en herramientas que entienden MIME.
En la CLI, eml-to-mdSe abre en una pestaña nueva (instalable con pip) genera Markdown con las cabeceras incluidas y se presenta para "dar contexto a agentes de IA sin darles acceso a todo tu correo". También existe eml2mdSe abre en una pestaña nueva, escrito en Rust.
pip install eml-to-md
eml2md message.eml # un mensaje
eml2md *.eml -o converted/ # una carpeta entera
Para un pipeline en Python, usa el módulo emailSe abre en una pestaña nueva de la biblioteca estándar para elegir la parte y markdownifySe abre en una pestaña nueva para convertirla. Los detalles importantes: lee el archivo en modo binario, pasa policy.default y selecciona la parte con get_body(). get_content() decodifica quoted-printable y base64 por ti.
import email
from email import policy
from markdownify import markdownify
with open("message.eml", "rb") as f:
msg = email.message_from_binary_file(f, policy=policy.default)
body = msg.get_body(preferencelist=("html", "plain"))
print(markdownify(body.get_content()))
También puedes pasar por HTML hacia pandocSe abre en una pestaña nueva, o mantener la extracción manual y delegar solo la conversión en una CLI (cat body.html | formatarc html-to-markdown). La CLI de FormatArc se explica en el paquete npm de formatarc.
Comparativa de opciones
| Opción | Ideal para | Requisitos | Cabeceras e hilos | Correo confidencial |
|---|---|---|---|---|
| HTML a Markdown (navegador) | El cuerpo de unos pocos correos abiertos | Solo navegador (gratis, sin registro) | Solo el cuerpo | Procesado en el navegador, sin envío |
| CLI de la familia eml2md | Decenas de .eml de una vez | pip / cargo | Incluidas en la salida | Procesado local |
| Python (email + markdownify) | Pipelines automatizados recurrentes | Python | Control total | Procesado local |
| Servicios web con subida | Cuando no hay otra opción | Navegador | Depende de la herramienta | Se envía a un servidor; hay límites diarios o planes de pago |
Preguntas frecuentes
¿Dónde encuentro el código HTML de un correo en Gmail?
El menú del mensaje ofrece "Mostrar original", que muestra el mensaje MIME completo. El HTML de ahí suele estar codificado en quoted-printable, así que copiarlo da HTML roto. Si solo necesitas el cuerpo, haz clic derecho sobre él, elige Inspeccionar y copia el outerHTML del bloque de contenido.
¿Las maquetas de correo se convierten en tablas Markdown?
No. Las tablas de maquetación anidadas se aplanan y colapsan — en nuestra medición, un código completo de 6,491 bytes acabó en una tabla plana de 12 columnas. La solución es pegar solo el bloque de contenido. Las tablas de datos de verdad (una tabla de precios, un resumen de pedido) sí se convierten en tablas de tuberías normales.
¿Qué pasa con las imágenes?
Las imágenes cuyo src apunta a una URL web sobreviven como imágenes Markdown . Las referencias que empiezan por cid: apuntan a imágenes adjuntas y no pueden mostrarse fuera del correo. Borra los píxeles de rastreo de 1x1 tras convertir.
¿Es seguro pegar correo confidencial en un conversor online?
Con las herramientas basadas en subida, el contenido sale de tu máquina en el momento en que pegas. La conversión de FormatArc se completa dentro del navegador, así que no hay transmisión alguna. Los criterios de decisión están en ¿son seguros los conversores online?.
¿Puedo pegar un archivo .eml directamente?
No. Un archivo .eml es un contenedor MIME con cabeceras y partes codificadas, no HTML. Para un solo mensaje, copia el bloque de contenido; para muchos, usa una CLI de la familia eml2md.
Resumen
Convertir correo HTML a Markdown se decide en el lugar desde el que copias. Pega el código completo y las tablas de maquetación anidadas colapsan en una tabla plana de 12 columnas con CSS filtrándose al texto; pega solo el bloque de contenido y obtienes 477 caracteres de Markdown limpio (medido: scripts/benchmarks/html-email-to-markdown/). Para unos pocos correos abiertos, copia el bloque de contenido con las herramientas de desarrollo y usa HTML a Markdown; para lotes de .eml, una CLI de la familia eml2md; para pipelines, el módulo email de Python. Elijas la ruta que elijas, planifica la limpieza de enlaces y píxeles de rastreo como parte de la conversión, no como algo opcional.