RFC du protocole SMTP : les procédures smtp


3. LES PROCEDURES SMTP


Cette section présente en plusieurs étapes les procédures utilisées par SMTP. Tout d'abord est analysée la procédure de base définie comme une transaction de transfert de courrier. Suite à ceci seront décrits la façon de réemettre un courrier, vérifier des noms de boîtes aux lettres et expanser des listes de diffusion, d'émettre vers de terminaux plutôt que (ou conjointement) vers des boîtes aux lettres, ainsi que les procédures d'ouverture et de fermeture des échanges. Vous trouverez à la fin de cette section des commentaires sur le principe de relais, une note sur les domaines de courrier, et une discussion sur l'échange des rôles. Tout au long de cette section seront donnés des exemples de séquences partielles de commandes et réponses, des scénarios complets de transactions sont proposés dans l'Appendice F.

3.1. Emission de courrier

Une transaction de courrier SMTP se déroule en trois étapes. La transaction est initiée par une commande MAIL donnant l'identification de l'émetteur. Une série contenant une ou plusieurs commandes RCPT suit, donnant les informations sur les destinataires. Puis une commande DATA passe le contenu du message. Dans cette troisième phase, la marque de fin de données à transmettre marque la fin de la transaction.

La première étape de la procédure est donc la commande MAIL. L'argument contient le nom de la boîte aux lettres de l'émetteur.

MAIL <SP> FROM:<reverse-path> <CRLF>

Cette commande indique au récepteur SMTP qu'une nouvelle transaction de courrier débute et lui demande de réinitialiser ses tables d'états et ses tampons, y compris ses boîtes de réception et toute donnée de courrier latente. Elle lui donne le chemin inverse qui pourra être utilisé en cas de rapport d'erreur à transmettre. Si l'émetteur accepte la commande, un code 250 OK est renvoyé à l'émetteur.

L'argument <route-inverse> peut contenir plus d'une boîte aux lettres. On peut y inscrire une liste de plusieurs boîtes aux lettres dans des hôtes différents. La première boîte inscrite dans l'argument <route-inverse> doit néanmoins être celle désignant l'émetteur du message.

La deuxième étape de la procédure est l'émission des commandes RCPT.

RCPT <SP> TO:<cheminDirect> <CRLF>

Cette commande transmet une adresse de courrier désignant un récipiendaire. Si elle est acceptée, le récepteur SMTP renvoie une réponse de code "250 OK", et mémorise le chemin d'acheminement. Si le récipiendaire est inconnu, le récepteur SMTP renvoie un code d'erreur "550 Failure". Cette seconde étape de la procédure peut être répétée autant de fois que nécessaire.

L'argument <route-directe> peut contenir plus d'une adresse de boîte aux lettres. On peut y inscrire une liste de boîtes aux lettres dans des hôtes différents. Le premier hôte à être mentionné dans l'argument <route-directe> sera l'hôte à qui est envoyé cette commande.

La troisième étape consiste en l'émission de la commande DATA.

DATA <CRLF>

Si elle est acceptée, le récepteur SMTP renvoie une réponse de code "354 Intermediate" et prend en compte toutes les lignes de texte suivantes comme étant le texte du message. Lorsque la marque indiquant la fin du texte est reçue et enregistrée, le récepteur SMTP envoie une réponse de code "250 OK".

Comme les données du courrier sont émises sur le même canal de transmission, il faudra donner un indicateur de fin de données pour que le dialogue requête-réponse puisse reprendre. SMTP indique la fin des données du message en envoyant une ligne contenant un point unique. Une procédure de "transparence" est utilisée pour éviter que celle-ci n'interfère avec le texte de l'utilisateur (voir Section 4.5.2). Notez que les données du message incluent un résumé d'en-tête comprenant les champs tels que Date, Subject, To, Cc, From [2].

L'indicateur de fin de message confirme en outre la transaction de courrier et signale au récepteur-SMTP qu'il peut désormais traiter les récipiendaires enregistrés pour ce message. Si les données sont acceptées, le récepteur-SMTP renvoie une réponse de code "250 OK" . La commande DATA ne doit échouer que si la transaction de courrier s'avère incomplète (par exemple, pas de récipiendaires), ou si les ressources suffisantes pour traiter le courrier ne sont pas disponibles.

La procédure qui suit est un exemple de transaction de courrier. Ces commandes ne doivent être employées que dans l'ordre précisé ci-avant. L'exemple 1 (ci-dessous) illustre l'utilisation de ces commandes dans une transaction.

