<?xml version="1.0" encoding="iso-8859-1" standalone="no" ?> 
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
                         "/usr/local/share/xml/dtd/docbook/docbookx.dtd"
[
<!ENTITY postfix.licence SYSTEM "license.xml">
<!ENTITY postfix.disclaimer SYSTEM "disclaimer.xml">
]>

<article lang="fr">
  <articleinfo>
   <title>Poster et recevoir du courrier avec Postfix</title>
  <subtitle>Version 0.7 -- 29 octobre 2000</subtitle>
  <author>
    <firstname>Éric</firstname>
    <surname>Jacoboni</surname>
    <affiliation>
      <address><email>jaco@linux-france.org</email></address>
    </affiliation>
   </author> 
    <copyright>
      <year>2000</year>
      <holder>Éric Jacoboni</holder>
    </copyright>
<!--    <legalnotice>
     &postfix.licence; 
      <important>
       &postfix.disclaimer;
      </important>
    </legalnotice> -->
</articleinfo>

<beginpage/>
<sect1><title>Introduction</title>

<sect2><title>À propos de ce document</title>

<para>Ce document, comme d'habitude, ne se veut pas être un guide de
référence ou une adaptation française de la documentation de
<command>postfix</command>, très bien faite au demeurant.  Il se borne
à relater les manipulations que j'ai été amené à faire pour configurer
le logiciel afin que je puisse recevoir et poster du courrier avec
lui. Toutes critiques, positives ou négatives sont évidemment les
bienvenues. Le site de référence de cette documentation est <ulink
url="http://www.linux-france.org/article/mail/postfix-jaco/postfix.html">Linux-France</ulink>
qui contiendra toujours la version la plus récente. À partir de cette
page, vous pouvez télécharger les <ulink
url="http://www.linux-france.org/article/mail/postfix-jaco/postfix.xml.gz">sources
DocBook/XML</ulink>, <ulink
url="http://www.linux-france.org/article/mail/postfix-jaco/postfix.ps.gz">la
version au format PostScript</ulink> et <ulink
url="http://www.linux-france.org/article/mail/postfix-jaco/postfix.pdf.gz">la
version au format PDF</ulink> de ce document.</para>
</sect2>

<sect2><title>Présentation</title>

<para>La configuration décrite ici a été testée avec les systèmes
d'exploitation <ulink url="http://www.debian.org">Debian GNU/Linux</ulink>,
et <ulink url="http://www.freebsd.org">FreeBSD</ulink>.</para>

<para>En fait, le système utilisé a peu d'importance du moment qu'il
est reconnu par <command>Postfix</command>. Ce qui est décrit ci-après
devrait donc s'appliquer dans tous les cas, le cas échéant à quelques
modifications mineures près. Notons que, pour Linux, des paquetages
précompilés existent&nbsp;: la Debian, notamment, permet d'installer
directement le programme via <command>dpkg</command> ou
<command>apt-get</command> et j'imagine qu'il existe également des
paquetages <command>rpm</command>. Le problème, avec ces paquetages
binaires, est qu'ils ne permettent pas de suivre les fréquents
changements du logiciel ; or, celui-ci étant en phase de
développement, les nouvelles versions ajoutent de nouvelles
fonctionnalités souvent fort intéressantes...</para>

<para>Concernant les autres Unix, il n'y a aucune raison pour que le
fonctionnement soit différent&nbsp;: la documentation cite d'ailleurs
une liste de tous les systèmes pris en charge. Je n'ai personnellement
vu aucune différence entre l'installation sous Linux et sous FreeBSD
(dont les scripts d'initialisation sont bien distincts).</para>

<para>La distribution officielle de <command>Postfix</command> peut
être récupérée sur son <ulink url="http://www.postfix.org">site
officiel</ulink>, ou sur l'un des sites miroirs français. La
distribution actuelle est
<filename>postfix-19991231.08</filename>.</para>

<para>Il ne sera pas traité ici de la récupération du courrier venant
de l'extérieur (du serveur de courrier de son fournisseur d'accès si
l'on est, comme moi, relié via une connexion téléphonique). Pour cela,
d'autres documentations existent, consultez notamment le site <ulink
url="http://www.linux-france.org/mail/article">Linux-France</ulink>.</para>
</sect2>
</sect1>

<sect1><title>Installation de Postfix</title>

<sect2><title>Installation à partir de la distribution source</title>

<sect3><title>Compilation</title>

<para>Le logiciel se récupère sous la forme d'un fichier
<filename>.tar.gz</filename> que l'on décompresse dans un répertoire
d'installation :

<blockquote>
<screen>
<userinput>
# tar xvzf postfix-19991231-pl08.tar.gz -C /tmp
# cd /tmp/postfix-19991231-pl08/
</userinput>
</screen>
</blockquote>
</para>

<para>Dans ce répertoire se trouve un fichier
<filename>INSTALL</filename> fort clair (mais en anglais) qu'il suffit
de suivre pas à pas pour installer et configurer
<command>postfix</command>. La première étape consiste à générer les
exécutables :

<blockquote><screen>
<userinput>
# make
</userinput>
</screen></blockquote>
</para>

<para>Il faut ensuite déplacer les fichiers binaires, de configuration
et les pages de manuel dans les répertoires adéquats de votre
système. Sous le répertoire d'installation, vous devez normalement
avoir les répertoires <filename>conf</filename>,
<filename>bin</filename>, <filename>libexec</filename>,
<filename>html</filename> et <filename>man</filename> (les autres
répertoires sont ceux contenant les sources, des exemples et les
fichiers objets générés par la compilation).</para>
</sect3>

<sect3><title>Installation de la documentation</title>
   
<para>Pour installer les pages de manuel, il suffit de déplacer le
contenu des répertoires
<filename>/tmp/postfix-19991231-pl08/man/man*</filename> dans les
répertoires correspondants sur votre système
(<filename>/usr/man/man*</filename> sur une machine Linux,
<filename>/usr/local/man/man*</filename>) sur une machine
FreeBSD).</para>

<para>Puis, vous pouvez installer le reste de la documentation. Pour
rester compatible avec les documentations des autres logiciels de mon
système Linux, vous pouvez créer un répertoire
<filename>/usr/doc/postfix</filename> dans lequel vous déplacerez tous
les fichiers de documentation du répertoire d'installation (leurs noms
sont en majuscules). Créez également le répertoire
<filename>/usr/doc/postfix/html</filename> et déplacez-y le contenu du
répertoire <filename>html</filename> de l'installation (pour FreeBSD,
on fait de même et on crée l'arborescence
<filename>/usr/local/share/doc/postfix</filename>).</para>
</sect3>

<sect3><title>Installation des fichiers de configuration</title>

<para>Sous Linux, tous ces fichiers vont dans un seul emplacement&nbsp;:
<filename>/etc/postfix</filename>, sous FreeBSD, ils iront dans
<filename>/usr/local/etc/postfix</filename>.</para>

<para>Je me bornerai ici à suivre ce qui est indiqué dans
<filename>INSTALL</filename> (adaptez le chemin des fichiers de
configuration à votre système)&nbsp;:

