Module 1 · 1.2
Français
SMTP : la conversation entre serveurs de messagerie
Module 1: Comment fonctionne l'e-mail · Temps de lecture : 10 minutes
Objectif pédagogique : après cette leçon, vous saurez lire une conversation SMTP, expliquer à quoi servent EHLO, MAIL FROM, RCPT TO et DATA, et reconnaître, à partir d'un code de réponse, si une erreur est temporaire ou définitive.
Notions clés : SMTP (RFC 5321), session, EHLO/HELO, MAIL FROM, RCPT TO, DATA, QUIT, code de réponse (2xx, 3xx, 4xx, 5xx), code de statut étendu, extensions (STARTTLS, AUTH, SIZE), null MX
Une conversation en texte brut
SMTP est un protocole très ancien (la première version date de 1982) et donc très lisible. Deux serveurs s'échangent des lignes de texte. L'expéditeur (le client) envoie une commande, le destinataire (le serveur) répond par un nombre de trois chiffres suivi d'une courte explication. Vous pouvez relire une telle conversation telle quelle dans un message d'erreur ou un journal, et c'est précisément pour cela qu'il est utile de la comprendre.
Voici ci-dessous une conversation complète. S: désigne le serveur destinataire, C: le serveur expéditeur. Le message va de anna@example.com à jan@example.net.
S: 220 mx1.mailprovider.example ESMTP ready
C: EHLO out.hosting.example
S: 250-mx1.mailprovider.example Hello out.hosting.example [192.0.2.25]
S: 250-SIZE 52428800
S: 250-8BITMIME
S: 250-STARTTLS
S: 250 SMTPUTF8
C: STARTTLS
S: 220 2.0.0 Ready to start TLS
(à partir d'ici, la connexion est chiffrée ; le client renvoie EHLO)
C: EHLO out.hosting.example
S: 250 ...
C: MAIL FROM:<anna@example.com> SIZE=24310
S: 250 2.1.0 Ok
C: RCPT TO:<jan@example.net>
S: 250 2.1.5 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: Anna <anna@example.com>
C: To: Jan <jan@example.net>
C: Subject: Offerte
C: Date: Sun, 8 Nov 2026 10:15:00 +0100
C: Message-ID: <a1b2c3@example.com>
C:
C: Hoi Jan, hierbij de offerte.
C: .
S: 250 2.0.0 Ok: queued as 4F2A1B
C: QUIT
S: 221 2.0.0 ByeLes commandes une par une
| Commande | Signification | À noter |
|---|---|---|
| (connexion) | Le serveur salue avec 220 et son nom. | C'est ce qu'on appelle la banner. Si le serveur répond immédiatement 554, c'est qu'il ne veut pas du tout parler à votre IP (souvent une liste de blocage). |
EHLO nom | « Bonjour, je suis out.hosting.example. » Le serveur répond avec les extensions qu'il connaît. | Le nom doit être le véritable nom du serveur expéditeur, de préférence identique à son enregistrement PTR (leçon 5.1). HELO est l'ancienne variante, sans extensions. |
STARTTLS | « Chiffrons désormais la connexion. » | Uniquement si le serveur le propose. Entre serveurs, c'est généralement facultatif (leçon 5.4). |
MAIL FROM:<adresse> | L'expéditeur d'enveloppe : c'est là que partent les messages d'erreur. | Deviendra ensuite l'en-tête Return-Path. SPF contrôle cette adresse. Une adresse vide <> est utilisée par les serveurs pour leurs propres messages d'erreur, afin qu'un bounce ne génère jamais lui-même un bounce. |
RCPT TO:<adresse> | Le destinataire. Peut apparaître plusieurs fois, une par destinataire. | C'est ici que le serveur devrait déjà indiquer si l'adresse existe. Un 550 5.1.1 à ce stade est une erreur propre, identifiée immédiatement. |
DATA | « Voici maintenant le message lui-même. » Le serveur répond 354. | Suivent ensuite les en-têtes, une ligne vide et le texte. Une ligne ne contenant qu'un point marque la fin. |
QUIT | Fin de la conversation. |
L'élément essentiel à retenir : tout ce qui précède DATA est l'enveloppe, tout ce qui suit DATA est le contenu. Ce qui figure dans MAIL FROM et ce qui figure dans l'en-tête From: sont fournis séparément et n'ont pas besoin d'être identiques. Le serveur délivre selon RCPT TO ; la ligne To: du contenu ne joue aucun rôle dans la remise.
Les codes de réponse
Le premier chiffre du code est le plus important :
| Commence par | Signification | Que fait l'expéditeur ? |
|---|---|---|
| 2 | Réussite. | Passage à l'étape suivante. Un 250 après DATA signifie : le serveur a accepté le message et en est désormais responsable. |
| 3 | Continuez, j'attends la suite. | Uniquement pour 354 après DATA (et lors de l'authentification). |
| 4 | Erreur temporaire : pas maintenant, réessayez plus tard. | Le message reste dans la file d'attente et sera présenté à nouveau plus tard. |
| 5 | Erreur définitive : cela ne pourra pas fonctionner. | L'expéditeur abandonne et envoie un message d'erreur (bounce) à l'expéditeur d'enveloppe. |
Après les trois chiffres, les serveurs modernes indiquent un code de statut étendu sous la forme class.subject.detail (RFC 3463), par exemple 5.1.1. Le premier chiffre vaut à nouveau 2, 4 ou 5. Le deuxième chiffre précise le sujet : 1 = adresse, 2 = boîte aux lettres, 3 = système de messagerie, 4 = réseau et routage, 5 = protocole, 6 = contenu, 7 = sécurité et politique. Quelques exemples fréquents :
550 5.1.1 The email account that you tried to reach does not exist
452 4.2.2 Mailbox full (temporaire)
552 5.3.4 Message size exceeds fixed limit
451 4.7.1 Greylisted, please try again later
550 5.7.1 Message rejected (politique : spam, liste de blocage, DMARC)Au module 6, vous apprendrez à lire un bounce complet et vous trouverez un tableau avec les codes les plus fréquents.
Pourquoi la distinction temporaire/définitif est si importante
Un serveur qui hésite répond souvent par un 4xx. Un exemple bien connu est le greylisting : un serveur qui ne connaît pas encore un expéditeur dit, la première fois, « réessayez plus tard ». Un vrai serveur de messagerie revient après quelques minutes, beaucoup de programmes d'envoi de spam ne le font pas. Les grands destinataires utilisent également des 4xx pour ralentir le rythme lorsqu'ils ne font pas encore confiance à une adresse IP. Pour vous, en tant qu'expéditeur, cela signifie : un retard, mais pas une perte. Le système résout généralement cela de lui-même.
Un 5xx est différent. Dans ce cas, l'expéditeur ne va pas réessayer. Si vous recevez un 5xx, il faut que quelqu'un change quelque chose : l'adresse, le contenu, ou les paramètres du domaine expéditeur.
Un piège : certains serveurs renvoient un 5xx alors que le problème est temporaire (par exemple pour une boîte aux lettres pleine, 552 5.2.2), et d'autres renvoient un 4xx pour quelque chose qui ne fonctionnera jamais. Lisez donc toujours le texte qui suit le code, pas seulement le chiffre.
Qui est responsable ?
Après le 250 sur le point final de DATA, la responsabilité incombe au serveur destinataire. S'il ne parvient ensuite pas à déposer le message dans la boîte aux lettres, c'est à lui de renvoyer un message d'erreur. C'est l'origine d'un phénomène gênant : le backscatter. Un serveur qui accepte d'abord tout et ne se rend compte qu'ensuite que l'adresse n'existe pas envoie un bounce à l'expéditeur d'enveloppe. Si celui-ci a été falsifié par un spammeur, c'est un tiers innocent qui reçoit le bounce. C'est pourquoi les serveurs devraient refuser dès RCPT TO ce qui ne peut pas fonctionner (voir aussi le catch-all à la leçon 3.3).
En pratique : voir SMTP dans votre propre environnement
Un utilisateur ordinaire voit rarement l'intégralité de la conversation SMTP, mais il en voit des fragments :
- dans un bounce figure la dernière ligne de la conversation, par exemple
Remote-MTA: mx1.mailprovider.exampleetDiagnostic-Code: smtp; 550 5.1.1 ...; - dans les en-têtes d'un message reçu figure, pour chaque serveur, une ligne
Received:avec le nom EHLO et l'adresse IP (leçon 1.5) ; - dans un panneau de journal de messagerie, comme Suivi des e-mails dans DirectAdmin chez WebOké, vous voyez, pour chaque message, la réponse du serveur destinataire. Chez d'autres fournisseurs, cela s'appelle par exemple suivi des messages ou mail log, et le contenu est comparable.
Vous n'avez donc pas besoin de vous connecter vous-même à un serveur de messagerie pour pouvoir lire cela. Pour ceux qui souhaitent néanmoins essayer : avec openssl s_client -starttls smtp -connect server:25, vous pouvez mener la conversation vous-même, mais de nombreux fournisseurs d'accès grand public bloquent le trafic sortant sur le port 25 (leçon 1.4).
Résumé
- SMTP est une conversation lisible : EHLO, (STARTTLS), MAIL FROM, RCPT TO, DATA, QUIT.
- Tout ce qui précède DATA est l'enveloppe (remise et messages d'erreur), tout ce qui suit est le contenu avec les en-têtes que vous voyez.
- 2xx = réussite, 4xx = temporaire (à réessayer plus tard), 5xx = définitif (bounce).
- Le code étendu
X.Y.Zindique le sujet concerné : X.1 adresse, X.2 boîte aux lettres, X.7 politique et sécurité. - Lisez toujours le texte qui suit le code ; les serveurs ne sont pas toujours cohérents.
Quiz
Exercice
Exercice Z1.2 : Un domaine qui ne reçoit pas de courrier. Recherchez les enregistrements MX de example.com. Indiquez ce que vous trouvez et choisissez ce que fait un serveur expéditeur avec un message destiné à info@example.com : (a) le remettre au serveur de priorité 0, (b) essayer l'enregistrement A, (c) abandonner immédiatement, ou (d) réessayer plus tard. Le programme interroge l'enregistrement MX en direct et vérifie la réponse.
Pour aller plus loin
Les étapes décrites dans ces articles valent pour les panneaux de WebOké ; chez d'autres fournisseurs, le fonctionnement est comparable.
- Explication du processus d'envoi des e-mails / SMTP
- Échec de la livraison du courrier : comment lire le message d'erreur et ce que signifient les codes
- Guide DirectAdmin 9.3: Suivi des e-mails : où est passé mon message ?
- RFC 5321 (SMTP), paragraphes 3 et 4.2 (codes de réponse) ; RFC 3463 (codes de statut étendus) ; RFC 7505 (null MX)