Exemple 1 / Exemple de procédure SMTP

Cet exemple de séquence SMTP montre un courrier envoyé par Smith, utilisateur de l'hôte ARPA Alpha, à Jones, Green, et Brown utilisateurs de l'hôte ARPA Beta. Nous supposerons que l'hôte Alpha contacte l'hôte Beta directement.

            S: MAIL FROM:<Smith@Alpha.ARPA>
            R: 250 OK

            S: RCPT TO:<Jones@Beta.ARPA>
            R: 250 OK

            S: RCPT TO:<Green@Beta.ARPA>
            R: 550 No such user here

            S: RCPT TO:<Brown@Beta.ARPA>
            R: 250 OK

            S: DATA
            R: 354 Start mail input; end with <CRLF>.<CRLF>
            S: Blah blah blah...
            S: ...etc. etc. etc.
            S: <CRLF>.<CRLF>
            R: 250 OK

Le courrier a été accepté pour Jones et Brown. Green n'avait pas de boîte aux lettres sur Beta.

3.2. Réémissions (ou redirections)

Il existe certains cas où l'information concernant un destinataire donnée dans la <route-directe> est incorrecte, mais le récepteur-SMTP connaît la destination exacte. Dans un tel cas, l'une des réponses suivantes pourra être émise pour permettre à l'émetteur de contacter la bonne destination.

251 User not local; will forward to <route-directe>

Cette réponse indique que le récepteur-SMTP sait que la boîte-aux-lettres du destinataire est hébergée sur un autre hôte et indique le chemin d'accès correct de cette boîte aux lettres pour des messages futurs. Notez que l'hôte, ou l'utilisateur ou les deux peuvent être différents de ceux de la requête originale. Le récepteur prend dans ce cas la responsabilité de délivrer le message actuel à la bonne destination.

551 User not local; please try <route-directe>

Cette réponse indique que le récepteur-SMTP sait que la boîte-aux-lettres du destinataire est sur un autre hôte et signale le chemin d'accès correct à utiliser pour joindre cette boîte-aux-lettres. Notez que l'hôte, ou l'utilisateur ou les deux peuvent être différents de ceux de la requête originale. Dans ce cas, le récepteur refuse d'accepter des messages pour cet utilisateur, et l'émetteur devra soit rediriger explicitement son courrier conformément à l'information fournie ou arrêter la transaction et retourner un message d'erreur à son utilisateur.

L'exemple 2 illustre l'utilisation de ces réponses.

Exemple 2 / Exemple de réémission

Soit

      S: RCPT TO:<Postel@USC-ISI.ARPA>
      R: 251 User not local; will forward to <Postel@USC-ISIF.ARPA>

Ou

      S: RCPT TO:<Paul@USC-ISIB.ARPA>
      R: 551 User not local; please try <Mockapetris@USC-ISIF.ARPA>

3.3. VERIFICATION DE BOITES ET EXPANSION DE LISTE DE DIFFUSION

SMTP propose au titre de fonctionnalités additionnelles, des commandes pour vérifier un nom de destinataire ou pour expanser une liste de diffusion. Ces deux opérations peuvent être menées respectivement avec les commandes VRFY et EXPN, qui acceptent toutes deux un argument sous forme de chaîne de caractères. Pour la commande VRFY, la chaîne en argument est un nom d'utilisateur, la réponse à cette commande pouvant inclure le nom complet de cet utilisateur et devant fournir une adresse complètement qualifiée de boîte-aux-lettres pour cet utilisateur. Pour la commande EXPN, la chaîne en argument identifie une liste de diffusion, la réponse multilignes à cette commande pouvant inclure le nom complet des utilisateurs et DEVANT inclure l'ensemble des boîtes-aux-lettres contenues dans la liste.

La sémantique de l'expression "nom d'utilisateur" est assez floue, cette expression étant employée en parfaite connaissance de cause. Si un hôte implémente la commande VRFY ou EXPN, alors on suppose que l'hôte reconnaît au moins les boîtes-aux-lettres locales en tant que "noms d'utilisateur". Mais un hôte peut utiliser une définition toute autre pour les "noms" de ses utilisateurs.