<blockquote><screen>
<userinput>
# mkdir /etc/postfix
# chmod 0755 /etc/postfix
# mv /tmp/postfix-19991231-pl08/conf/* /etc/postfix
# chmod 0644 /etc/postfix/*
# chmod 0755 /etc/postfix/postfix-script*
</userinput>
</screen></blockquote>
</para>
</sect3>

<sect3><title>Création des files d'attente</title>

<para><command>Postfix</command> utilise une arborescence beaucoup
plus élaborée que celle de ses prédécesseurs pour placer les messages
en attente de délivrance. Il suffit ici d'en indiquer la racine
(<filename>/var/spool/postfix/</filename>, généralement) car tous les
autres sous-répertoires y seront créés lors du premier démarrage de
<command>postfix</command>&nbsp;:

<blockquote><screen>
<userinput>
# mkdir /var/spool/postfix
# chmod 0755 /var/spool/postfix
</userinput>
</screen></blockquote>
</para>

<para>Vous pouvez choisir un autre emplacement&nbsp;: celui-ci devra
être indiqué lors de la configuration que nous étudions plus
loin. </para>
</sect3>

<sect3><title>Installation des exécutables</title>

<para>Là encore, vous êtes libres de choisir l'emplacement qui vous convient
car il suffira ensuite de l'indiquer lors de la configuration.</para>

<para>La méthode généralement pratiquée consiste à séparer les
<emphasis>commandes</emphasis> des <emphasis>démons</emphasis>&nbsp;:
les premières sont initialement dans le répertoire
<filename>bin</filename> et iront dans
<filename>/usr/local/sbin</filename> avec des liens de
<filename>/usr/sbin</filename> vers eux), les seconds sont
initialement dans <filename>libexec</filename> et iront dans
<filename>/usr/local/libexec/postfix</filename>)&nbsp;:

<blockquote><screen>
<userinput>
# cd /tmp/postfix-19991231-pl08/bin
# cp post* sendmail /usr/local/sbin
# mkdir /usr/local/libexec/postfix
# cp `ls | egrep -v 'post|fsstone|smtp-|sendmail'`/usr/local/libexec/postfix
</userinput>
</screen></blockquote>
</para>
</sect3>

<sect3><title>Droits d'accès à la file d'attente</title>

<para>Il s'agit ici de permettre l'accès des utilisateurs locaux au
répertoire <filename>/var/spool/postfix/maildrop</filename>. Par
défaut, tous les sous-répertoires de
<filename>/var/spool/postfix</filename> appartiennent au groupe
<emphasis>root</emphasis>. Or, lorsque les utilisateurs postent un
courrier, celui-ci transite d'abord par le répertoire
<filename>maildrop</filename>. Avec les droits actuels, ces courriers
seraient donc refusés.</para>

<para>Plusieurs possibilités, décrites dans le fichier
<filename>INSTALL</filename>, sont possibles&nbsp;: rendre le
répertoire <filename>maildrop</filename> accessible à tout le monde,
ou utiliser la commande <command>postdrop</command> en
<emphasis>sgid</emphasis>. Nous avons retenu la première
solution. Pour ce faire, il suffit de modifier les droits d'accès du
répertoire <filename>maildrop</filename>&nbsp;:

<blockquote><screen>
<userinput>
# chmod 1733 /var/spool/postfix/maildrop
</userinput>
</screen></blockquote>
</para>

<para>Cette solution suppose que vous ayez confiance en vos
utilisateurs locaux... Si ce n'est pas le cas, préférez-lui la
solution du <command>postdrop</command> en sgid (décrite dans le
fichier <filename>INSTALL</filename>).</para> <!-- OLIVE: expliquer
pourquoi postdrop en sgid est préférable en "environnement hostile" ?
-->

<para>L'invocation de la commande <command>postdrop</command> lors de
l'envoi d'un message est réalisée automatiquement via l'appel du script
<command>postfix-script</command> qu'il s'agit donc de rendre
accessible à tout le monde&nbsp;:

<blockquote><screen>
<userinput>
# cp /etc/postfix/postfix-script-nosgid /etc/postfix/postfix-script
</userinput>
</screen></blockquote>
</para>
</sect3>
</sect2>

<sect2><title>Utilisation de paquetages pré-compilés</title>

<para>Si vous préférez utiliser des paquetages <filename>rpm</filename> ou
	<filename>deb</filename>,
vérifiez les emplacements des différents fichiers et adaptez les
chemins utilisés ici à votre configuration.</para>
</sect2>
</sect1>

<sect1><title>Première configuration</title>

<sect2><title>Oublier sendmail !</title>

<para>Pour que <command>postfix</command> devienne votre agent de
transport de courrier, vous devrez probablement désactiver
<command>sendmail</command>. Même si vous ne l'avez jamais activé ou
configuré, il y a fort à parier que ce dernier ait été installé par
votre distribution Linux&nbsp;!</para>

<para>Pour cela, il suffit, encore une fois, de suivre ce que propose
le fichier <filename>INSTALL</filename>&nbsp;:

<blockquote><screen>
<userinput>
# cd /usr/sbin
# mv sendmail sendmail.OFF
# ./sendmail.OFF -q
# mv /usr/bin/newaliases /usr/bin/newaliases.OFF
# mv /usr/bin/mailq /usr/bin/mailq.OFF
# chmod 0 /usr/sbin/sendmail.OFF /usr/bin/newaliases.OFF \
       /usr/bin/mailq.OFF
# ln -s /usr/local/sbin/sendmail /usr/sbin/sendmail
# ln -s /usr/local/sbin/sendmail /usr/bin/mailq 
# ln -s /usr/local/sbin/sendmail /usr/bin/newaliases
</userinput>
</screen></blockquote>


Et c'est fini...</para>

<para>Ces quelques lignes sauvegardent les exécutables originaux de
<command>sendmail</command>, vident sa file d'attente, ôtent toutes
les permissions pour les protéger, et créent des liens symboliques
ayant les mêmes noms que les originaux vers la commande
<command>sendmail</command> de <command>postfix</command>.</para>
</sect2>

<sect2><title>Small is beautiful...</title>

<para>La première chose qui frappe, quand on se plonge dans la
documentation fournie avec <command>postfix</command> est son
apparente simplicité... Finie la syntaxe ésotérique du
<filename>sendmail.cf</filename>, finie la nécessité de passer par un
ensemble de macros pour oser espérer comprendre un tant soit peu ce
que l'on est en train de configurer&nbsp;: avec
<command>postfix</command> tout se passe par l'adaptation
d'<emphasis>un seul fichier</emphasis>, <filename>main.cf</filename>,
normalement placé, comme tous ses autres fichiers de configuration,
dans le répertoire <filename>/etc/postfix/</filename> (ou
<filename>/usr/local/etc/postfix/</filename>). Enfin, presque... nous
verrons plus tard que d'autres fichiers doivent être adaptés, mais
tous sont humainement lisibles et richement commentés.</para>

