Solución al error "message has lines too long for transport" en Exim
Si estás experimentando errores de rebote (delivery) con el mensaje "message has lines too long for transport" al enviar correos desde Outlook clásico hacia cuentas externas a través de un servidor Exim, pero los correos funcionan correctamente desde el nuevo Outlook o webmail, este artículo te mostrará la solución definitiva.
Síntomas del Problema
- ✅ Los correos internos (mismo servidor) se envían correctamente
- ✅ Los correos desde Nuevo Outlook funcionan perfectamente
- ❌ Los correos desde Outlook clásico a dominios externos fallan con el error: message has lines too long for transport
El mensaje que estan enviando tiene imagenes pegadas en el mensaje en lugar de estar como archivo adjunto
Causa del Problema
El problema ocurre cuando se cumplen estas condiciones:
- Outlook clásico genera correos con líneas que exceden los límites del protocolo SMTP tradicional (998 caracteres según RFC 5322)
- El servidor Exim está configurado para enviar correos externos a través de un smarthost o gateway (como SpamExperts, relay SMTP, etc.)
- El transport de Exim no está configurado para manejar líneas largas o usar el protocolo CHUNKING
¿Por qué Outlook clásico y el nuevo Outlook se comportan diferente?
- Outlook clásico: Usa SMTP/MAPI tradicional y puede generar headers MIME, firmas HTML y contenido Base64 con líneas muy largas
- Nuevo Outlook: Usa Microsoft Graph API que codifica el contenido de manera más compatible con los límites SMTP estándar
Solución
La solución consiste desde el Panel WHM en modificar los transports de Exim para que:
- Aumenten significativamente el límite de longitud de línea
- Habiliten el protocolo CHUNKING (BDAT) que evita las restricciones de longitud
Paso 1: Acceder al Editor Avanzado de Exim
- Inicia sesión en WHM o cPanel
- Ve a Service Configuration → Exim Configuration Manager
- Haz clic en Advanced Editor
Paso 2: Localizar la Sección de Transports
Busca la sección "Section: TRANSPORTSTART" o "begintransport"
Paso 3: Modificar el Transport para Smarthost con DKIM
Localiza tu transport que maneja el envío a través del smarthost (por ejemplo: remote_smtp_smart_dkim) y modifícalo así:
ANTES (configuración problemática):
remote_smtp_smart_dkim:
driver = smtp
hosts_require_tls = *
message_linelength_limit = 990 # o sin esta línea
interface = ${if exists {/etc/mailips}{${lookup{$sender_address_domain}lsearch*{/etc/mailips}{$value}{}}}{}}
helo_data = ${if exists {/etc/mailhelo}{${lookup{$sender_address_domain}lsearch*{/etc/mailhelo}{$value}{$primary_hostname}}}{$primary_hostname}}
dkim_domain = $sender_address_domain
dkim_selector = default
dkim_private_key = "/var/cpanel/domain_keys/private/${lookup{$dkim_domain}dsearch{/var/cpanel/domain_keys/private/}}"
dkim_canon = relaxed
headers_add = "${perl{check_mail_permissions_headers}}"
DESPUÉS (configuración correcta):
remote_smtp_smart_dkim:driver = smtphosts_require_tls = *message_linelength_limit = 1000000 # ← AÑADIR: Límite muy altohosts_try_chunking = * # ← AÑADIR: Habilitar CHUNKINGinterface = ${if exists {/etc/mailips}{${lookup{$sender_address_domain}lsearch*{/etc/mailips}{$value}{}}}{}}helo_data = ${if exists {/etc/mailhelo}{${lookup{$sender_address_domain}lsearch*{/etc/mailhelo}{$value}{$primary_hostname}}}{$primary_hostname}}dkim_domain = $sender_address_domaindkim_selector = defaultdkim_private_key = "/var/cpanel/domain_keys/private/${lookup{$dkim_domain}dsearch{/var/cpanel/domain_keys/private/}}"dkim_canon = relaxedheaders_add = "${perl{check_mail_permissions_headers}}"
Paso 4: Modificar Otros Transports (Opcional pero Recomendado)
Si tienes otros transports para smarthost sin DKIM, modifícalos también:
remote_smtp_smart_regular:driver = smtphosts_require_tls = *message_linelength_limit = 1000000 # ← AÑADIRhosts_try_chunking = * # ← AÑADIRinterface = ${if exists {/etc/mailips}{${lookup{$sender_address_domain}lsearch*{/etc/mailips}{$value}{}}}{}}helo_data = ${if exists {/etc/mailhelo}{${lookup{$sender_address_domain}lsearch*{/etc/mailhelo}{$value}{$primary_hostname}}}{$primary_hostname}}headers_add = "${perl{check_mail_permissions_headers}}"
Paso 5: Guardar y Aplicar Cambios
- Haz clic en Save en el Advanced Editor
- cPanel automáticamente recargará la configuración de Exim
- Verifica que aparezca el mensaje: "The system successfully saved the configuration."
Paso 6: Verificar la Configuración (Opcional)
Desde SSH, puedes verificar que los cambios se aplicaron correctamente:
# Verificar el transportexim -bP transport remote_smtp_smart_dkim | grep -E "message_linelength|chunking"
# Deberías ver:
# message_linelength_limit = 1000000
# hosts_try_chunking = *
¿Qué Hacen Estos Cambios?
message_linelength_limit = 1000000
Esta directiva establece el límite máximo de caracteres por línea en 1 millón (prácticamente sin límite). Esto permite que Exim procese correos con líneas muy largas sin rechazarlos.
Valores comunes:
998- Límite estándar RFC 53220- Sin límite (puede causar problemas con algunos servidores)1000000- Límite muy alto pero definido (recomendado)
hosts_try_chunking = *
Esta directiva habilita el protocolo CHUNKING (BDAT) que es una extensión de SMTP (RFC 3030) que permite:
- Enviar el contenido del mensaje en bloques binarios
- Evitar las restricciones de longitud de línea del SMTP tradicional
- Mejor manejo de mensajes con contenido binario o codificado
El asterisco * significa "intentar con todos los hosts". Si el servidor receptor no soporta CHUNKING, Exim automáticamente regresará al método tradicional.