Sur certains hôtes la distinction entre une liste de diffusion et une série d'alias pour une boîte-aux-lettres unique n'est pas très claire, dans la mesure ou les structures de données standard peuvent accueillir ces deux types d'entrées, et qu'il est possible de constituer des listes de diffusion réduites à une seule boîte-aux-lettres. Lorsqu'une requête d'expansion d'une liste de diffusion est lancée, une réponse positive peut être renvoyée si, lorsqu'un message est reçu pour cette liste, ce dernier est transmis simultanément à tous les participants inscrits dans cette liste. Dans tout autre cas, un message d'erreur devra être renvoyé (ex., "550 Ceci est un utilisateur, pas une liste de diffusion"). Lorsqu'une requête de vérification d'un utilisateur est lancée, un réponse positive pourra être donnée si la réponse peut être formée d'une liste ne contenant qu'un seul nom. Dans tout autre cas une erreur devra être renvoyée (ex., "550 Ceci est une liste de diffusion, pas une boîte aux lettres").

Dans le cas d'une réponse multilignes (réponse courante à une commande EXPN), chaque ligne ne doit spécifier qu'une boîte-aux-lettres et une seule. Dans le cas d'une requête ambiguë, par exemple, "VRFY Dupont", sur un hôte ou deux personnes nommées Dupont sont hébergées, la réponse devra être de type "553 utilisateur ambigu".

L'exemple 3 illustre l'utilisation de la commande VRFY.

Exemple 3 / Exemple de Vérification d'un Nom d'Utilisateur

Soit

            S: VRFY Smith
            R: 250 Fred Smith <Smith@USC-ISIF.ARPA>

Ou

            S: VRFY Smith
            R: 251 User not local; will forward to <Smith@USC-ISIQ.ARPA>

Ou

            S: VRFY Jones
            R: 550 String does not match anything.

Ou

            S: VRFY Jones
            R: 551 User not local; please try <Jones@USC-ISIQ.ARPA>

Ou

            S: VRFY Gourzenkyinplatz
            R: 553 User ambiguous.

L'exemple 4 illustre quant à lui l'expansion de liste de diffusion.

Exemple 4 / Exemple d'expansion d'une liste de messagerie

Soit

            S: EXPN Example-People
            R: 250-Jon Postel <Postel@USC-ISIF.ARPA>
            R: 250-Fred Fonebone <Fonebone@USC-ISIQ.ARPA>
            R: 250-Sam Q. Smith <SQSmith@USC-ISIQ.ARPA>
            R: 250-Quincy Smith <@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>
            R: 250-<joe@foo-unix.ARPA>
            R: 250 <xyz@bar-unix.ARPA>

Ou

            S: EXPN Executive-Washroom-List
            R: 550 Access Denied to You.

L'argument en chaîne de caractères des commandes VRFY et EXPN ne peut ici être plus "cadré" du fait de la différence d'implémentation des concepts de noms d'utilisateurs et de listes de boîtes-aux-lettres suivant les plates-formes. Sur certains systèmes, l'argument d'une commande EXPN pourrait être de façon tout à fait appropriée le nom d'un fichier contenant la liste de diffusion, mais encore à ce titre, il existe de multiples conventions de nommage pour les fichiers dans le monde Internet.

Les commandes VRFY et EXPN ne font pas partie de l'implémentation minimale de SMTP (voir Section 4.5.1). En outre, lorsqu'elles sont implémentées, aucune obligation n'est faite qu'elles sachent fonctionner au travers des différents relais de courrier.

3.4. EMISSION ET POSTAGE