<para>À la différence de <command>sendmail</command>, programme
monolithique par excellence, <command>postfix</command> est composé de
nombreux petits programmes réalisant chacun une tâche bien
définie. Pour la plupart, ces programmes ne sont pas vus de
l'utilisateur mais appelés directement par le programme serveur
<command>/usr/sbin/postfix</command>. Le lancement de celui-ci au
démarrage du système dépend de l'Unix utilisé&nbsp;: avec un System V
(Linux en fait partie, sauf la distribution Slackware), il est lancé
via le script <filename>/etc/init.d/postfix</filename> selon la
méthode habituelle des <emphasis>runlevels</emphasis>&nbsp;; sur
FreeBSD, il est lancé via la ligne
<literal>sendmail_enable="YES"</literal> dans le fichier
<filename>/etc/rc.conf </filename> (vous comprendrez plus loin ce que
<command>sendmail</command> vient faire ici...). Sur les systèmes BSD,
on peut également utiliser le fichier <filename>/etc/rc.local
</filename>&nbsp;:

<blockquote><screen>
<userinput>
% cat /etc/rc.local
</userinput>
<computeroutput>
postfix start
</computeroutput>
</screen></blockquote>
</para>
</sect2>

<sect2><title>Démarrage de <command>postfix</command></title>

<para>Ainsi que nous venons de le dire, quel que soit le système
utilisé, c'est un script qui lance le serveur
<command>/usr/sbin/postfix</command> en lui passant le paramètre
<literal>start</literal>. Celui-ci lance à son tour le serveur
principal, <command>/usr/libexec/postfix/master</command> qui prend
alors les choses en main et lancera les autres démons lorsque cela
sera nécessaire.  Ces derniers se termineront après avoir accompli
leurs tâches ou après une certaine période d'inactivité. Seul, le
démon de gestion de la file d'attente,
<command>/usr/libexec/postfix/qmgr</command> reste en permanence en
activité.</para>

<para>Tout ceci peut se vérifier par une simple commande
	<command>ps</command> (ici sous FreeBSD, d'où la présence de
	ces serveurs sous <filename>/usr/local/</filename>)&nbsp;:

<blockquote><screen>
<userinput>
% ps axf
</userinput>
<computeroutput>
...
583  ?  S    0:00 /usr/local/libexec/postfix/master
584  ?  S    0:00  \_ pickup -t fifo -c 
585  ?  S    0:00  \_ qmgr -t fifo -u -c 
...
</computeroutput>
</screen></blockquote>

qui met en évidence la présence du démon <command>master</command> et
le fait qu'il a lui-même lancé les démons <command>pickup</command> et
<command>qmgr</command> (la commande <command>ps</command> utilisée
ici est celle de GNU, l'option <literal>-f</literal> n'a pas la même
signification avec un <command>ps</command> BSD).</para>

<para><command>pickup</command> est responsable de la récupération des
courriers locaux&nbsp;: comme nous l'écrivions plus haut, pour des
raisons de compatibilité, <command>postfix</command> utilise un
programme nommé <command>/usr/sbin/sendmail</command> (qui
<emphasis>n'est pas</emphasis> le programme
<command>sendmail</command> bien connu, mais un homonyme). Ce
programme est utilisé pour déposer les courriers locaux dans la file
d'attente <command>maildrop</command>&nbsp;: tous les courriers qui
sont postés par tous les utilisateurs sont déposés dans cette
file.</para>

<para><command>pickup</command> les récupère alors et les
passe au démon <command>cleanup</command> qui remplira
les en-têtes manquants, gérera les enveloppes des messages et les
déposera enfin dans une autre file d'attente, nommée
<command>incoming</command>. Puis <command>cleanup</command> avertira
le gestionnaire de file d'attente, <command>qmgr</command>, qu'un
nouveau courrier est arrivé.</para>

<para><command>qmgr</command> s'occupera alors de délivrer le courrier
dans les boîtes aux lettres de leurs destinataires et de gérer les
erreurs.</para>

<para>Nous verrons plus loin les autres démons entrant en jeu dans la
délivrance du courrier. Passons maintenant à une configuration minimum
pour tester localement <command>postfix</command>.</para>
</sect2>

<sect2><title>Configuration minimale</title>

<para>Notre but, ici, est d'arriver à poster et recevoir du courrier
en local&nbsp;: par exemple, <emphasis>root</emphasis> doit pouvoir poster
un message à l'utilisateur <emphasis>babe</emphasis>. Ce dernier doit
pouvoir récupérer le message, le lire et répondre à
<emphasis>root</emphasis>. Pour simplifier, nous utiliserons le
programme canonique <command>mail</command>.</para>

<para>Nous supposerons que notre machine s'appelle
<literal>alex</literal> et que notre domaine s'appelle
<literal>linux-france.org</literal>. Vérifions tout de suite que c'est
le cas&nbsp;:

<blockquote>
<screen>
<userinput>% hostname</userinput>
alex.linux-france.org
</screen>
</blockquote>
</para>

<para>Ainsi que nous l'avons déjà dit, la majeure partie du travail de
configuration consiste à adapter le fichier
<filename>/etc/postfix/main.cf</filename> (ou
<filename>/usr/local/etc/postfix/main.cf</filename>) à nos
besoins. Bien entendu, tout cela doit se faire sous le compte
<emphasis>root</emphasis>. </para>

<para>La première chose à faire est de sauvegarder le fichier
original&nbsp;:

<blockquote>
<screen>
<userinput>
# cp /etc/postfix/main.cf /etc/postfix/main.cf.0
</userinput>
</screen>
</blockquote>
</para>

<para>Puis, chargez <filename>main.cf</filename> dans
votre éditeur de texte favori.</para>

<para>Normalement, un certain nombre d'options sont déjà en place.
Certaines conviennent, d'autres non. Voici les lignes qui nous
intéressent (les commentaires et les lignes non modifiées ont été
supprimés)&nbsp;:

<blockquote>
<screen>
# INFORMATIONS SUR LES REPERTOIRES LOCAUX
queue_directory = /var/spool/postfix
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix

# POSSESSION DES FILES D'ATTENTE ET DES PROCESSUS
mail_owner = postfix

# NOMS DE LA MACHINE ET DU DOMAINE
myhostname = alex.linux-france.org                                          

# POUR L'ENVOI DU COURRIER
myorigin = $myhostname

# MODE DE TRANSPORT
default_transport = smtp

# GESTION DES ALIAS
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases

# DELIVRANCE DU COURRIER
mailbox_command = /usr/local/bin/procmail
</screen>
</blockquote>
</para>

