← RFC Reference

RFC 3030 – SMTP BINARYMIME et CHUNKING

Norme proposée SMTP & Format de message principal Published March 2026
ELI5: SMTP standard envoie les données de message comme la lecture d'un livre à haute voix page par page, et le mot spécial pour signaler « j'ai terminé » est un point sur une ligne par lui-même. Cela signifie que chaque point au début d'une ligne dans votre message a besoin d'un traitement spécial (dot-stuffing). CHUNKING remplace cela par « voici les 5 000 prochains octets » — le serveur sait exactement quelle quantité de données attendre, donc aucun caractère spécial n'a besoin d'échappement. BINARYMIME va plus loin, permettant les données binaires brutes sans frais d'encodage.

Pourquoi cette RFC existe

SMTP traditionnel utilise la commande DATA pour transférer le contenu des messages. Le corps du message est envoyé sous forme de flux de texte, terminé par une ligne contenant uniquement un point (.\r\n). Cette conception présente deux problèmes :

RFC 3030 définit deux extensions connexes qui résolvez ces problèmes. CHUNKING introduit la commande BDAT, qui transfère les données en blocs de taille explicite — aucun point d'échappement requis. BINARYMIME s'appuie sur CHUNKING pour permettre le contenu binaire brut sans aucun encodage.

Fonctionnement

CHUNKING (la commande BDAT)

  1. Le serveur annonce CHUNKING dans sa réponse EHLO.
  2. Au lieu de DATA, le client utilise BDAT <size> pour envoyer un bloc d'exactement <size> octets.
  3. Le serveur lit exactement ce nombre d'octets, puis envoie une réponse.
  4. Le client peut envoyer plusieurs blocs BDAT. Le dernier bloc inclut le mot-clé LAST : BDAT <size> LAST.
  5. Aucun point d'échappement n'est nécessaire car la taille est explicite.

BINARYMIME

  1. Le serveur annonce à la fois CHUNKING et BINARYMIME dans sa réponse EHLO.
  2. Le client déclare BODY=BINARYMIME sur la commande MAIL FROM.
  3. Les données du message sont envoyées via BDAT et peuvent contenir du contenu binaire brut — aucun encodage Base64, aucune exigence de terminaison de ligne CRLF.

Exemple SMTP

Envoi d'un message utilisant BDAT au lieu 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 # Envoi des en-têtes et de la première partie du corps (2048 octets) C: BDAT 2048 C: [2048 octets de données de message] S: 250 2.0.0 2048 octets reçus # Envoi du reste du corps (4096 octets, bloc final) C: BDAT 4096 LAST C: [4096 octets de données de message] S: 250 2.0.0 OK, 6144 octets au total, en file d'attente

Avec BINARYMIME pour le contenu binaire brut :

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 # Le message contient des parties MIME binaires, aucun encodage Base64 C: BDAT 1048576 LAST C: [1 048 576 octets de message brut comprenant des pièces jointes binaires] S: 250 2.0.0 OK, en file d'attente

Détails techniques clés

BDAT vs. DATA

Aspect DATA BDAT (CHUNKING)
Terminaison .\r\n (point sur une ligne à lui seul) Nombre d'octets explicite + mot-clé LAST
Point d'échappement Requis Non nécessaire
Contenu binaire Doit être encodé en Base64 Binaire brut avec BINARYMIME
Diffusion en continu Le serveur analyse le terminateur Le serveur lit le nombre d'octets exact
Blocs multiples Non applicable Oui, statut intermédiaire après chaque bloc

Dimensionnement des blocs

Aucune taille de bloc n'est obligatoire. Les clients choisissent généralement les tailles de blocs en fonction de la mémoire disponible et des conditions du réseau. Les stratégies courantes incluent l'envoi du message entier sous la forme d'un seul BDAT ... LAST, ou la division en blocs de quelques centaines de kilooctets. Les blocs plus petits permettent la détection d'erreurs intermédiaires ; les blocs plus grands réduisent la surcharge du protocole.

Récupération d'erreurs

Si le serveur rejette un bloc BDAT (par exemple, le message est trop volumineux), le client peut émettre BDAT 0 LAST pour terminer la transaction correctement. Cela est plus propre que le modèle DATA, où le client doit envoyer le message entier et le terminateur par point même s'il sait que le serveur le rejettera.

Transfert BINARYMIME

Un serveur qui reçoit un message BINARYMIME ne doit pas le transférer à un serveur qui ne supporte pas BINARYMIME. Si le prochain saut n'annonce pas BINARYMIME, le serveur de transfert doit convertir les parties de contenu binaire en encodage Base64 avant de les relayer. Il s'agit d'une exigence critique d'interopérabilité.

Erreurs courantes

Impact sur la délivrabilité

Related RFCs