Aller au contenu principal

4. Les spécifications SMTP (The SMTP Specifications)

Cette section contient les spécifications détaillées des commandes SMTP, des réponses, des séquences, des informations de traçage et des problèmes d'implémentation.

4.1. Commandes SMTP (SMTP Commands)

4.1.1. Sémantique et syntaxe des commandes (Command Semantics and Syntax)

Les commandes SMTP sont des mots ASCII insensibles à la casse de quatre caractères (certains étendus à huit caractères), éventuellement suivis de paramètres.

HELLO étendu (EHLO) ou HELLO (HELO)

Syntaxe : EHLO domain ou HELO domain

La commande EHLO initie une session SMTP et demande les extensions de service. HELO est le repli pour les serveurs qui ne prennent pas en charge les extensions.

Exemple :

C: EHLO client.example.com
S: 250-server.example.com
S: 250-SIZE 52428800
S: 250-8BITMIME
S: 250 STARTTLS

MAIL (MAIL FROM)

Syntaxe : MAIL FROM:<reverse-path> [parameters]

Initie une transaction de courrier en spécifiant l'expéditeur.

Exemple :

C: MAIL FROM:<[email protected]>
S: 250 Ok

RECIPIENT (RCPT TO)

Syntaxe : RCPT TO:<forward-path> [parameters]

Identifie un destinataire du courrier.

Exemple :

C: RCPT TO:<[email protected]>
S: 250 Ok

DATA

Syntaxe : DATA

Signale le début du contenu du message. Le contenu se termine par <CRLF>.<CRLF>.

Exemple :

C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: [email protected]
C: To: [email protected]
C: Subject: Test
C:
C: Message body here.
C: .
S: 250 Ok: queued as 12345

RESET (RSET)

Syntaxe : RSET

Abandonne la transaction de courrier en cours et réinitialise les tampons.

VERIFY (VRFY)

Syntaxe : VRFY string

Vérifie qu'une boîte aux lettres existe.

Note : De nombreux serveurs désactivent ceci pour des raisons de sécurité.

EXPAND (EXPN)

Syntaxe : EXPN string

Étend une liste de diffusion.

HELP

Syntaxe : HELP [command]

Fournit des informations d'aide.

NO OPERATION (NOOP)

Syntaxe : NOOP

Ne fait rien, utilisé pour maintenir la connexion active.

QUIT

Syntaxe : QUIT

Termine la session SMTP.

4.1.2. Syntaxe des arguments de commande (Command Argument Syntax)

Les commandes suivent des règles de syntaxe strictes définies en ABNF (RFC 5234).

Format de boîte aux lettres : local-part@domain

  • Local-part : Maximum 64 caractères
  • Domain : Nom de domaine pleinement qualifié ou littéral d'adresse

Littéral d'adresse :

  • IPv4 : [192.0.2.1]
  • IPv6 : [IPv6:2001:db8::1]

4.1.3. Littéraux d'adresse (Address Literals)

Les littéraux d'adresse sont des domaines entre crochets :

  • [192.0.2.1] - Adresse IPv4
  • [IPv6:2001:db8::1] - Adresse IPv6

4.1.4. Ordre des commandes (Order of Commands)

Séquence de commande valide :

  1. Connexion : Le serveur envoie 220
  2. Salutation : Le client envoie EHLO/HELO
  3. Transaction : MAIL → RCPT (un ou plusieurs) → DATA
  4. Terminaison : QUIT

Les séquences invalides entraînent une erreur 503 "Séquence de commandes incorrecte".

4.1.5. Commandes à usage privé (Private-Use Commands)

Les commandes commençant par X sont réservées à un usage privé et à l'expérimentation.

4.2. Réponses SMTP (SMTP Replies)

4.2.1. Gravité et théorie des codes de réponse (Reply Code Severities and Theory)

Les codes de réponse sont des nombres à trois chiffres :

  • 2yz : Achèvement positif
  • 3yz : Intermédiaire positif
  • 4yz : Échec transitoire négatif (réessayable)
  • 5yz : Échec permanent négatif (ne pas réessayer)

Le deuxième chiffre indique la catégorie :

  • x0z : Syntaxe
  • x1z : Information
  • x2z : Connexion
  • x5z : Système de courrier

4.2.2. Codes de réponse par groupes fonctionnels (Reply Codes by Function Groups)

Établissement de connexion :

  • 220 : Service prêt
  • 421 : Service non disponible

Initiation du client :

  • 250 : OK
  • 500 : Erreur de syntaxe
  • 502 : Commande non implémentée

