Sendmail  

Dès qu'il est question de courrier sous Unix, Sendmail est le standard de facto, bien que certains lui préfèrent qmail ou smail. La conception de sendmail fait qu'il est capable d'administrer le courrier à l'échelle d'un campus tout en donnant la possibilité de ne l'utiliser que pour des besoins beaucoup plus modestes : une simple machine Linux reliée épisodiquement à l'Internet par une connexion PPP, par exemple...

De nombreux utilisateurs Linux tremblent à la seule pensée de devoir le configurer et il est vrai que l'on peut souvent lire des choses aussi encourageantes que "On dit souvent que celui qui n'a jamais édité un fichier standard sendmail.cf n'est pas un véritable administrateur UNIX. La légende dit aussi qu'il ne faut pas le faire deux fois, sous peine de devenir fou".
Cette réputation vient de la syntaxe, hautement hermétique, du langage utilisé pour décrire les règles utilisées par sendmail : ce fameux fichier sendmail.cf n'étant qu'une liste de ces règles.
Face à la complexité de cette syntaxe, plusieurs solutions ont vu le jour. Pour ma part, j'en connais au moins deux :

Dans cet article, nous utiliserons cette dernière solution pour la génération de notre fichier sendmail.cf. Bien entendu, cet article ne se veut pas exhaustif : le livre de référence fait quelques 1000 pages, est écrit serré et n'a pas beaucoup d'images... Non, mon but est de vous tenter de faire l'expérience de sa configuration qui, vous vous en rendrez compte, est bien plus facile qu'il n'y para"t, si on se cantonne au minimum.

Pourquoi passer à sendmail alors que tout fonctionne bien avec des solutions comme Netscape ou Xfmail ? Sur une machine n'ayant qu'un seul utilisateur, moi, est-ce bien la peine d'utiliser un programme dont la vocation est de distribuer le courrier sur un campus universitaire ayant des centaines de machines ?
La réponse est, évidemment, oui. Pas par snobisme ou pour         " jouer dans la cour des grands ", mais d'abord parce qu'il s'agit d'un beau petit défi, ensuite parce que les 2 solutions que sont Netscape et Xfmail présentent un grave défaut : elles sont fermées. Vous devez récupérer, envoyer et consulter les messages avec un unique produit, en général incompatible avec les autres.
Avec sendmail, vous envoyez les messages en attente et récupérez les nouveaux dans votre bo"te aux lettres et tout cela en utilisant le programme d'écriture/lecture de votre choix. Ici, le transport du courrier est séparé de sa création et de sa consultation. Ceci garantit que vous pourrez utiliser tous les logiciels Unix écrits pour le mail, vous pourrez aussi automatiser l'envoi de courrier à l'aide de scripts shells ou autres... Alors, certes, c'est un peu d'effort, mais pas plus que d'arriver au bout d'un tableau de Quake... Et c'est sûrement plus rigolo.

1 Survol du fonctionnement de sendmail

Je disais ci-dessus que sendmail délivrait les nouveaux messages dans votre bo"te aux lettres. En fait, c'est faux : sendmail utilise un autre programme pour délivrer le courrier qui lui est arrivé. Sous Linux, ce programme est, le plus souvent, procmail. Nous considérerons ici qu'il est correctement configuré.
De plus, si notre machine Linux est coupée du monde, il faut bien " alimenter " sendmail avec les nouveaux messages qui sont sur le serveur POP de notre Fournisseur d'Accès Internet (F.A.I). Là encore, un autre programme entre en jeu, il s'agit de fetchmail qui remplace maintenant l'ancien programme popclient qu'il ne faut plus employer pour des raisons de sécurité (le Guide du Rootard cite un autre programme de récupération : gwpop). fetchmail, dans ses versions récentes, dispose de nombreuses fonctionnalités et est capable de gérer d'autres protocoles que POP, mais nous ne l'utiliserons qu'à son minimum.
En résumé, une utilisation typique pour une machine reliée par PPP sera :

o  écriture de courriers ;
o  connexion au F.A.I. ;
o  expédition, sur l'Internet, des courriers avec sendmail ;
o  récupération des nouveaux courriers, auprès du serveur POP du F.A.I., avec fetchmail ;
o déconnexion ;
o  lecture des nouveaux courriers.
On notera que les points 2 à 5 peuvent être regroupés en un seul script. D'autre part, il faut bien comprendre que sendmail n'intervient pas seulement au point 3, mais à chaque fois qu'il y a transport de courrier sur notre machine. Ainsi, lorsque vous écrivez du courrier destiné à l'extérieur et que vous l'envoyez tout en étant déconnecté, c'est sendmail qui se charge de le mettre dans une file d'attente. C'est le contenu de cette file qui sera envoyée au point 3. Lorsque fetchmail récupère les nouveaux courriers au point 4, c'est sendmail qui les dirige vers votre bo"te aux lettres en utilisant procmail.

