← RFC Reference

RFC 3030 – SMTP BINARYMIME y CHUNKING

Proposed Standard Core SMTP & Message Format Published March 2026
ELI5: El SMTP estándar envía datos de mensaje como leer un libro en voz alta página por página, y la palabra especial para señalar "terminé" es un punto en una línea por sí solo. Esto significa que cada punto al inicio de una línea en tu mensaje necesita manejo especial (dot-stuffing). CHUNKING reemplaza esto con "aquí están los próximos 5.000 bytes" — el servidor sabe exactamente cuántos datos esperar, así que no necesitan caracteres especiales escapados. BINARYMIME va más allá, permitiendo datos binarios puros sin ninguna sobrecarga de codificación.

Por qué existe este RFC

SMTP tradicional usa el comando DATA para transferir contenido de mensajes. El cuerpo del mensaje se envía como una secuencia de texto, terminada por una línea que contiene solo un período (.\r\n). Este diseño tiene dos problemas:

RFC 3030 define dos extensiones relacionadas que solucionan estos problemas. CHUNKING introduce el comando BDAT, que transfiere datos en fragmentos de tamaño explícito, sin necesidad de escape de punto. BINARYMIME se construye sobre CHUNKING para permitir contenido binario sin procesar sin ninguna codificación.

Cómo funciona

CHUNKING (comando BDAT)

  1. El servidor anuncia CHUNKING en su respuesta EHLO.
  2. En lugar de DATA, el cliente usa BDAT <size> para enviar un fragmento de exactamente <size> octetos.
  3. El servidor lee exactamente esa cantidad de bytes, luego envía una respuesta.
  4. El cliente puede enviar múltiples fragmentos BDAT. El último fragmento incluye la palabra clave LAST: BDAT <size> LAST.
  5. No se necesita escape de punto porque el tamaño es explícito.

BINARYMIME

  1. El servidor anuncia CHUNKING y BINARYMIME en su respuesta EHLO.
  2. El cliente declara BODY=BINARYMIME en el comando MAIL FROM.
  3. Los datos del mensaje se envían mediante BDAT y pueden contener contenido binario sin procesar, sin codificación Base64 ni requisitos de finales de línea CRLF.

Ejemplo SMTP

Envío de un mensaje usando BDAT en lugar de DATA:

S: 220 mx.example.com ESMTP C: EHLO sender.example.net S: 250-mx.example.com S: 250-CHUNKING S: 250-BINARYMIME S: 250-SIZE 52428800 S: 250 PIPELINING C: MAIL FROM:<alice@example.net> S: 250 2.1.0 OK C: RCPT TO:<bob@example.com> S: 250 2.1.5 OK # Enviar encabezados y primera parte del cuerpo (2048 bytes) C: BDAT 2048 C: [2048 bytes de datos del mensaje] S: 250 2.0.0 2048 bytes recibidos # Enviar el resto del cuerpo (4096 bytes, fragmento final) C: BDAT 4096 LAST C: [4096 bytes de datos del mensaje] S: 250 2.0.0 OK, 6144 bytes total, en cola

Con BINARYMIME para contenido binario sin procesar:

C: MAIL FROM:<alice@example.net> BODY=BINARYMIME S: 250 2.1.0 OK C: RCPT TO:<bob@example.com> S: 250 2.1.5 OK # El mensaje contiene partes MIME binarias, sin codificación Base64 C: BDAT 1048576 LAST C: [1.048.576 bytes de mensaje sin procesar incluyendo archivos adjuntos binarios] S: 250 2.0.0 OK, en cola

Detalles técnicos clave

BDAT vs. DATA

Aspecto DATA BDAT (CHUNKING)
Terminación .\r\n (punto en una línea por sí solo) Recuento de bytes explícito + palabra clave LAST
Escape de punto Requerido No necesario
Contenido binario Debe estar codificado en Base64 Binario sin procesar con BINARYMIME
Transmisión El servidor escanea el terminador El servidor lee el recuento de bytes exacto
Múltiples fragmentos No aplicable Sí, estado intermedio después de cada fragmento

Tamaño de fragmento

No hay un tamaño de fragmento mandatorio. Los clientes típicamente eligen tamaños de fragmentos según la memoria disponible y condiciones de red. Las estrategias comunes incluyen enviar el mensaje completo como un único BDAT ... LAST, o dividir en fragmentos de unos cientos de kilobytes. Los fragmentos más pequeños permiten detección de errores intermedia; los fragmentos más grandes reducen la sobrecarga de protocolo.

Recuperación de errores

Si el servidor rechaza un fragmento BDAT (por ejemplo, mensaje demasiado grande), el cliente puede emitir BDAT 0 LAST para abortar la transacción limpiamente. Esto es más limpio que el modelo DATA, donde el cliente debe enviar el mensaje completo y el terminador de punto incluso si sabe que el servidor lo rechazará.

Reenvío de BINARYMIME

Un servidor que recibe un mensaje BINARYMIME no debe reenviarlo a un servidor que no sea compatible con BINARYMIME. Si el siguiente salto no anuncia BINARYMIME, el servidor de reenvío debe convertir partes de contenido binario a codificación Base64 antes de retransmitir. Este es un requisito crítico de interoperabilidad.

Errores comunes

Impacto en la entrega

Related RFCs