Page suivante Page précédente Table des matières

6. Expériences avec SMTP

Par Jan Stumpel JW.Stumpel@inter.nl.net

Expériences avec SMTP (ou : Installation du courrier électronique sur un réseau domestique, suite...)

6.1 Introduction

J'ai reçu beaucoup de réactions à la suite de Installation du courrier électronique sur un réseau domestique avec Exim dans le numéro 43 de Linux Gazette.

La plupart disaient deux choses :

Je me suis donc "remis à la planche à dessin" pour étudier à la loupe ce qui se passe quand un e-mail est envoyé. De ce fait, cet article vous explique ce que vous devez faire pour que la configuration exposée dans celui de LG 43 fonctionne réellement (je crois) ... et aussi pourquoi.

6.2 SMTP

SMTP, comme vous le savez certainement, signifie "Simple Mail Transfer Protocol". C'est la méthode grâce à laquelle le courrier électronique est échangé entre les ordinateurs sur l'Internet. La communication de base entre eux (échange de paquets élémentaires et de flux de données) est l'affaire de TCP/IP. Le protocole SMTP est implémenté "au-dessus de" TCP/IP dans le but de transmettre des messages entre les machines. Livrons-nous à quelques expériences pour voir comment SMTP fonctionne.

Telnet fait partie des outils de base permettant d'établir des connexions TCP/IP. Si vous tapez : telnet hôte port votre ordinateur se connecte à celui qui s'appelle hôte sur le port port. Cela revient à passer un coup de téléphone au bureau d'une société "hôte" et à demander à parler à M. Port. Votre appel ne sera couronné de succès que si M. Port est présent et qu'il accepte de vous répondre. De la même façon, un programme ("démon") doit être actif sur l'autre ordinateur, "à l'écoute" des tentatives de connexions sur le port spécifié, autrement, vous obtiendrez le message "connexion refusée".

port est un nombre (sur 16 bits). Certains numéros de port ont été réservés pour certains services. Le courrier électronique (SMTP) fait appel au port 25, et le démon qui l'écoute est le MTA (Mail Transport Agent : sendmail, exim, qmail, etc...). Si votre Linuxette se nomme ciel, vous appelez son service SMTP en tapant : telnet ciel 25.

Vous pouvez le faire depuis une autre machine ou en passant par un réseau (LAN ou Internet). En fait, vous n'en avez pas besoin, car vous pouvez aussi tester ceci en lançant telnet depuis l'ordinateur même sur lequel tourne le MTA. Il est même possible de faire : telnet ciel smtp car telnet détermine le numéro de port de SMTP en allant voir dans le fichier /etc/services. Ce qui donnera quelque chose comme :

Trying 192.168.1.1...
Connected to ciel.home.
Escape character is '^]'.
220 ciel.home ESMTP Exim 3.03 #1 Sun, 8 Aug 1999 12:47:24 +0200

Ceci indique que j'utilise exim 3.03 (je l'ai récemment mis à jour depuis la version 2.05 pour une bonne raison, cf la section 5 infra). Si je lance un telnet de la même façon vers le serveur de mail de mon FAI, je peux voir qu'ils font tourner Sendmail 8.8.8/1.19.

Après la ligne commençant par 220, il n'y a aucune invite ou quoi que ce soit d'autre ; le MTA attend vos instructions. Alors, que faire après ? Essayez d'entrer help. Cela va provoquer cette réaction :

help
214-Commands supported:
214- HELO EHLO MAIL RCPT DATA
214  NOOP QUIT RSET HELP

Ce sont les éléments du langage de commande SMTP, ou "protocole", qui sont gérés par votre site. Pas exactement l'opulence ! SMTP est réellement un protocole "simple". Les commandes sont décrites dans le standard Internet qu'est la RFC821. Quelques "extensions" ont été ajoutées par la suite dans d'autres RFC, par exemple, la RFC1869. On dit des systèmes qui acceptent les commandes étendues qu'ils gèrent le "SMTP étendu", ou ESMTP (Extended SMTP). On en est informé par leur d'accueil comme on l'a vu précédemment avec Exim 3.03. Il n'y a pas de très grandes différences entre SMTP et ESMTP.

Pour terminer la connexion SMTP, envoyez la commande QUIT.

6.3 Echange de salutations : les commandes HELO/EHLO

Après la ligne d'accueil (qui commence par 220) du système distant, vous êtes censé envoyer des commandes. La première devrait être HELO, ou, si vous traitez avec un système ESMTP, EHLO, la version plus récente. Elle devrait avoir votre nom de domaine pour argument :

EHLO votre_nom_de_domaine

Si vous êtes à la maison, sans nom de domaine officiel, lequel allez-vous prendre ? En fait, n'importe quoi fait l'affaire, y compris celui que vous vous êtes choisi, comme par exemple ciel.home.