1.1 Fichiers utilisés par sendmail

Hormis le trop fameux /etc/sendmail.cf déjà évoqué, sendmail utilise un certain nombre de fichiers. En fait, dans le cas qui nous préoccupe, ce nombre a été réduit à la portion congrue : 6 fichiers suffisent, et encore, on pourrait s'en sortir avec 4... A ces 6 fichiers, il convient d'ajouter le fichier des macros m4 qui nous permettront de générer le fichier /etc/sendmail.cf, mais cette opération réalisée, il n'est plus utilisé. Je vous conseille cependant de le garder précieusement.
Bien sûr, les différentes pages du manuel ne sont pas comptées ici, ce qui ne veut surtout pas dire qu'il ne faut pas les lire.
Comme tout programme qui se respecte, sendmail utilise des fichiers trace qui permettent de repérer les éventuels disfonctionnement. Traditionnellement, il s'agit de /var/log/mail.err et /var/log/mail.log mais certaines installations les rassemblent en un seul fichier /var/log/maillog.
Le fichier /var/log/sendmail.st permet de consulter les statistiques grâce à la commande mailstats qui fait partie de la distribution.
Le fichier /usr/lib/sendmail.hf contient les messages affichés par sendmail.
Bien qu'il ne fasse pas partie de sendmail à proprement parler, le fichier /etc/hosts est utilisé.
Le fichier /etc/genericstable permet de préciser les réécritures des adresses locales.
Le fichier /etc/nsswitch.conf sera utilisé ici pour résoudre le problème des " DNS lookup " lors du dépôt des messages dans la file d'attente.
Si vous lisez des documents traitant de sendmail, vous verrez aussi évoqué des fichiers portant les noms de sendmail.dw, sendmail.ct, etc. Ils ne nous sont pas utiles ici.
Maintenant la bonne nouvelle : vous n'avez que sendmail.cf et /etc/genericstable à configurer, et, éventuellement, /etc/aliases et /etc/hosts à vérifier.
Enfin, avec sendmail, viennent deux programmes : mailstats qui affiche les statistiques (taille des messages reçus et envoyés, etc.) et mailq qui affiche le contenu de la file d'attente des messages à envoyer.

2 Installation et configuration de sendmail

2.1 Installation

Ainsi que nous l'avons dit plus haut, sendmail ne fournit pas de programme permettant de délivrer le courrier. Pour cela, il faut utiliser un autre programme : le plus courant s'appelle procmail. Ces deux programmes sont disponibles pour toutes les distributions Linux : sous forme de paquetages rpm, deb ou tarballs. Utilisez la méthode préconisée par votre distribution (rpm, dpkg ou tar). Vérifiez aussi que le paquetage mailx est installé car c'est lui qui contient le programme mail vous permettant d'envoyer du courrier au moyen de shells scripts ou en ligne de commande.
Normalement, sendmail s'installe sous /usr/sbin/ en suid, il appartient à root et au groupe mail. Les programmes mailstats et mailq s'installent dans /usr/bin/ et appartiennent tous deux à root avec droits d'exécution pour tous. En fait, mailq n'est pas un programme mais un lien vers sendmail -bp. Enfin, procmail se trouve aussi dans ce répertoire et est suid.
Assurez-vous qu'un répertoire /usr/lib/sendmail-cf a été créé et qu'il contient plusieurs sous-répertoires. Parmi eux, /usr/lib/sendmail-cf/cf est celui qui nous intéresse au premier chef. Bien sûr, de nombreuses documentations sont placées dans /usr/doc/sendmail et les pages du manuel de sendmail et de procmail sont dans leurs emplacements habituels.  Si /usr/lib/sendmail-cf n'existe pas, installez le paquetage correspondant aux fichiers de configuration (sendmail-cf*.rpm pour la Red Hat). De même, avec cette distribution Linux, la documentation ne sera présente que si vous avez installé le paquetage sendmail-doc*.rpm.
Normalement, l'installation aura aussi modifié vos fichiers de démarrage afin de lancer le démon sendmail lors du boot de votre machine (vérifiez les messages qui s'affichent). Selon les distributions, des outils existent pour préciser quels démons doivent être lancés au démarrage (par ex. tksysv ou linuxconf avec Red Hat). Pour utiliser sendmail, vous devez vous assurer que les démons network et sendmail tournent.
Vérifiez que le préprocesseur m4 est bien intallé sur votre machine (normalement dans /usr/bin) car il sera nécessaire pour créer le fichier /etc/sendmail.cf.
Le répertoire /usr/lib/sendmail-cf/ostype doit contenir un fichier linux.m4 qui définit des constantes propres à Linux, notamment celles indiquant le chemin de l'emplacement de procmail. Ne modifiez pas ce fichier !