<para>Assurez-vous que toutes les autres possibilités pour ces lignes
soient considérées comme des commentaires en les faisant précéder du
caractère dièse (<literal>#</literal>) et ne modifiez pas les
autres. </para>

<para>Avant de tester tout cela, détaillons rapidement les options
choisies (pour des renseignements plus précis, reportez-vous aux pages
de manuel et à la documentation fournie avec le programme).</para>

<para>La première section sert à spécifier les emplacements : 

	<glosslist>
	  <glossentry>
	    <glossterm>/var/spool/postfix</glossterm>
	    <glossdef>
	      <para>est le répertoire de base pour toutes les files
	      d'attente de <command>postfix</command>, Lors de son
	      premier lancement, <command>postfix</command> créera
	      tous les sous-répertoires pour ses files sous ce
	      répertoire ;</para>
	    </glossdef>
	  </glossentry>
	  <glossentry>
	    <glossterm>/usr/local/sbin</glossterm>
	    <glossdef>
	      <para>est le répertoire où se trouvent les commandes de
	      <command>postfix</command> (les exécutables dont le nom
	      commence par <literal>post</literal>, et sa version de
	      <command>sendmail</command>) ;</para>
	    </glossdef>
	  </glossentry>
	  <glossentry>
	    <glossterm>/usr/local/libexec/postfix</glossterm>
	    <glossdef>
	      <para>est le répertoire contenant les démons de
	      <command>postfix</command>&nbsp;: c'est là que se
	      trouvent tous les programmes serveurs qu'il
	      utilise.</para>
	    </glossdef>
	  </glossentry>
	</glosslist>
</para>

<para>La deuxième section précise qui est le propriétaire de la file
d'attente et de la plupart des processus serveurs de
<command>postfix</command>. Ici, nous avons conservé la proposition,
après avoir créé l'utilisateur <emphasis>postfix</emphasis>. Voici son
entrée dans notre fichier <filename>/etc/passwd</filename> :

<blockquote>
<screen>
postfix:x:101:101::/var/spool/postfix:/bin/false
</screen>
</blockquote>
</para>

<para>Le <literal>'x'</literal> dans la partie mot de passe vient du
fait que nous utilisons les «&nbsp;shadow passwords&nbsp;». Le groupe
101 correspond au groupe <emphasis>postfix</emphasis>, lui aussi créé
pour l'occasion :

<blockquote>
<screen>
<userinput># grep 101 /etc/group</userinput>
postfix:x:101:
</screen>
</blockquote>
</para>

<para>La troisième section sert à indiquer le nom complet de notre
machine.</para>

<para>La section suivante concerne l'envoi du courrier&nbsp;: elle
permet de renseigner <command>postfix</command> sur la machine qui a
posté. Pour le moment, nous considérerons que c'est ce que contient la
variable <varname>$myhostname</varname>.</para>

<para>Nous précisons ensuite le protocole utilisé pour l'acheminement
du courrier. Pour l'instant, <command>postfix</command> ne reconnaît
que <literal>smtp</literal> et <literal>uucp</literal> (en réalité, on peut
créer des transports dans <filename>/etc/postfix/master.cf</filename>,
ce qui permet de changer des paramètres en fonction de multiples
critères. On peut ainsi dupliquer le transport <literal>smtp</literal>
et en changer les caractéristiques en fonction des courriers entrants
ou sortants ce qui est très souple. Toutefois, ne l'ayant pas
pratiqué, je n'en dirais pas plus... ).</para>

<para>La gestion des alias peut faire appel au fichier
<filename>/etc/aliases</filename> utilisé par ses prédécesseurs mais
nous préférons en utiliser un autre :
<filename>/etc/postfix/aliases</filename> (ou
<filename>/usr/local/etc/postfix/aliases</filename>). La commande
<command>man aliases</command> vous renseignera en détail sur le
format de ce fichier. Disons simplement que, comme son nom l'indique,
il permet de définir des alias entre des noms de destinataires.
Ainsi, par exemple, un serveur de news poste quotidiennement un
rapport sur ses activités à l'utilisateur <emphasis>news</emphasis>
(ou <emphasis>usenet</emphasis>). Supposons que
<emphasis>babe</emphasis> soit l'administrateur des news sur
<literal>alex</literal>&nbsp;: pour qu'il puisse recevoir ces
messages, et si <emphasis>root</emphasis> est d'accord, bien entendu,
il suffit d'indiquer que les destinataires <emphasis>news</emphasis>
et <emphasis>usenet</emphasis> ont pour alias
<emphasis>babe</emphasis>. Ceci est réalisé par l'ajout de la ligne
suivante dans <filename>/etc/postfix/aliases</filename>&nbsp;:

<blockquote>
<screen>
news: babe
usenet: babe
</screen>
</blockquote>
</para>

<para>Pour des raisons d'optimisation, <command>postfix</command>,
comme ses prédécesseurs, demande à ce que ce fichier soit traité comme
une base de données au format <literal>DBM</literal> ou
<literal>DB</literal>. Pour générer ces formats, on utilise
l'utilitaire <command>/usr/sbin/postalias</command> (qui,
rappelons-le, est un lien vers
<command>/usr/local/sbin/postalias</command>). Ma machine ne
reconnaissant pas le format <literal>DBM</literal>, j'ai donc opté
pour le second et produit la base à l'aide de la commande&nbsp;:

<blockquote>
<screen>
<userinput>
# postalias hash:/etc/postfix/aliases
</userinput>
</screen>
</blockquote>

qui a engendré le fichier
<filename>/etc/postfix/aliases.db</filename>.</para>

<para>La section concernant la délivrance du courrier local indique
ici que nous souhaitons utiliser <command>procmail</command> pour
cette tâche. Tout autre programme ayant la même fonction peut convenir
(<command>deliver</command>, par exemple), mais
<command>procmail</command> est le plus connu dans le monde Linux et
FreeBSD. Cette section ne concerne que l'acheminement
<emphasis>local</emphasis> du courrier, <emphasis>ie.</emphasis> son
écriture dans les boîtes aux lettres des destinataires.</para>
</sect2>

<sect2><title>Test de la configuration locale</title>

<para>Après toute modification de l'un des fichiers que nous venons
d'étudier, il faut demander à <command>postfix</command> de relire sa
configuration :

<blockquote>
<screen>
<userinput>
# postfix reload
</userinput>
</screen>
</blockquote>
</para>

<para>À l'aide de la commande <command>ps ax</command>, vérifiez la
présence des démons <command>master, pickup</command> et
<command>qmgr</command>. Si vous ne les voyez pas, c'est qu'il y a eu
un problème&nbsp;: consultez les fichiers
<filename>/var/log/mail.*</filename> pour tenter d'en rechercher la
cause.</para>

<para>Si tout s'est bien passé, <emphasis>root</emphasis> va pouvoir
envoyer un courrier à <emphasis>babe</emphasis>&nbsp;:

<blockquote>
<screen>
<userinput>
# mail babe -s test
premier test local
.
Cc: 
#
</userinput>
</screen>
</blockquote>
</para>

<para>Immédiatement, <emphasis>babe</emphasis> a dû recevoir ce courrier :

<blockquote>
<screen>
<userinput>% mail</userinput>
Mail version 8.1 6/6/93.  Type ? for help.
"/var/spool/mail/babe": 1 message 1 new
>N  1 root@alex.linux-france.org.  Wed Jan 20 01:46  12/424   "test"
<userinput>&amp; 1</userinput>
Message 1:
From root@alex.linux-france.org Wed Jan 20 01:46:10 1999
Delivered-To: babe@alex.linux-france.org
To: babe@alex.linux-france.org
Subject: test
Date: Wed, 20 Jan 1999 01:46:10 +0100 (CET)
From: root@alex.linux-france.org

premier test local
<userinput>&amp; d</userinput>
<userinput>&amp; q</userinput>
</screen>
</blockquote>
</para>

<para>On notera la présence d'un champ
<literal>Delivered-To:</literal> : il est ajouté par
<command>postfix</command> afin d'éviter les boucles dans la
délivrance du courrier et ne sera pas affiché par défaut avec la
plupart des logiciels de lecture du courrier (en tous cas, avec
<command>Gnus</command> et <command>Netscape</command>...).</para>

<para>Essayons encore&nbsp;: maintenant postez sous le compte
<emphasis>babe</emphasis> un message à <emphasis>root</emphasis> et
vite, très vite, faites <command>ps axf</command>. Sous Linux, vous
devriez voir les lignes suivantes :

<blockquote>
<screen>
1271  ?  S    0:00 /usr/local/libexec/postfix/master
1272  ?  S    0:00  \_ pickup -t fifo -c 
1273  ?  S    0:00  \_ qmgr -t fifo -u -c 
1286  ?  S    0:00  \_ cleanup -t unix -u -c 
1287  ?  S    0:00  \_ trivial-rewrite -n rewrite -t unix -u -c 
1288  ?  S    0:00  \_ local -t unix
</screen>
</blockquote>
</para>

<para>Assez rapidement, vous remarquerez, si vous faites la même
commande, que <command>cleanup</command> et <command>local</command>
se sont terminés, tandis que <command>trivial-rewrite</command> survit
plus longtemps, puis se termine.</para>

<para>Tout ceci correspond ce que nous disions plus haut&nbsp;:
<command>pickup</command> a récupéré le message et l'a passé à
<command>cleanup</command>. <command>trivial-rewrite</command> s'est
chargé de réécrire l'adresse en rajoutant le nom de la machine locale
derrière le nom de l'utilisateur. <command>local</command> est le
démon responsable de la délivrance locale du message dans la boîte aux
lettres du destinataire. C'est à ce moment que le fichier des alias
est pris en compte et, si le destinataire utilise un fichier
<filename>~/.forward</filename>, <command>local</command> le fait
suivre à l'adresse indiquée.  C'est <command>local</command> qui
ajoute le champ <literal>Delivered-To:</literal> pour éviter un
bouclage intempestif et c'est lui qui remplit le champ
<literal>From</literal> de l'enveloppe (à ne pas confondre avec le
champ <literal>From:</literal>...).</para> <!-- OLIVE: problème :
depuis tout à l'heure, je remarque que le texte en "literal" fait que
tous les ':' sont séparés de la lettre précédente par une espace. Ça
doit être un style french quelconque, ça, non ? La version HTML ne
donne pas ce problème -->

