← RFC Reference

RFC 2920 – Traitement par pipeline SMTP

Norme Internet (STD 60) SMTP Principal et Format de Message Published March 2026
ELI5: Le SMTP normal est comme une conversation où vous dites une phrase, attendez la réponse de l'autre personne, puis dites la phrase suivante. La mise en pipeline, c'est comme débiter plusieurs phrases d'affilée et laisser l'autre personne répondre à toutes à la fois. Vous n'avez pas à faire de pause entre chaque commande, donc toute la conversation se termine beaucoup plus rapidement — surtout quand les deux côtés sont éloignés.

Pourquoi cette RFC existe

SMTP standard est un protocole strict requête-réponse. Le client envoie une commande, attend la réponse du serveur, puis envoie la suivante. Chaque aller-retour ajoute de la latence, particulièrement sur les liaisons réseau à haute latence. Pour un message avec 50 destinataires, le client aurait besoin de 50 allers-retours distincts simplement pour les commandes RCPT TO.

RFC 2920 définit l'extension SMTP PIPELINING, qui permet au client d'envoyer plusieurs commandes par lot sans attendre les réponses individuelles. Le serveur met en buffer et traite les commandes dans l'ordre, puis renvoie toutes les réponses. Cela réduit dramatiquement le temps total d'une session SMTP.

Le pipelining est l'une des extensions SMTP les plus largement supportées. Presque chaque serveur mail moderne l'annonce, et la plupart des bibliothèques clientes SMTP l'utilisent par défaut.

Comment ça marche

  1. Le client envoie EHLO et confirme que le serveur annonce PIPELINING dans sa liste de capacités.
  2. Le client groupe ensemble les commandes qu'il est sûr de pipeline — typiquement MAIL FROM, un ou plusieurs RCPT TO, et DATA.
  3. Le client envoie toutes ces commandes en rapide succession sans attendre les réponses individuelles.
  4. Le serveur traite chaque commande dans l'ordre et envoie une réponse par commande, dans l'ordre.
  5. Le client lit toutes les réponses et gère les erreurs (ex. un destinataire rejeté).

Exemple SMTP

Sans pipelining (5 allers-retours pour l'enveloppe) :

C: MAIL FROM:<news@example.com> S: 250 2.1.0 OK C: RCPT TO:<alice@recipient.com> S: 250 2.1.5 OK C: RCPT TO:<bob@recipient.com> S: 250 2.1.5 OK C: RCPT TO:<carol@recipient.com> S: 550 5.1.1 User unknown C: DATA S: 354 Start mail input

Avec pipelining (1 aller-retour pour l'enveloppe entière) :

# Le client envoie toutes les commandes d'enveloppe à la fois C: MAIL FROM:<news@example.com> C: RCPT TO:<alice@recipient.com> C: RCPT TO:<bob@recipient.com> C: RCPT TO:<carol@recipient.com> C: DATA # Le serveur répond à toutes les cinq commandes dans l'ordre S: 250 2.1.0 OK S: 250 2.1.5 OK S: 250 2.1.5 OK S: 550 5.1.1 User unknown S: 354 Start mail input # Le client envoie les données du message (carol a été rejeté, mais alice et bob continuent) C: Subject: Weekly update C: C: This week's news... C: . S: 250 2.0.0 OK, queued

Détails techniques clés

Quelles commandes peuvent être pipelinées

Pas toutes les commandes SMTP sont sûres à pipeliner. RFC 2920 divise les commandes en deux catégories :

Sûr à pipeliner Doit attendre la réponse
MAIL FROM EHLO / HELO
RCPT TO STARTTLS
DATA AUTH
RSET QUIT
NOOP DATA content (le corps échappé par point)

Les commandes qui changent l'état de la connexion (EHLO, STARTTLS, AUTH) sont des points de synchronisation — le client doit attendre la réponse avant d'envoyer quoi que ce soit d'autre.

Gestion des erreurs

Lors du pipelining, certaines commandes dans un lot peuvent réussir tandis que d'autres échouent. Le client doit faire correspondre les réponses aux commandes dans l'ordre. Une RCPT TO rejetée n'invalide pas la transaction entière — le message est toujours livré aux destinataires acceptés. Cependant, si MAIL FROM est rejeté, les commandes RCPT TO suivantes échoueront aussi.

Considérations du buffering TCP

Le pipelining repose sur le buffering TCP. Le client écrit plusieurs commandes sur le socket sans lire, en se fiant au fait que le tampon d'envoi TCP peut les contenir. Pour de très grands lots de commandes RCPT TO (centaines ou milliers), le client peut avoir besoin de pipeliner par groupes pour éviter de remplir le tampon TCP et de se bloquer mutuellement.

Interaction avec STARTTLS

Après une réponse EHLO qui inclut STARTTLS, le client ne doit pas pipeliner STARTTLS avec d'autres commandes. La négociation TLS change l'état de toute la connexion, donc c'est un point de synchronisation strict. Après que TLS soit établi et qu'un nouvel EHLO soit envoyé, le pipelining peut reprendre.

Erreurs courantes

Impact sur la délivrabilité

Related RFCs