2.2 Création du fichier /etc/sendmail.cf

Pour tout ce qui suit, je suppose que le nom de votre machine est machine, que votre nom de domaine est domaine.fr, que votre nom de login est moi et que votre compte chez votre fournisseur d'accès est ego.
La machine de votre fournisseur à laquelle vous envoyez vos courriers s'appelle mail.fai.fr
Avec l'utilisation des macros m4, la démarche est plutôt simple : sous root, on crée un fichier config.mc dans le répertoire /usr/lib/sendmail-cf/cf.
Ce fichier se borne à donner des valeurs à certaines constantes et à définir certaines options.
Enfin, nous compilerons ce fichier pour qu'il génère /etc/sendmail.cf.
Sous le compte root, mettez-vous dans le répertoire /usr/lib/sendmail-cf/cf et, à l'aide de votre éditeur de texte favori, créez le fichier config.mc suivant :

include(`../m4/cf.m4')dnl
OSTYPE(`linux')dnl
define(`SMTP_MAILER_FLAGS', `e9')dnl
FEATURE(redirect)dnl
FEATURE(nocanonify)dnl
FEATURE(always_add_domain)dnl
FEATURE(local_procmail)dnl
GENERICS_DOMAIN(machine.domaine.fr machine localhost)
FEATURE(genericstable)
FEATURE(masquerade_envelope)dnl
define(`confCF_VERSION', `Mon cf a moi - 14/01/98')dnl
define(`confCON_EXPENSIVE', `True')dnl
define(`confME_TOO', `True')dnl
define(`confCOPY_ERRORS_TO', `Postmaster')dnl
define(`confDEF_CHAR_SET', `ISO-8859-1')dnl
define(`confMIME_FORMAT_ERRORS',`True')dnl
define(`SMART_HOST', `smtp8:[mail.fai.fr]')dnl
define(`confTO_QUEUEWARN', `24h')
MAILER(local)
MAILER(smtp)

Pendant que vous êtes dans les éditions, créez le fichier  /etc/genericstable suivant :

moi:    ego@mail.fai.fr
root:   ego@mail.fai.fr
news:   ego@mail.fai.fr

où l'espace suivant le " : " est un caractère de tabulation, pas un simple espace.
De même, modifiez, ou créez le fichier /etc/nsswitch.conf pour que chacune de ses entrées ne contienne que l'option files, sauf l'entrée hosts qui contiendra files dns (voir "man 5 nsswitch" pour plus d'informations sur le système des Name Service Switch).
Vérifiez le fichier /etc/aliases et assurez-vous qu'il contienne au moins les deux entrées suivantes :

MAILER-DAEMON:  postmaster
postmaster:     root

Quelques explications :
o La ligne include(`../m4/cf.m4') demande l'inclusion dans le fichier des macros m4, nécessaires au traitement.
o La ligne OSTYPE(`...') provoque l'inclusion des spécificités d'un système d'exploitation particulier (ce qui se trouve entre ` et ' doit être un nom de fichier ayant l'extension .m4 et présent dans /usr/lib/sendmail-cf/ostypes/ : notamment le fichier linux.m4 définit le chemin permettant à sendmail de retrouver le programme procmail, utilisé pour délivrer localement le courrier.
o Les lignes define servent à affecter des valeurs sous forme de cha"nes à des variables qui seront prises en compte par sendmail.
o Les lignes FEATURE servent à fixer certaines caractéristiques du fonctionnement de sendmail.
o Les lignes MAILER servent à spécifier les protocoles utilisés pour transporter notre courrier. Ici, on indique que l'on utilise le transport local et via smtp.
À partir de ce fichier, vous pouvez maintenant générer votre fameux fichier /etc/sendmail.cf/ : placez-vous dans le répertoire /usr/lib/sendmail-cf/cf/ (c'est là que se trouve votre fichier config.mc et faites :

m4 config.mc > /etc/sendmail.cf

Assurez-vous que le traitement ne détecte pas d'erreur de syntaxe et vérifiez par un ls -l /etc/sendmail.cf que ce fichier ait les permissions suivantes : -rw-------, qu'il appartient à l'utilisateur et au groupe root.

2.3 La transformation des adresses de l'expéditeur

Passons maintenant au fichier /etc/genericstable.Le rôle de celui-ci est lié à la caractéristique genericstable. Celle-ci permet aux adresses d'expéditeurs locaux d'être réécrites sous une autre forme : lorsque moi postera un message, l'adresse de l'expéditeur sera moi@machine.domaine.fr et on conçoit que celle-ci risque fort d'être refusée par certains serveurs car il s'agit d'une adresse invalide (machine.domaine.fr n'est pas valide en dehors de chez vous...). Qui plus est, l'utilisateur moi n'existe que sur votre machine, pour l'Internet il s'appelle ego@mail.fai.fr.
Pour effectuer cette transformation de moi.machine.domaine.fr en ego@mail.fai.fr, sendmail procède en deux temps :
o il vérifie que l'adresse de l'expéditeur appartient à l'un des domaines spécifiés par la macro GENERICS_DOMAIN
o si c'est le cas, il recherche une entrée correspondant à cet expéditeur dans la table générée à partir de /etc/genericstable.
Ici, donc, machine.domaine.fr faisant partie des GENERICS_DOMAIN, l'entrée moi est recherchée dans la table et remplacée par ego@mail.fai.fr. On notera que le même effet aurait été obtenu avec une adresse d'expéditeur égale à moi@machine, moi@localhost ou, tout simplement moi... Dans ce dernier cas, un mécanisme supplémentaire à lieu : moi étant une adresse non qualifiée, elle est considérée comme locale et la caractéristique always_add_domain commence par lui ajouter le nom du domaine et on se retrouve donc dans le premier cas...
Nous pourrons vérifier toutes ces transformations lorsque nous testerons plus loin notre configuration.
Pour des raisons d'efficacité, la table de réécriture doit être transformée en un format plus rapidement accessible à sendmail qu'un simple fichier texte. La commande permettant de générer la table au format voulu à partir du fichier texte est la suivante :

/usr/sbin/sendmail -bi -oA/etc/genericstable

Vous pourrez vérifier qu'elle a produit un fichier /etc/genericstable.db dont le contenu vous échappera sans doute...
Bien entendu, cette commande doit être faite après chaque modification du fichier texte original.
De même, si vous avez modifié le fichier /etc/aliases, il faudra alors utiliser la commande newaliases pour regénérer la base des alias.

2.4 Vérification du fichier /etc/hosts

L'étape suivante consiste à vérifier le contenu de votre fichier /etc/hosts qui doit comporter une ligne ressemblant à ça :

127.0.0.1  machine.domaine.fr localhost    machine

Attention : Le nom complet de votre machine doit être le premier de la liste.

2.5 Rechargement de sendmail

Si un démon sendmail tournait déjà sur votre machine, il faut le tuer puis le relancer afin que toutes ces modifications soient prises en compte. Pour cela, faites :

kill `head -1 /var/run/sendmail.pid`
/usr/sbin/sendmail -bd -os

3 Vérification de la configuration

Ce travail effectué, il reste à tester la configuration : plusieurs solutions s'offrent à nous. Chacune d'elles n'excluant pas l'utilisation des autres.

3.1 Test d'envoi de courrier local

Créez un fichier test.mail contenant les lignes suivantes :

Subject: test local

Première ligne de mon message

(sans oublier la ligne vide...).

et faites :

/usr/sbin/sendmail -v moi < test.mail

les lignes suivantes doivent s'afficher :

moi... Connecting to local...
moi... Sent

Lancez la commande mail, ou tout autre programme de lecture du courrier et vérifiez que le message a été reçu et contient les lignes suivantes :
From root  Tue Jun 23 02:17:40 1998
Return-Path: <root>
Received: (from root@localhost)
     by machine.domaine.fr (8.8.8/8.8.8/Eric Jacoboni - 26/05/98) id CAA03468
     for moi; Tue, 23 Jun 1998 02:17:40 +0200
Date: Tue, 23 Jun 1998 02:17:40 +0200
From: root <moi@mail.fai.fr>
Message-Id: <199806230017.CAA03468@machine.domaine.fr>
Subject: test local
<
Première ligne de mon message

Ce simple petit test nous permet de constater que sendmail est bien capable d'acheminer le courrier en local et qu'il a su réécrire l'adresse de l'expéditeur (root) en moi@mail.fai.fr selon la règle de réécriture décrite dans le fichier /etc/genericstable

3.2 Utilisation de réflecteurs et envoi du courrier

Un réflecteur est une machine qui reçoit nos messages et nous les renvoie après avoir copié l'en-tête de notre message tel qu'il a été reçu. Ceci est plus sûr que de s'envoyer un message à soi-même car, alors, sendmail peut très bien avoir réécrit cet en-tête (ceci ne veut pas dire qu'il ne faut pas tester cette méthode, mais qu'elle est un nécessaire non suffisant...). Une réponse d'un réflecteur prouve que la cha"ne de messagerie fonctionne (on peut émettre et recevoir) !

Plusieurs réflecteurs existent : parmi eux, echo@cnam.fr et echo@univ-rennes1.fr. Le mieux est de tester les deux. Bien sûr, il faudra avoir installé un logiciel pour écrire et recevoir du courrier en utilisant sendmail. Nombreux sont ces programmes : certains fonctionnent en mode texte (pine, elm, etc.), d'autres nécessitent X (xfmail, xmail etc.). Théoriquement, vous devez au moins avoir le programme mail qui se trouve dans le répertoire /bin : ce n'est sûrement pas le plus pratique à utiliser mais il peut suffire pour le moment.

Bon, admettons que tout fonctionne en local. Essayons maintenant avec une adresse non locale : celle d'un réflecteur, par exemple. Écrivez un message à l'adresse echo@cnam.fr, et, toujours déconnecté, envoyez-le. Ainsi que nous le disions plus haut, ce message est placé dans /var/spool/mqueue. En fait, il y est représenté par 2 fichiers : l'un constitue l'" enveloppe " et l'autre le " contenu ".

À tout moment, vous pouvez interroger la file d'attente par la commande mailq qui, ici, doit vous indiquer qu'un message à destination d'echo@cnam.fr est en attente. Connectez-vous à votre F.A.I puis invoquez la commande suivante :

/usr/sbin/sendmail -q

L'option -q oblige sendmail à tenter d'envoyer tous les messages en attente.

Lorsque cette commande est exécutée, vous pouvez vérifier avec mailq que la file d'attente est vide : vos messages sont partis.
Attendez un peu, puis faites un fetchmail pour récupérer les nouveaux messages sur le serveur pop de votre F.A.I. Normalement, vous devez récupérer un message, celui qui vous a été renvoyé par le réflecteur. Lisez-le à l'aide de votre programme de lecture de courrier afin de vérifier les en-têtes de votre message tel qu'il a été reçu par le réflecteur.

Ce qu'il est important de noter est la première ligne, dite " From d'enveloppe ", commençant par From (et qu'il ne faut surtout pas confondre avec la ligne d'en-tête commençant par From: !). Elle doit contenir votre adresse telle que vous l'avez configurée pour l'enveloppe, et, en aucun cas, l'adresse de votre machine (celle qui appara"t dans la dernière ligne received), sinon certains serveurs la rejetteront.

4 Sources d'informations

En dehors du site de Jussieu, le site " officiel " de sendmail est  http://www.sendmail.org. Vous y trouverez tout mais en anglais... , notamment, le répertoire m4 conprenant la description exhaustive des macros utilisées pour créer les fichiers de configuration.
Le forum fr.comp.mail est l'endroit où vous pourrez poster vos questions en n'oubliant pas que celui-ci n'est pas réservé aux utilisateurs de Linux et traite de façon générale de tous les problèmes de courrier. Le forum comp.mail.sendmail est, lui, uniquement consacré à ce programme, mais il est en anglais et est plutôt ardu à suivre : c'est là que vous pourrez trouver ceux qui écrivent leur sendmail.cf à la main...
Le document /usr/lib/sendmail-cf/README de la distribution sendmail décrit l'emploi des macros M4. Le manuel de sendmail est disponible au format PostScript (sur ma machine, il s'agit de /usr/doc/sendmail/doc/op/op.ps). Il existe aussi une FAQ. Le site de référence est  http://www.sendmail.org.

Eric Jacoboni
 

Références
Administration réseau sous Linux, par Olaf Kirch.
Publié par les éditions O'Reilly & Associates.
Une nouvelle édition est en préparation. Ce livre ne se cantonne pas à sendmail mais passe en revue tous les problèmes liés aux réseaux sous Linux. L'édition actuelle commence à dater bien que les concepts principaux restent valables, de toutes façons. Ce livre est également téléchargeable librement

Sendmail, par Bryan Costales et Eric Allman (l'auteur de sendmail).
Publié par les éditions O'Reilly & Associates. Complet, mais tout en Anglais. LA
référence...
 
 

 


© Copyright 2000 Diamond Editions/Linux magazine France - Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; A copy of the license is included in the section entitled "GNU Free Documentation License".