Transaction de courrier :

  • 250 : OK
  • 354 : Début de la saisie du courrier
  • 450/550 : Boîte aux lettres non disponible
  • 451/551 : Erreur de traitement
  • 452/552 : Stockage insuffisant
  • 553 : Nom de boîte aux lettres invalide
  • 554 : Échec de transaction

4.2.3. Codes de réponse en ordre numérique (Reply Codes in Numeric Order)

  • 211 : État du système
  • 214 : Message d'aide
  • 220 : Service prêt
  • 221 : Fermeture de connexion
  • 250 : OK
  • 251 : Utilisateur non local, transférera
  • 252 : Impossible de vérifier l'utilisateur, mais acceptera le message
  • 354 : Début de la saisie du courrier
  • 421 : Service non disponible
  • 450 : Boîte aux lettres non disponible
  • 451 : Erreur locale
  • 452 : Stockage insuffisant
  • 500 : Erreur de syntaxe
  • 501 : Erreur de syntaxe dans les paramètres
  • 502 : Commande non implémentée
  • 503 : Séquence de commandes incorrecte
  • 504 : Paramètre de commande non implémenté
  • 550 : Boîte aux lettres non disponible
  • 551 : Utilisateur non local
  • 552 : Allocation de stockage dépassée
  • 553 : Nom de boîte aux lettres non autorisé
  • 554 : Échec de transaction
  • 555 : Paramètre non reconnu

4.3. Séquencement des commandes et réponses (Sequencing of Commands and Replies)

4.3.1. Aperçu du séquencement (Sequencing Overview)

SMTP est verrouillé : le client envoie une commande, attend la réponse, puis envoie la commande suivante. Exception : L'extension PIPELINING permet le traitement par lots.

4.4. Informations de traçage (Trace Information)

Chaque serveur SMTP ajoute un champ d'en-tête Received lors de l'acceptation d'un message :

Format :

Received: from sender.example.com (host.example.com [192.0.2.1])
by receiver.example.com (Postfix) with ESMTP id 12345
for <[email protected]>; Mon, 24 Dec 2024 10:00:00 +0000 (UTC)

4.5. Problèmes d'implémentation supplémentaires (Additional Implementation Issues)

4.5.1. Implémentation minimale (Minimum Implementation)

Un SMTP entièrement fonctionnel DOIT (MUST) prendre en charge :

  • Commandes : EHLO, MAIL, RCPT, DATA, RSET, NOOP, QUIT
  • Codes de réponse : Tous les codes standard
  • Logique de mise en file d'attente et de nouvelle tentative
  • Gestion appropriée des erreurs

4.5.2. Transparence (Transparency)

Les serveurs DOIVENT (MUST) gérer le bourrage de points (dot-stuffing) : les lignes commençant par . doivent être échappées comme .. lors de l'envoi DATA.

4.5.3. Tailles et délais d'expiration (Sizes and Timeouts)

4.5.3.1. Limites de taille et minimums (Size Limits and Minimums)

Exigences minimales :

  • Local-part : 64 octets
  • Domain : 255 octets
  • Path : 256 octets
  • Ligne de commande : 512 octets
  • Ligne de réponse : 512 octets
  • Ligne de texte : 1000 octets
  • Tampon de destinataires : 100 destinataires

4.5.3.2. Délais d'expiration (Timeouts)

Délais d'expiration du client :

  • Message 220 initial : 5 minutes
  • Commande MAIL : 5 minutes
  • Commande RCPT : 5 minutes
  • Début DATA : 2 minutes
  • Bloc de données : 3 minutes
  • Fin DATA : 10 minutes

Délais d'expiration du serveur :

  • Attente de commande : 5 minutes
  • Attente DATA : 10 minutes

4.5.4. Stratégies de nouvelle tentative (Retry Strategies)

Pour les échecs transitoires (codes 4yz) :

  • Réessayer au moins toutes les 30 minutes
  • Continuer les tentatives pendant au moins 4-5 jours
  • Envoyer des avertissements à l'expéditeur à intervalles
  • Générer un rebond après échec final

4.5.5. Messages avec un chemin inverse nul (Messages with a Null Reverse-Path)

Les messages de rebond utilisent MAIL FROM:<> (chemin inverse nul) pour éviter les boucles de courrier. Les serveurs DOIVENT (MUST) accepter le chemin inverse nul mais NE DOIVENT PAS (MUST NOT) générer de rebonds pour eux.