Le but principal de SMTP est de délivrer des messages dans une boîte-aux-lettres d'un utilisateur. Un service assez similaire existant sur certains hôtes consiste à délivrer les messages directement sur le terminal de l'utilisateur (pourvu que cet utilisateur soit actuellement "loggé" sur l'hôte en question). Le routage d'un message vers une boîte-aux-lettres d'un utilisateur est appelé "postage", l'envoi du même message sur le terminal de l'utilisateur est appelé "transfert". Du fait que, dans de nombreux hôtes, l'implémentation du transfert est quasiment identique à celle du postage, ces deux fonctions ont été combinées dans SMTP. Toutefois, les commandes de transfert n'ont pas été reportées dans la définition de l'implémentation minimale (voir Section 4.5.1). Les utilisateurs devront avoir dans tous les cas la possibilité de contrôler l'inscription des messages provenants de transferts sur leur écran. La plupart des hôtes ont une fonction qui permettent de désactiver l'écriture de ces messages.

Les trois commandes qui suivent sont définies dans le cadre de ce fonctionnement optionnel en mode transfert. Elles sont utilisées dans la transaction en lieu et place de la commande MAIL et informent le récepteur-SMTP qu'une interprétation particulière doit être fait pour cette transaction :

SEND <SP> FROM:<reverse-path> <CRLF>

La commande SEND demande que le message soit affiché sur le terminal de l'utilisateur. Si l'utilisateur n'est pas connecté au système (ou n'accepte pas l'affichage interactif des messages sur son terminal), une réponse de code 450 sera renvoyé en réponse à la commande RCPT. La transaction est considérée comme aboutie lorsque le message est affiché sur le terminal.

SOML <SP> FROM:<reverse-path> <CRLF>

La commande Send Or MaiL demande que le message soit affiché sur le terminal utilisateur si ce dernier est connecté au système (et accepte l'affichage interactif de messages sur ce terminal). Dans le cas contraire, le message doit être redirigé vers sa boîte-aux-lettres. La transaction est considérée comme aboutie si le message est soit affiché sur le terminal, soit déposé dans la boîte-aux-lettres.

SAML <SP> FROM:<reverse-path> <CRLF>

La commande Send And MaiL demande que le message soit affiché sur le terminal utilisateur si ce dernier est connecté au système (et accepte l'affichage interactif de messages sur ce terminal). Dans tous les cas le message doit être copié dans sa boîte-aux-lettres. La transaction est considérée comme aboutie si le message a au moins pu être copié dans la boîte-aux-lettres. Les réponses à ces commandes sont les mêmes que pour la commande MAIL.

3.5. OUVERTURE ET FERMETURE DE LIAISON

Dès que le canal de transmission est établi, un échange de protocole s'assure que l'hôte demandeur communique bien avec l'hôte attendu. Les deux commandes suivantes sont utilisées dans les phases d'établissement et de fermeture de canal :

HELO <SP> <domain> <CRLF>
QUIT <CRLF>

Par la commande HELO, l'hôte émetteur s'identifie ; cette commande peut être assimilée à l'expression "Bonjour, je suis le domaine <domaine>".

Exemple 5 / Exemple d'ouverture de connexion

       R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready
       S: HELO USC-ISIF.ARPA
       R: 250 BBN-UNIX.ARPA

Exemple 6 / Exemple de fermeture de connexion

         S: QUIT
         R: 221 BBN-UNIX.ARPA Service closing transmission channel

3.6. RELAIS DE MESSAGES

Le chemin d'acheminement des messages peut être une "route" de la forme "@UN,@DEUX:JOE@TROIS", dans laquelle UN, DEUX, et TROIS sont des noms d'hôtes. Cette forme est employée dans le but d'accentuer la différence formelle entre une adresse et une route. La boîte-aux-lettres est une adresse absolue, la route est une information permettant d'y accéder. Ces deux concepts doivent toujours être dissociés.

Dans le concept, les éléments de la route sont déplacés vers la route inverse au fur et à mesure que le message circule à travers les serveurs-SMTP intermédiaires. La route inverse est donc construite comme la route prise en sens inverse, (c-à-d., une route partant de la position courante et aboutissant à l'émetteur du message). Lorsqu'un serveur-SMTP supprime son identifiant de la route et l'insère dans la route inverse, il doit utiliser le nom sous lequel il est connu du destinataire du message, et non de l'émetteur, dans le cas où ces deux noms diffèrent.

Lorsque le message arrive sur un serveur-SMTP, et que le premier élément de la route (la première destination intermédiaire) ne correspond pas à la machine courante, cet élément ne doit pas être effacé de la route et est utilisé par le serveur-SMTP comme nouvelle destination de réémission. Dans tous les cas, le serveur-SMTP courant ajoute son propre identifiant à la route inverse.

Par cette technique des routes, les récepteurs-SMTP reçoivent des messages qu'ils doivent relayer vers d'autres serveurs-SMTP. Le récepteur-SMTP peut accepter ou refuser de jouer ce rôle de relais de la même manière qu'il accepte ou refuse de traiter les message de tel ou tel utilisateur local. Le récepteur-SMTP transforme l'argument de commande en déplaçant son propre identifiant de la route vers la première position de la route inverse. Le récepteur-SMTP devient à ce moment un émetteur-SMTP, établit un canal de transmission vers le prochain agent SMTP mentionné dans la route, et lui envoie le message.

Le premier hôte mentionné dans la route inverse doit être l'agent SMTP émettant les commandes, le premier hôte d'une route doit être l'agent SMTP recevant ces commandes.

Notez que les routes et routes inverses apparaissent à la fois dans les commandes et les réponses SMTP, mais pas nécessairement dans le corps de message. C'est-à-dire, La mention de ces chemins sous cette syntaxe précise n'est pas obligatoire dans les champs "To:" , "From:", "CC:" de l'en-tête du corps de message.

Si un serveur-SMTP a accepté de relayer un message, puis s'aperçoit que la route est incorrecte ou que le message ne peut pas poursuivre son chemin quelle qu'en soit la raison, alors il devra composer un message "undeliverable mail" et le renvoyer à l'origine (dont il connaît la route par la route inverse).

Ce message de notification doit être émis au nom du serveur-SMTP sur cet hôte. Bien sûr, les serveurs-SMTP ne devront pas provoquer l'émission de tels messages de notification si le message en faute est lui-même un message de notification d'erreur. Une manière d'éviter l'établissement de boucles de rapports d'erreur est de forcer une route inverse vide dans la commande MAIL émettant un tel message. De même, lorsqu'un tel message est relayé, il est alors permis de laisser la route inverse vide. Une commande MAIL affichant une route inverse vide s'exprime ainsi :

MAIL FROM:<>

Un message de notification d'un courrier "undeliverable" est montré dans l'exemple 7. Cette notification est la réponse à un message émis par JOE sur l'hôte HOSTW et envoyé via l'hôte HOSTX à l'hôte HOSTY avec des instructions pour un relais vers l'hôte HOSTZ. L'exemple montre la transaction entre l'hôte HOSTY et l'hôte HOSTX, qui constitue la première étape de la notification d'erreur.

Exemple 7 / Exemple de notification d'impossibilité de livraison de courrier

         S: MAIL FROM:<>
         R: 250 ok
         S: RCPT TO:<@HOSTX.ARPA:JOE@HOSTW.ARPA>
         R: 250 ok
         S: DATA
         R: 354 send the mail data, end with .
         S: Date: 23 Oct 81 11:22:33
         S: From: SMTP@HOSTY.ARPA
         S: To: JOE@HOSTW.ARPA
         S: Subject: Mail System Problem
         S:
         S:   Sorry JOE, your message to SAM@HOSTZ.ARPA lost.
         S:   HOSTZ.ARPA said this:
         S:    "550 No Such User"
         S: .
         R: 250 ok

3.7. DOMAINES

Les domaines sont un concept récent dans le système de courrier de l'ARPA Internet. L'utilisation du système de domaines transforme l'espace d'adressage depuis un espace plat global de chaînes de caractères nommant des hôtes vers une structure hiérarchisée arborescente d'adresses globales. Le nom d'hôte est remplacé par un "domaine" et un identifiant d'hôte, couple représenté par une séquence d'éléments de domaines sous forme de chaînes de caractères, séparés par des points, et dans un ordre conventionnellement établi du plus spécifique au plus général.

Par exemple, "USC-ISIF.ARPA", "vf.eisti.FR", et "PC7.LCS.MIT.ARPA" sont des domaines à part entière.

Lorsque des noms de domaines figurent dans des messages SMTP seuls les noms officiels sont autorisés, et l'usage des pseudo ou alias n'est pas permis.

3.8. ECHANGE DES RôLES

La commande TURN peut être utilisée pour échanger les rôles des deux programmes en communication via le canal de transmission établi.

Si un programme-A est actuellement l'émetteur-SMTP, envoie la commande TURN et reçoit une réponse OK (250), alors le programme-A devient le récepteur-SMTP. Si un programme-B est actuellement en position de récepteur-SMTP, reçoit une commande TURN à laquelle il répond par une réponse OK (250), alors le programme-B devient l'émetteur-SMTP.

L'émission d'une réponse 502 indique que le récepteur refuse l'échange de rôles.

Notez toutefois que l'implémentation de cette commande est optionnelle. Elle ne devra d'ailleurs pas être utilisée en temps normal lorsque le canal de transmission est établi sous TCP. Cependant, lorsque le "coût" d'établissement d'un canal de transmission est élevé, cette commande peut s'avérer utile. Par exemple, lorsque le canal de transmission s'appuie sur le réseau commuté public (téléphone), surtout lorsque certains hôtes font "tourner" une liaison vers un certain nombre d'autres hôtes pour mettre à jour les échanges de messages.



Crédits : J. Postel / ISI
Traduction : Valéry Frémaux / EISTI
Edition originale : Août 1982. Version FR : Avril 1998
Remplace : RFC 788, 780, 772