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...