<para>Pour finir cette partie, il ne vous reste plus qu'à essayer de
faire la même chose avec vos logiciels de lecture de courrier
favoris&nbsp;: cela ne devrait pas poser de problème puisque
<command>local</command> délivre les messages à l'endroit où la
plupart des logiciels s'attendent à les trouver.</para>
</sect2>
</sect1>

<sect1><title>Pour aller un peu plus loin...</title>

<sect2><title>Les files d'attente</title>

<para>Lorsqu'on a l'habitude d'utiliser <command>sendmail</command>,
la multiplicité des files d'attente de <command>postfix</command> a
tendance à dérouter. En effet, en lieu et place du classique et unique
<filename>/var/spool/mqueue/</filename> on se retrouve avec
l'arborescence suivante&nbsp;:

<blockquote>
<screen>
<userinput># tree /var/spool/postfix/</userinput>
/var/spool/postfix/
|-- active
...

|-- deferred
|   |-- 048ED779D1
|   |-- 09085779E0
|   |-- 17101779D6
|   |-- 31DE0779DA
|   |-- 3D15D779D4
|   |-- 4D2BD779D7
|   |-- 7BFA6779D3
|   |-- 7C65D779CF
|   |-- B10C3779D0
|   `-- C3272779D2
...

|-- incoming
...

|-- maildrop
...
</screen>
</blockquote>
</para>

<para>Nous avons abrégé la sortie de cette commande pour ne retenir
que les noms de répertoires qui nous intéressent ici. </para>

<para><command>postfix</command> utilise quatre files d'attentes :

      <glosslist>
	<glossentry>
	  <glossterm><filename>maildrop</filename></glossterm>
	  <glossdef>
	    <para>contient les messages locaux ;</para>
	  </glossdef>
	</glossentry>
	<glossentry>
	  <glossterm><filename>incoming</filename></glossterm>
	  <glossdef>
	    <para>contient les messages qui ont été prélevés dans
	    <filename>maildrop</filename> par le démon
	    <command>pickup</command>, puis qui ont été traités par le
	    démon <command>cleanup</command>. Cette file contient
	    aussi les messages venant de l'extérieur. En bref, elle
	    contient les messages qui n'ont pas encore été traités par
	    le gestionnaire de file d'attente <command>qmgr</command>
	    ;</para>
	  </glossdef>
	</glossentry>
	<glossentry>
	  <glossterm><filename>active</filename></glossterm>
	  <glossdef>
	    <para>est une file contenant les messages en cours de
	    délivrance par <command>qmgr</command> ;</para>
	  </glossdef>
	</glossentry>
	<glossentry>
	  <glossterm><filename>deferred</filename></glossterm>
	  <glossdef>
	    <para>contient les messages qui n'ont pas pu être délivrés
	    (il y en a 10 dans notre exemple).</para>
	  </glossdef>
	</glossentry>
      </glosslist>
</para>

<para>De plus, le répertoire
<filename>/var/spool/postfix/defer</filename> contient les mails en
attente plus longue et des répertoires qui sont «&nbsp;hachés&nbsp;»
afin de ne pas avoir des répertoires contenant trop de fichiers&nbsp;:
ainsi, le fichier <filename>7B345AC0B1</filename>, par exemple, sera
dans <filename>defer/7/B/7B345AC0B1</filename>.</para>

<para>La documentation HTML de la distribution
<command>postfix</command> dispose d'un schéma présentant clairement
les interactions entre les différentes files d'attente et les
différents démons. C'est d'ailleurs de lui que je me suis
inspiré...</para>

<para>Le contenu de la file d'attente peut être consulté avec la
commande <command>mailq</command> (les habitués de
<command>sendmail</command> ne seront pas dépaysés...)&nbsp;:
normalement celle-ci ne doit produire que les messages dont la
délivrance n'a pas encore eu lieu (dans notre cas, les 10 messages
contenus dans la file <filename>deferred</filename>).</para>
</sect2>

<sect2><title>Les commandes de postfix</title>

<para>Nous avons déjà vu que <command>postfix</command> s'invoquait en
lui passant un paramètre qui précisait l'action à entreprendre. Ainsi,
les paramètres <literal>stop</literal> et <literal>start</literal>
arrêtent et démarrent le serveur, respectivement. D'autres commandes
existent :

	<glosslist>
	  <glossentry>
	    <glossterm>reload</glossterm>
	    <glossdef>
	      <para>force <command>postfix</command> à relire ses
	      fichiers de configuration (en fait, il s'agit de deux
	      appels consécutifs à <command>postfix</command>&nbsp;:
	      l'un avec le paramètre <literal>stop</literal>, l'autre
	      avec le paramètre <literal>start</literal>)&nbsp;: cette
	      commande s'avère donc nécessaire après la modification
	      du fichier <filename>main.cf</filename>, par exemple
	      ;</para>
	    </glossdef>
	  </glossentry>
	  <glossentry>
	    <glossterm>check</glossterm>
	    <glossdef>
	      <para>permet de vérifier la configuration du système de
	      courrier. Ce paramètre permet aussi de surveiller les
	      différentes permissions des répertoires utilisés par
	      <command>postfix</command>, et de créer ces répertoires
	      s'ils n'existent pas. Si la configuration est correcte,
	      et si l'option <literal>-v</literal> n'a pas été
	      utilisée, cette commande ne produit aucune sortie
	      ;</para>
	    </glossdef>
	  </glossentry>
	  <glossentry>
	    <glossterm>flush</glossterm>
	    <glossdef>
	      <para>force <command>postfix</command> à tenter de vider
	      la file <filename>deferred</filename>, donc à envoyer
	      les messages en attente de délivrance.</para>
	    </glossdef>
	  </glossentry>
	</glosslist>
</para>

<para>Enfin, <emphasis>last but not least</emphasis>, la distribution
<command>postfix</command> fournit le programme
<command>postconf</command> pour afficher les paramètres modifiés par
notre configuration (<command>postconf -n</command>), les valeurs par
défaut du logiciel (<command>postconf -d</command>) et l'ensemble des
valeurs courantes des paramètres (<command>postconf</command>). Voici,
à titre d'exemple, ce que donne la première commande sur ma
configuration personnelle actuelle :

<blockquote>
<screen>
<userinput># postconf -n</userinput>
alias_database = hash:/etc/postfix/aliases
alias_maps = hash:/etc/postfix/aliases
command_directory = /usr/local/sbin
daemon_directory = /usr/local/libexec/postfix
debug_peer_level = 2
default_destination_concurrency_limit = 10
default_transport = smtp
defer_transports = smtp
local_destination_concurrency_limit = 2
mail_owner = postfix
mailbox_command = /usr/local/bin/procmail
myhostname = alex.linux-france.org
myorigin = $myhostname
program_directory = /usr/local/libexec/postfix
queue_directory = /var/spool/postfix
relayhost = [smtp.mon.fai]
sender_canonical_maps = hash:/etc/postfix/canonical
</screen>
</blockquote>
</para>

<para>Nous n'avons pas encore vu certains de ces paramètres ? C'est
normal. Nous allons maintenant nous en occuper... </para>
</sect2>

<sect2><title>Envoyer du courrier non local</title>

<para>Bien, nous savons maintenant que <command>postfix</command>
fonctionne correctement avec les adresses locales à notre machine (si
ce n'est pas le cas, n'allez pas plus loin et revenez ici
lorsque le problème sera réglé...). Allons maintenant à la conquête du
monde...</para>

<para>La meilleure chose à faire, tant que tous nos tests n'ont pas
donné satisfaction, est d'utiliser un «&nbsp;écho&nbsp;»&nbsp;:
<emphasis>ie.</emphasis> une adresse où nous pourrons envoyer un
courrier qui nous sera retourné tel qu'il a été reçu. Ceci nous
permettra de vérifier au moins deux choses&nbsp;:

<itemizedlist>
<listitem><para>que notre message a bien été acheminé à cette adresse
;</para></listitem>

<listitem><para> que les entêtes de notre message sont corrects (c'est
important car certains sites refusent les messages provenant de sites
non connus&nbsp;: voir la section sur le «&nbsp;masquage&nbsp;» des
adresses).</para></listitem>
</itemizedlist>
</para>

<para><email>echo@cnam.fr</email> est une adresse de ce type, et nous
l'utiliserons ici.</para>

<para>Tout le courrier sortant de notre machine est d'abord envoyé au
serveur de courrier de notre fournisseur d'accès qui se chargera
ensuite de l'envoyer sur l'Internet. Dans la terminologie classique,
cela s'appelle un <emphasis>hôte relais</emphasis> (ou
<emphasis>relayhost</emphasis>, en anglais). Il faut donc indiquer à
<command>postfix</command> le nom de cet hôte relais. Si l'on suppose
que nous sommes abonnés au fournisseur d'accès bien connu
<literal>mon.fai</literal> et que la machine s'occupant du courrier
chez ce fournisseur s'appelle <literal>smtp.mon.fai</literal>, il faut
modifier le fichier <filename>main.cf</filename>, rechercher les
lignes contenant <varname>relayhost</varname>, en décommenter une et
mettre&nbsp;:

<blockquote>
<screen>
relayhost = [smtp.mon.fai]
</screen>
</blockquote>
</para>

<para>Le format indiqué ici suppose que nous utilisons SMTP (spécifié
par la variable <varname>default_transport</varname>) pour transporter
notre courrier. En réalité, le format de <varname>relayhost</varname>
permet aussi d'indiquer une machine UUCP bien que le transport par
défaut reste SMTP pour un intranet local, par exemple (voir les
commentaires associés à cette variable dans
<filename>main.cf</filename> pour connaître toutes les
possibilités).</para>

<para>Puis, comme à chaque modification de ce fichier, il faut faire
<command>postfix reload</command>.</para>

<para>Essayons maintenant la commande suivante : 

<blockquote>
<screen>
<userinput>% mail echo@cnam.fr -s test</userinput>
essai d'envoi de courrier via postfix
.
Cc: 
%
</screen>
</blockquote>
</para>

<para>Puis, examinons la file d'attente :

<blockquote>
<screen>
<userinput>% mailq</userinput>
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
9C26D779D0      351 Wed Jan 20 21:23:55  babe@alex.linux-france.org
(Name service error for domain cnam.fr: Host not found, try again)
</screen>
</blockquote>
</para>

<para>N'étant relié à l'Internet qu'épisodiquement, via une connexion
PPP à un fournisseur d'accès (F.A.I.), le domaine
<literal>cnam.fr</literal> ne pourra être connu que lorsque nous
serons connectés, par consultation du serveur de noms de notre
F.A.I. Ce n'était pas le cas ici, et ce ne le sera pas souvent&nbsp;:
pour économiser sur la facture téléphonique, on a tout intérêt à
composer son courrier en étant déconnecté et à tout expédier d'un seul
coup lors de la connexion suivante. </para>

<para><command>postfix</command> nous prévient de cet état de fait
grâce au message <emphasis>Name service error for domain
cnam.fr</emphasis> de la commande <command>mailq</command>. Lors de
notre prochaine connexion, il suffira simplement d'appeler la commande
<command>postfix flush</command> (ou <command>sendmail -q</command>
pour les nostalgiques...) pour que le courrier en attente soit à
nouveau délivré. </para>

<para><blockquote>
	  <caution>
	    <para>sur ma machine, par exemple, seul
	    <emphasis>root</emphasis> a le droit de faire
	    <command>postfix flush</command>, un utilisateur normal
	    devra utiliser <command>/usr/sbin/sendmail -q</command>
	    pour envoyer les messages. La documentation de
	    <command>postfix</command> vous expliquera
	    pourquoi.</para>
	  </caution>
</blockquote>
</para>

<para>Lorsque l'on est, comme moi, connecté épisodiquement, le mieux
est donc d'indiquer à <command>postfix</command> de déférer la
délivrance des courriers. Ceux-ci seront alors placés dans la file
d'attente et il ne tentera plus de les envoyer sauf si on le lui
demande explicitement via un <command>sendmail -q</command>. Ce type
de fonctionnement est tout à fait adapté aux connexions épisodiques
(on peut mettre le <command>sendmail -q</command> dans un script de
post-connexion) et est piloté par la variable
<varname>defer_transports</varname> du fichier
<filename>main.cf</filename>&nbsp;:

<blockquote>
<screen>
defer_transports = smtp
</screen>
</blockquote>
</para>

<para>Ceux qui se sont longtemps battu pour contourner ce problème
avec <command>sendmail</command>, le vrai, apprécieront cette
simplicité...</para>

<para>Nous pouvons aussi aller directement inspecter le contenu des
files d'attente de <command>postfix</command>&nbsp;: vous noterez
alors que le numéro <literal>9C26D779D0</literal> apparaît en deux
endroits&nbsp;:

<itemizedlist>
<listitem><para>dans le répertoire
<filename>/var/spool/postfix/defer/9/C/</filename>&nbsp;: si vous
regardez le contenu de ce fichier, vous noterez qu'il contient
simplement le message indiquant le problème de résolution de l'adresse
de destination.</para></listitem>

<listitem><para>dans le répertoire
<filename>/var/spool/postix/deferred</filename>&nbsp;: l'édition du
contenu du fichier vous permettra de constater que toutes les
informations y sont, mais formatées d'une façon peu
lisible... </para></listitem>
</itemizedlist>
</para>
  
<para>Il existe une commande, assez primitive pour l'instant, appelée
<command>postcat</command> qui permet d'afficher sous une forme plus
lisible les messages dans les files de
<command>postfix</command>.</para>
</sect2>
</sect1>

<sect1><title>La réécriture de l'adresse de l'expéditeur</title>

<sect2><title>Énoncé du problème</title>

<para>Vous avez passez probablement passé beaucoup de temps à trouver
un nom pour votre chère machine, et vous êtes sûr d'avoir fait preuve
d'imagination en l'ayant appelé
<literal>warlordz.kill.windows</literal>&nbsp;: je doute que ce soit
original, mais cela change de
<literal>localhost.localdomain</literal>...</para>

<para>Quoi qu'il en soit, un problème va maintenant se poser&nbsp;:
avec cette configuration, et un tel nom de machine, le champ
<literal>From:</literal> de vos courriers sera, par exemple
<literal>bugs@warlordz.kill.windows</literal>, ou
<literal>lamer@warlordz.kill.windows</literal>. Cela ne posera pas de
problème quand l'utilisateur <emphasis>bugs</emphasis> postera un
courrier à <emphasis>lamer</emphasis> puisqu'il s'agira d'une
délivrance locale, mais cela risque d'en poser lorsque
<emphasis>bugs</emphasis> enverra un courrier à
<literal>postmaster@site.serieux</literal>... En effet, pour éviter
les courriers indésirables (aka SPAM ou UCE) postés par de tristes
sires, le système de courrier de <literal>site.serieux</literal> a
sûrement mis en place une protection toute simple&nbsp;: tout message
dont l'adresse d'expéditeur n'appartient pas à un domaine connu sera
directement mis au panier (il y a même des sites qui vont plus loin en
bannissant les messages venant de domaines connus... pour être assez
laxistes quant à l'émission de ces fameux SPAMs).</para>

<para>Qu'est-ce qu'un «&nbsp;domaine connu&nbsp;» ? Un domaine dûment
enregistré auprès des instances de l'Internet et je suppose que vous
n'avez pas payé le NIC pour déposer le domaine
<literal>warlordz.kill.windows</literal>, non ? En conséquence,
<literal>site.serieux</literal>, lorsqu'il recevra un message venant
de votre domaine, recherchera dans ses tablettes s'il connaît ce nom
et, comme ce ne sera pas le cas, votre précieuse missive ira se perdre
dans les oubliettes de l'histoire, sans même que vous en soyez
averti..</para>

<para>Un autre problème est que, même si le message n'était pas rejeté
et que <literal>postmaster@site.serieux</literal> lui répondait, le
message de réponse serait donc envoyé à
<literal>bugs@warlordz.kill.windows</literal>. Là encore, le site
n'étant pas connu, pas même de votre fournisseur d'accès, la réponse
se perdra dans la nature (ou plutôt non, elle reviendra à
<literal>postmaster@site.serieux</literal>, ce qui ne manquera pas de
l'agacer...).</para>

<para>Pour corriger ces deux problèmes, il faut donc faire en sorte
que l'adresse <literal>bugs@warlordz.kill.windows</literal> soit
remplacée, lors de l'expédition du message par une adresse valide au
sens de l'Internet, donc dûment déclarée. </para>

<para>Pour ce faire, nous supposerons que vous êtes abonné au
fournisseur d'accès <literal>fai.fr</literal> (qui, lui, est
enregistré et donc connu de tous les sites Internet). Lorsque vous
vous êtes abonné, le fournisseur vous a octroyé un nom pour votre
boîte aux lettres (selon les cas, c'est vous qui proposez le nom, ou
bien lui qui vous l'impose). Admettons que cette adresse soit
<literal>jdupont@fai.fr</literal> (ce qui, je vous l'accorde, est bien
moins fun que <literal>bugs@warlordz.kill.windows</literal>... que les
Dupont me pardonnent, mais ce n'est qu'un exemple).</para>
  
<para>Nous avons trois méthodes pour régler le problème&nbsp;: 

<itemizedlist>
<listitem><para>la première consiste à se plier aux exigences et, la
mort dans l'âme, à rebaptiser sa machine <literal>fai.fr</literal> et
à renommer l'utilisateur <emphasis>bugs</emphasis> en
<emphasis>jdupont</emphasis>&nbsp;: ainsi, l'adresse d'expédition sera
correcte. Pas terrible... et adieu la rebellion <emphasis>against ze
oueurlde</emphasis> ! (il manque des fautes d'orthographe pour faire
vrai...) ;</para></listitem>

<listitem><para>la deuxième consiste tout simplement à faire
enregistrer son domaine auprès d'un organisme dûment accrédité, et
donc à dépenser les économies que l'on réservait à l'achat de la
prochaine cartouche pour sa Gomme Baille Color (il existe également
des possibilités pour enregistrer gratuitement un nom de domaine, si
l'on dispose des ressources matérielles et des compétences
nécessaires&nbsp;: voir le site <ulink
url="http://www.eu.org">www.eu.org</ulink>). Cette solution implique
également d'autres contraintes purement techniques et nous ne la
détaillerons donc pas ici.</para></listitem>
  
<listitem><para>la troisième, celle qui sera étudiée ici, consiste à
configurer <command>postfix</command> pour qu'il réécrive l'adresse de
l'expéditeur, qu'il «&nbsp;maquille&nbsp;» l'adresse
<literal>bugs@warlordz.kill.windows</literal> en
<literal>jdupont@fai.fr</literal>.</para></listitem>
</itemizedlist>
</para>
</sect2>

<sect2><title>La réécriture et le masquage du champ
<literal>From:</literal></title>

<para><command>postfix</command>, comme son prédecesseur, permet de
modifier le champ <literal>From:</literal>, qui contient l'adresse de
l'expéditeur. Par défaut, cette option n'est pas active et il va donc
falloir modifier notre configuration pour l'utiliser.</para>
  
<para>Le principe est très simple&nbsp;:

<itemizedlist>
<listitem><para>on indique à <command>postfix</command> qu'il doit
utiliser une table de réécriture des adresses des expéditeurs. Cette
table s'appelle <filename>canonical</filename> et sera placée dans
<filename>/etc/postfix/</filename> (ou
<filename>/usr/local/etc/postfix/</filename>), son format est décrit
par la commande <command>man 5 canonical</command>. Dans notre cas, le
fichier <filename>canonical</filename> devrait donc contenir&nbsp;:

<blockquote>
<screen>
bugs  jdupont@fai.fr
</screen>
</blockquote>
</para></listitem>

<listitem><para>à partir de ce fichier, on génère un fichier au format
DB avec la commande <command>postmap /etc/postfix/canonical</command>,
comme on l'a fait pour le fichier des alias ;</para></listitem>

<listitem><para>dans la section <literal>ADDRESS REWRITING</literal>
(<emphasis>Réécriture des adresses</emphasis>), prévue à cet effet
dans <filename>main.cf</filename> (et initialement vide), on ajoute la
ligne suivante&nbsp;:

<blockquote>
<screen>
sender_canonical_maps = hash:/etc/postfix/canonical
</screen>
</blockquote>
</para></listitem>

<listitem><para>on force <command>postfix</command> à relire ce
fichier en faisant <command>postfix
reload</command>.</para></listitem>
</itemizedlist>
</para>

<para>Et c'est tout... Il reste à notre ami Jean Dupont,
euh... pardon, à <emphasis>bugs</emphasis> à envoyer un message de
test (local ou à une adresse écho) afin de vérifier si la réécriture
s'est bien effectuée.</para>
</sect2>
</sect1>

<sect1><title>Gestion des adresses locales</title>

<para>La gestion des adresses locales s'effectue très simplement par
      <command>postfix</command>. Dans la plupart des cas, vous n'aurez
      rien à faire. Ce qui suit ne doit donc être fait que dans
      certains cas bien précis.</para>

<para>Supposons que votre machine reçoive des courriers à destination
      de <literal>gus@machin.uucp.fr</literal> (ce qui peut être le
      cas si vous utilisez également UUCP pour recevoir du
      courrier). Le problème consiste maintenant à faire comprendre à
      <command>postfix</command> que les messages à destination des
      adresses <literal>machin.uucp.fr</literal> doivent être
      considérées comme locales à votre machine, sinon il essaiera de
      les renvoyer...</para>

<para>Pour ce faire, on utilisera un autre fichier de
      configuration&nbsp;: <filename>transport</filename> un peu comme
      on l'a fait pour <filename>aliases</filename>. La syntaxe de ce
      fichier est très simple et décrite par sa page de manuel
      (<command>man transport</command>). Dans notre cas, voici quel
      serait son contenu&nbsp;:

<blockquote>
<screen>
alex.linux-france.org   local:
localhost               local:
machin.uucp.fr          local:
</screen>
</blockquote></para>

<para>Toutes les adresses à destination de
      <literal>alex.linux-france.org</literal>, de
      <literal>machin.uucp.fr</literal>, ainsi, bien sûr, que les
      adresses locales seront alors considérées comme du courrier
      local à la machine.</para>

<para>Comme <filename>aliases</filename>, le fichier
      <filename>transport</filename> doit être traité pour produire un
      fichier au format <filename>db</filename> :

<blockquote>
<screen>
# postmap /usr/local/etc/postfix/transport
</screen>
</blockquote></para>

<para>Il reste maintenant à indiquer à <command>postfix</command>
      qu'il doit utiliser cette table pour acheminer le courrier. Pour
      cela, on rajoute dans <filename>main.cf</filename> la ligne
      suivante&nbsp;:

<blockquote>
<screen>
transport_maps = hash:/usr/local/etc/postfix/transport
</screen>
</blockquote>

qui aura priorité sur le contenu de la variable
      <literal>$mydestination</literal> (c'est pour ça que le contenu
      de celle-ci doit apparaître dans le fichier décrivant les
      adresses locales).</para>

<para>La lecture de la page de manuel vous donnera toutes les autres
      informations nécessaires pour, par exemple, préciser pour une
      entrée donnée un type de transport particulier&nbsp;: si, par
      exemple, vous désirez utiliser UUCP pour expédier vos courriers
      à destination de <literal>truc.uucp.fr</literal>, il suffira
      d'ajouter l'entrée
<blockquote>
<screen>
truc.uucp.fr    uucp:
</screen>
</blockquote></para>
<!-- peut-être pousser un peu plus ? -->

</sect1>

<sect1><title>Conclusion et remerciements</title>

<para>Ceux que <command>sendmail</command> rebutait peuvent essayer
<command>postfix</command> pour le transport de leur courrier&nbsp;:
sa syntaxe est claire et l'ensemble est richement commenté. De plus,
ses concepteurs ont pris soin de garder une compatibilité avec son
géant de prédécesseur&nbsp;: sur ma machine, tous les programmes qui
utilisaient <command>sendmail</command> pour lire et envoyer le
courrier n'ont eu besoin d'aucune modification pour continuer à
fonctionner, car cette compatibilité est un critère important pour les
concepteurs de <command>postfix</command> (et essentielle pour espérer
le remplacer).</para>
  
<para>Je ne suis pas suffisamment expert pour comparer les
fonctionnalités avancées des deux programmes mais, dans le cadre d'une
utilisation personnelle, en machine isolée, aucune fonctionnalité de
<command>sendmail</command> ne m'a manqué. Il faudrait voir ce que
cela donne sur une configuration lourde (gestion du courrier sur un
réseau découpé en sous-réseaux, gestion des listes de diffusion,
etc.). La lecture du forum de discussion
<literal>fr.comp.mail</literal> vous en apprendra plus sur ce
sujet.</para>
  
<!-- OLIVE: parler de la liste postfix-fr ou pas ? -->

<para>Parmi ce qui manque -- bien que peu de particuliers en aient
besoin -- ce sont les réécritures via des expressions rationnelles,
par exemple. Ce sera probablement implanté dans une future
version.</para>

<para>Cet article est évidemment incomplet, imprécis et contient
probablement des erreurs grossières... Je remercie donc d'avance tous
ceux et celles qui prendront la peine de lire ce document, de le
corriger et de l'annoter. J'essaierai de faire en sorte qu'il suive
les évolutions futures de <command>postfix</command> (et celle de ma
connaissance du transport de courrier) et toute aide est la bienvenue
dans le contexte de cet article qui se veut simplement un guide
d'initiation.</para>

<para>La version actuelle de ce document à été soumise à la sagacité
d'<othercredit><firstname>Ollivier</firstname>
<surname>Robert</surname></othercredit>, de
<othercredit><firstname>Nat</firstname>
<surname>Makarévitch</surname></othercredit> et d'
<othercredit><firstname>Olivier</firstname>
<surname>Tharan</surname></othercredit>. Je les remercie
particulièrement de leur aide en n'oubliant pas les contributeurs
zélés de <literal>fr.comp.mail</literal>.
</para>
</sect1> 
</article>