Essayons-le avec le serveur SMTP de notre FAI en tapant telnet smtp.fai.com 25 ou ce qu'il vous plaira. Après le message de bienvenue, entrez : EHLO ciel.home

Nous obtenons alors un message d'accueil plus ou moins élaboré, comme :

250-smtp.fai.com Hello customer123.dialin.fai.com [xxx.yyy.zzz.123], pleased to meet you
250-EXPN
250-VERB
250-8BITMIME
250-SIZE

Les salutations démarrent par des "250" : c'est le code "OK" pour SMTP. Dans le cas présent, on nous accueille également en nous appelant par notre nom de domaine temporaire (customer123.dialin.isp.com) ainsi que l'adresse IP (xxx.yyy.zzz.123) qui nous a été dynamiquement attribuée lors de l'ouverture de la connexion ppp. L'autre système obtient ces renseignements de la couche de transport du protocole TCP/IP. Dans le cas d'une commande EHLO (ESMTP), il envoit aussi quelques lignes "250" pour annoncer quelles commandes supplémentaires il reconnaît, en dehors du strict minimum requis par la RFC821.

En règle générale, les serveurs de courrier ne se préoccupent absolument pas de l'argument des commandes EHLO ou HELO ("ciel.home"). Ce qui revient à dire qu'en pratique, les transactions EHLO/HELO réussissent toujours. Dans le cas où l'autre système ne veut pas traiter avec vous, il a déjà refusé la connexion telnet hôte smtp.

6.4 Envoi du courrier

Il est possible d'envoyer un message électronique "à la main" via une simple connexion telnet hôte smtp sur un serveur, sans recourrir à un MTA, ni à un MUA, tel que pine. Essayons cela d'abord (pour des raisons de sécurité) au sein de notre propre réseau. Bien sûr, dans ce cas, il faudra que tourne un serveur (MTA). L'utilisateur joe envoit un message à l'utilisateur emi, ce qui va se dérouler en trois étapes. Tout d'abord la commande MAIL FROM: (sous SMTP, elle sont insensibles à la casse, donc vous pourriez tout aussi bien taper mail from:).

MAIL FROM: joe@home
250 <joe@home> is syntactically correct

En guise de réponse, nous avons une ligne "250", donc tout va bien. Ensuite, la commande RCPT TO:, qui spécifie quel sera le destinataire.

RCPT TO: emi@home
250 <emi@home> is syntactically correct

Encore 250, bien. Enfin, nous entrons le message lui-même, grâce à la commande DATA :

DATA
354 Enter message, ending with "." on a line by itself

La réponse "354" nous invite à saisir les données du message. Ce n'est pas uniquement le texte (ou "corps") du message ! Ces "données" incluent aussi les champs d'en-tête, comme Subject:, To:, Cc:, et From:. La structure d'un message est définie dans un autre standard Internet, la RFC822. Stricto sensu, cela ne regarde plus SMTP. Tout ce qui l'intéresse, c'est l'enveloppe du message, à savoir, les paramètres passés aux commandes MAIL FROM: et RCPT TO:. Par conséquent, le champ To: inclus dans le message et l'adresse RCPT TO: inscrite sur l'enveloppe sont en principe deux choses différentes. On peut réellement les différencier (n'essayez qu'avec des messages locaux, s'il vous plaît !). Donc, par exemple, après la réponse, nous pouvons taper un message avec des "faux en-têtes" :

To: Ma Fille
From: Ton Papa
               <--(une ligne vide sépare les en-têtes du corps)
Joyeux Anniversaire~!
.              <--(un point au début d'une ligne termine le message)

Il sera rapidement distribué à l'utilisateur emi. Si elle l'ouvre avec pine, elle verra les adresses To: Ma Fille et From: Ton Papa.

Les problèmes vont surgir lorsqu'elle tentera d'y répondre. Les réponses des utilisateurs ne partent pas vers l'adresse "from de l'enveloppe" (le MAIL FROM: de SMTP), mais vers l'adresse From: qui fait partie des données du message. Pour simplifier, pine va penser que "Ton" et "Papa" sont deux adresses différentes et se plaindre quant au fait qu'ils devraient être séparés par une virgule, pas par un espace ! Et bien entendu, aucun compte "Ton" ou "Papa" n'est enregistré sur cette machine, ou sur n'importe quelle autre. La manipulation ou l'omission des diverses adresses est un terrain d'action fertile pour les plaisantins et autres spammeurs.

6.5 Configuration du courrier pour votre réseau domestique

A présent, nous arrivons à ce qui n'allait pas dans mon article du numéro 43 de Linux Gazette. En dehors du "bug de pine" à propos duquel j'ai publié une note dans le numéro 44, les deux plus gros problèmes rencontrés par les lecteurs étaient :

Le MTA peut ne pas être actif du tout.

J'ai dit qu'on pouvait utiliser le client mail (c'est à dire pine) du côté Linux "tel qu'il est fourni". C'est vrai, mais l'ennui, c'est que chez beaucoup d'utilisateurs, le client mail n'est pas fourni tel quel, mais est déjà installé et utilisé. Cela signifie souvent que dans sa configuration, on trouvera une affectation à un "serveur SMTP" pointant vers l'adresse de celui du FAI. Dans un tel cas, c'est le client mail lui-même qui s'occupera des transactions SMTP (la plupart d'entre eux, en dehors de mail, peuvent le faire), et votre MTA ne sera pas utilisé du tout. De ce fait, il ne sera pas fait appel à votre filtre de transport et l'adresse From: au sein du message ne sera pas modifiée. Solution : affecter à "serveur SMTP" dans le client mail le nom de votre Linuxette, de façon à ce qu'il puisse passer les messages au MTA. Si on vous demande votre "adresse e-mail", donnez votre adresse locale, le filtre de transport d'exim la changera pour tout courrier sortant.

Le "From de l'enveloppe" n'est pas modifié.

Là était le gros problème. Comme je l'ai dit, l'échange d'e-mail avec un hôte SMTP met en oeuvre trois étapes :

Si tout se passe bien, le système distant répondra "OK" (c'est à dire, "250") aux deux premières. Enfin, en général ! Beaucoup de serveurs de courrier (voire la plupart), y compris celui de mon propre FAI, ne tiennent pas compte de l'adresse du champ MAIL FROM:. Pour eux, c'est toujours "OK". Quelques-uns vérifient que la partie domaine de cette adresse existe bien. Dans le cas contraire, le message est refusé. Si c'est ce qui se passe chez votre FAI, la configuration décrite dans mon précédent article ne fonctionnera tout simplement pas pour le courrier sortant. Si votre FAI ne vérifie pas, mais que vous envoyez du courrier vers un destinataire qui le fasse, il n'arrivera pas à bon port et vous n'en serez pas averti.

En clair, il faut absolument arranger non seulement l'adresse From: incluse dans le message (à l'aide du programme outfilt décrit dans mon article précédent), mais aussi celle du champ MAIL FROM: (le "From: de l'enveloppe"). Il y a deux manières de le faire.

Si vous utilisez exim 2.05 ou antérieur, la seule façon est d'ajouter une ligne dans la dernière section, REWRITE CONFIGURATION, de exim.conf :

*@home joe.bloggs@fai.com F

Ceci va remplacer toutes les adresses locales MAIL FROM: par celle du FAI. Malheureusement, avec cette méthode, autant le courrier sortant que local est modifié. Vous pouvez vous en accommoder, les utilisateurs ne voyant jamais "le From: de l'enveloppe" quand ils ouvrent un message. Les réponses iront à la bonne adresse (le From: du message). Cependant, si quelqu'un se trompe en tapant une adresse locale, de sorte qu'un courrier est envoyé vers un utilisateur local fantôme, un message d'erreur ne sera pas expédié vers le FAI, mais localement.

Par contre, avec exim 2.10 ou ultérieur, vous pouvez ajouter une option à la sous-section remote_smtp de la section TRANSPORTS CONFIGURATION du fichier exim.conf. Ces versions plus récentes d'exim permettent au "From: de l'enveloppe" d'être modifié pour le courrier sortant uniquement. Après la ligne driver~=~smtp, insérez une ligne

~; return_path = "joe.bloggs@fai.com"
.

Comme cette méthode est bien meilleure, si vous utilisez exim 2.05, je vous engage à procéder à une mise à jour. Dans le cas de la distribution Debian, on peut trouver la dernière version (au moment de l'écriture de ces lignes, 3.03) sur http://www.debian.org, parmi les paquetages "instables" (ne vous inquiétez pas, il est plutôt stable). La mise à jour se fait sans douleur.

Les deux méthodes décrites ci-dessus engendrent une adresse du "From: de l'enveloppe" fixe, tout comme le programme outfilt de mon précédent article le faisait pour le "From: du message". Le présent cas de figure repose sur un compte e-mail unique. Si les utilisateurs de la maisonnée sont connus du monde extérieur par différentes adresses e-mail, la configuration devient un peu plus ardue, mais cela reste faisable. Il serait trop long d'en expliquer toutes les possibilités ici, jetez donc un coup d'oeil au "développement de chaînes" et à "l'analyse de fichiers" dans la documentation d'exim.

Copyright © 1999, Jan Stumpel. Publié dans le numéro 45 de la Linux Gazette, septembre 1999.

Traduction française de Joël Sagnes.


Page suivante Page précédente Table des matières