<Chapter>
<Title>Configuration : pour aller plus loin</Title>

<Sect1 id="alias">
<Title>Le fichier d'alias /var/qmail/users/assign</Title>

<Para>
Le système <ProductName>qmail</ProductName> peut posséder une liste d'alias 
compilée au format CDB stockée dans le fichier
<FileName>/var/qmail/users/cdb</FileName>
et dont la version ASCII est stockée dans le fichier 
<FileName>/var/qmail/users/assign</FileName>.
La commande <Command>qmail-newu</Command>
permet de transformer la version ASCII en version compilée CDB.
Cette dernière est lue par <Application>qmail-lspawn</Application> avant 
l'appel à <Application>qmail-local</Application>.
</Para>

<Para>
La version ASCII ressemble à un fichier <FileName>passwd</FileName>. 
Voir la page de manuel <ProductName>qmail-users</ProductName>
pour une description de son format.
La commande <Command>qmail-pw2u</Command> permet d'ailleurs de
fabriquer la base de données <FileName>/var/qmail/users/assign</FileName> à
partir de votre fichier <FileName>/etc/passwd</FileName> :
<ProgramListing>
root$ qmail-pw2u < /etc/passwd > /var/qmail/users/assign
root$ qmail-newu
</ProgramListing>
</Para>

<Para>
Le fichier d'alias compilé est lu par <Application>qmail-lspawn</Application>.
Ce dernier s'en sert pour déterminer 
l'utilisateur qui recevra la livraison d'un courriel par 
<Application>qmail-local</Application> en mode utilisateur. 
<Application>qmail-local</Application> se charge 
de la lecture et de l'interprétation des fichiers <FileName>.qmail*</FileName>.
Il faut bien comprendre que la liste d'alias est lue par
<Application>qmail-lspawn</Application> alors que les
<FileName>.qmail*</FileName> sont 
lus par <Application>qmail-local</Application>. 
Les deux mécanismes ne sont pas mutuellement
exclusifs mais successifs.
L'un opère en UID 0 et l'autre en mode utilisateur.
</Para>

<Para>
Considérons par exemple un courriel à destination locale
sortant de la file d'attente.
Il est transmis à <Application>qmail-lspawn</Application> 
par son père le daemon <Application>qmail-send</Application>.
<Application>qmail-lspawn</Application>, qui opère en UID 0,
détermine en lisant le fichier d'alias compilé
le login <Literal>login</Literal>, l'UID 
<Literal>uid</Literal>, le GID <Literal>gid</Literal> et le fichier 
<FileName>~login/.qmail*</FileName> en vertu
desquels il faut faire la livraison par
<Application>qmail-send</Application>.
<Application>qmail-send</Application> est donc 
executé en UID <Literal>uid</Literal>
et effectue la livraison conformément au fichier 
<FileName>~login/.qmail*</FileName> et aux
règles expliquées dans <XRef LinkEnd="livraison">.
<ProgramListing>
 qmail-send 
   \_ qmail-lspawn UID 0
        \_ qmail-local UID uid
</ProgramListing>
</Para>

<Para>
Voici un exemple de fichier <FileName>/var/qmail/users/assign</FileName> :
<ProgramListing>
=root:alias:70:65534:/var/qmail/alias:-:postmaster:
=abuse:alias:70:65534:/var/qmail/alias:-:postmaster:
=operator:alias:70:65534:/var/qmail/alias:-:postmaster:
=uucp:alias:70:65534:/var/qmail/alias:-:postmaster:
=anonymous:alias:70:65534:/var/qmail/alias:-:postmaster:
=hostmaster:alias:70:65534:/var/qmail/alias:-:postmaster:
=mailer-daemon:alias:70:65534:/var/qmail/alias:-:postmaster:
=manager:alias:70:65534:/var/qmail/alias:-:postmaster:
=warnings:alias:70:65534:/var/qmail/alias:-:postmaster:
=webmaster:alias:70:65534:/var/qmail/alias:-:postmaster:
=ftpmaster:alias:70:65534:/var/qmail/alias:-:postmaster:
=FaxMaster:alias:70:65534:/var/qmail/alias:-:postmaster:
+djalil:djay:1000:1000:/home/djay:::
.          
</ProgramListing>

Chaque ligne correspond à une directive de livraison.
Voir la page de manuel <Literal>qmail-users</Literal>
pour une description des 
champs. Les alias habituels sont tous redirigés vers
<Literal>alias-postmaster</Literal>,
à charge du <FileName>.qmail-postmaster</FileName> de router les messages
vers un autre utilisateur.
Le fichier doit toujours se terminer par une ligne ne contenant qu'un point.
La dernière ligne demande à <Application>qmail-lspawn</Application> de livrer
tout courriel à destination d'une adresse commençant par
<Literal>djalil</Literal> vers <Literal>djay</Literal>.
</Para>

<Para>
La commande <Command>qmail-getpw</Command> permet d'obtenir la ligne
du fichier d'alias correspondant à l'adresse courriel qu'on lui passe en
argument.
</Para>

</Sect1>

<Sect1 id="relayage">
<Title>Contrôle de relayage </Title>

<Para>
Lisez pour commencer <XRef LinkEnd="rcpthosts">
sur le fichier de contrôle <FileName>rcpthosts</FileName>.
</Para>

<Para>
On associe souvent le contrôle de relayage par <FileName>rcpthosts</FileName>
à un contrôle de connexion TCP par un «wrapper» TCP. Le cas typique est
l'utilisation de <Application>tcpd</Application> via
<Application>inetd</Application> pour lancer 
<Application>qmail-smtpd</Application>. Le contrôle TCP est alors effectué par
les fichiers <FileName>/etc/hosts.allow</FileName> et
<FileName>/etc/hosts.deny</FileName>.
Voici par exemple ce que l'on peut mettre dans
<FileName>/etc/inetd.conf</FileName> :

<ProgramListing>
smtp    stream  tcp     nowait.200  qmaild  /usr/sbin/tcpd smtp
</ProgramListing>

et dans <FileName>/etc/hosts.allow</FileName> :

<ProgramListing>
smtp: .mondomaine.amoi 127.0.0.1: \
      setenv RELAYCLIENT:\
      twist { { /usr/bin/tcp-env /usr/sbin/qmail-smtpd 1>&3;} \
      2>&1|splogger qmail;} 3>&1
smtp: ALL: \
      twist { { /usr/bin/tcp-env /usr/sbin/qmail-smtpd 1>&3;} \
      2>&1|splogger qmail;} 3>&1
</ProgramListing>

Ainsi, le contrôle de relayage par <FileName>rcpthosts</FileName> ne sera
actif que pour les courriels provenants de connexions SMTP avec des machines
extérieures au domaine <Literal>mondomaine.amoi</Literal>. 
</Para>

<Para>
Bien sûr, il ne faudra pas oublier de faire un 
<ProgramListing>
root:bash$ kill -HUP $(pidof inetd)
</ProgramListing>
pour que <Application>inetd</Application> relise son fichier de
configuration.
</Para>

<Para>
Voir les pages de manuel <Literal>inetd.conf</Literal>(5),
<Literal>tcpd</Literal>(8),
<Literal>hosts_access</Literal>(5) et
<Literal>hosts_options</Literal>(5).
</Para>

</Sect1>

<Sect1 id="ppp">
<Title>PPP et serialmail</Title>

<Para>
Lorsque la machine n'est connectée à l'Internet que de façon
intermittante en PPP par modem par exemple, les courriels à destination de
l'extérieur restent dans la file d'attente de
<ProductName>qmail</ProductName> jusqu'à la
prochaine connexion. Il est alors utile d'envoyer un signal ALRM à
<Application>qmail-send</Application> à l'établissement de la lisaison IP
(par exemple dans le script <FileName>/etc/ppp/ip-up.local</FileName> ou
équivalent) pour qu'il traite les courriels présents dans la file d'attente
immédiatement.
</Para>

<Para>
J'en profite au passage pour signaler que sur la
<ProductName>Debian GNU/Linux</ProductName>,
les fichiers <FileName>/etc/ppp/ip-up.local</FileName> et
<FileName>/etc/ppp/ip-down.local</FileName>
de PPP sont remplacés par des répertoires
<FileName>/etc/ppp/ip-up.d/</FileName>
et <FileName>/etc/ppp/ip-down.d/</FileName> destinés à accueillir des scripts
lancés automatiquement par <Application>run-parts</Application> respectivement
à l'établissement et à la chute de la lisaison IP via PPP).
</Para>

<Para>
Cette méthode a cependant un inconvénient. Supposons qu'aucune
connexion n'est lieu pendant une période assez longue, les courriels
en question seront alors tout bètement renvoyés à l'expéditeur, c'est
un mécanisme présent dans toute gestion de file d'attente. La variable
<ProductName>qmail</ProductName> <FileName>queuelifetime</FileName>
represéente la durée de vie en seconde d'un courriel dans la file d'attente.
Elle vaut par défaut 604800 secondes, soit une semaine.
</Para>

<Para>
Une solution élégante à ce problème consiste à faire en sorte que
tous les courriels devant transiter par PPP soit livrés dans une boite
aux lettres spécialement prévue à cet effet. Il suffira ensuite dès
l'établissement de la liaison IP par PPP de vider cette BAL
sur le port SMTP de la passerelle courriel de notre FAI.
Ce n'est pas sans rappeler le mecanisme «store-and-forward» d'UUCP.
On peut éditer cette BAL avec n'importe quel MUA,
ce qui est tout de même mieux que de toucher à la file d'attente de
<ProductName>qmail</ProductName>.   
</Para>

<Para>
Nous créons donc une BAL nommée
<FileName>~alias/ppp</FileName> par :

<ProgramListing>
root$ maildirmake ~alias/pppdir
root$ chown -R alias ~alias/pppdir
</ProgramListing>

Il nous faut ensuite créer le fichier
<FileName>~alias/.qmail-ppp-default</FileName>
qui doit contenir la ligne

<ProgramListing>
./pppdir/
</ProgramListing>

Enfin il faut ajouter une ligne à la fin du fichier
<FileName>/var/qmail/control/virtualdomains</FileName> :

<ProgramListing>
mondomaine.amoi:
.mondomaine.amoi:
:alias-ppp
</ProgramListing>

ainsi, la livraison vers notre BAL se fera pour les
courriels à destination des adresses extérieures au domaine
<Literal>mondomaine.amoi</Literal>. 
Voir la <XRef LinkEnd="virtualdomains">.
</Para>

<Para>
Reste maintenant à trouver un moyen pour vider cette BAL
sur le port 25 de notre FAI. C'est là qu'intervient
<ProductName>serialmail</ProductName>, que l'on trouve sur
<ULink URL="http://pobox.com/~djb/serialmail.html">
http://pobox.com/~djb/serialmail.html</ULink>.
<ProductName>serialmail</ProductName> existe aussi sous forme de paquetage
source <ProductName>Debian</ProductName>, je recommande fortement cette
méthode à ceux qui possèdent une <Application>Debian GNU/Linux</Application>.
</Para>

<Para>
<ProductName>serialmail</ProductName> est un ensemble de petits programmes
écrits par Dan Bernstein dont <Application>maildirsmtp</Application> qui
permet justement de vider une BAL au format maildir sur un port SMTP.
</Para>

<Para>
<Application>maildirsmtp</Application> fait appel à
<Application>tcpclient</Application> lui même faisant partie de UCSPI-TCP
(voir <ULink URL="http://pobox.com/~djb/ucspi-tcp.html">
 http://pobox.com/~djb/ucspi-tcp.html</ULink>).
Un paquetage source <ProductName>Debian GNU/Linux</ProductName>
est disponible.
</Para>

<Para>
Voici  ce qu'il faut rajouter dans votre script
<FileName>/etc/ppp/ip-up.local</FileName> ou équivalent :

<ProgramListing>
  maildirsmtp ~alias/pppdir \
               alias-ppp- mail.monfai.amoi \
               mamachine.mondomaine.amoi 2>> /var/log/maildir2smtp.log 
</ProgramListing>

où <Literal>mail.monfai.amoi</Literal> désigne la passerelle courriel de
votre FAI.
</Para>

<Para>
La principale critique que l'on pourrait porter à ce système
est que <ProductName>serialmail</ProductName> vide les messages sur le port
SMTP séquentiellement. Le moindre bloquage empêche le traitement du reste
de la BAL. 
</Para>

<Para>
Avant de terminer cette section, je vous rappelle que le fichier de contrôle
<FileName>/var/qmail/control/smtproutes</FileName>
permet de spécifier à <Application>qmail-remote</Application>
les relais de courriels à contacter (cf. la page de manuel).
L'idéal pour une machine isolée,
connectée de façon intermittante à l'Internet par PPP,
est de demander à <Application>qmail-remote</Application> de transmettre
tout les courriels sortants à la passerelle de courriel du FAI (un «smarthost»
pour parler le langage de <ProductName>sendmail</ProductName>).
Cela évite à <Application>qmail-remote</Application> de contacter lui même les
machines destinataires et de faire des requettes DNS. La ligne PPP
est donc moins sollicitée. On peut par exemple mettre ceci dans le fichier
<FileName>smtproutes</FileName> :

<ProgramListing>
:mail.monfai.amoi             
</ProgramListing>
         
Voir la <XRef LinkEnd="smtproutes">.
</Para>

</Sect1>

<Sect1>
<Title>Fetchmail</Title>
<Para>
Pour récupérer votre courriel sur le port POP3 de votre FAI, je vous
conseille d'utiliser l'exellent <Application>fetchmail</Application>.
Voici un exemple de <FileName>~/.fetchmailrc</FileName> possible :
<ProgramListing>
poll mail.monfai.amoi protocol pop3:
 username monpseudo
 password monsesame
 fetchall
 batchlimit 1 # utile si le FAI utilise qmail
 is loginlocal here
 mda "env -u QMAILINJECT qmail-inject -f%F %T"
</ProgramListing>
<Application>fetchmail</Application> fera donc appel à
<Application>qmail-inject</Application> pour insérer les courriels
dans la file d'attente de votre <ProductName>qmail</ProductName>.
<ProductName>qmail</ProductName> se chargera ensuite de livrer le courriel
dans votre BAL via le MDA <Application>qmail-local</Application>.
</Para>

<Para>
Vous pouvez aussi décider d'utiliser plutôt votre propre port SMTP
pour l'insertion dans la file d'attente de votre
<ProductName>qmail</ProductName>.
Voici le <FileName>~/.fetchmailrc</FileName> correspondant :
<ProgramListing>
poll mail.monfai.amoi protocol pop3:
 username monpseudo
 password monsesame
 fetchall
 batchlimit 1 # utile si le FAI utilise qmail 
 forcecr # RFC 822 strict
 is loginlocal here
</ProgramListing>
</Para>

<Para>
En fait, l'insertion dans la file d'attente de votre
<ProductName>qmail</ProductName> ne sert pas à grand chose.
Autant faire appel directement à un MDA qui va directement livrer le courriel
dans votre BAL. Le plus simple est par exemple d'utiliser
<Application>procmail</Application>.
On courcircuite <ProductName>qmail</ProductName> car il ne sert à rien ici !
Voici le <FileName>~/.fetchmailrc</FileName> correspondant :
<ProgramListing>
poll mail.monfai.amoi protocol pop3:
 username monpseudo
 password monsesame
 fetchall
 batchlimit 1 # utile si le FAI utilise qmail
 is loginlocal here 
 mda "procmail -d loginlocal" 
</ProgramListing>
</Para>

</Sect1>

<Sect1>
<Title>Réécriture d'adresse d'expéditeur</Title>

<Para>
 
Si vous désirez modifier votre identité apparente dans les courriels
que vous envoyez, il vous suffit d'utiliser les variables d'environnement
<Literal>QMAILHOST</Literal>,
<Literal>QMAILUSER</Literal> et
<Literal>QMAILNAME</Literal>.
Ces variables sont prises en considération par
<Application>qmail-inject</Application>
lors de l'injection de vos courriels dans la queue (cf. la page de manuel).
Les champs <Literal>From:</Literal> et
<Literal>Return-Path:</Literal> de vos courriels sont
alors modifiés automatiquement. Celà s'avère très pratique lorsque votre
machine n'est pas en permanence sur l'Internet et ne s'y connecte que de façon
intermittante via une adresse IP dynamique.
</Para>

<Para>
On peut contrôler les modifications qu'apporte
<Application>qmail-inject</Application>
aux entêtes en utilisant la variable d'environnement
<Literal>QMAILINJECT</Literal>.
Voir la page de manuel de
<Application>qmail-inject</Application> pour les détails.
</Para>

<Para>
Voici par exemple ce que j'ai rajouté à mon fichier
<FileName>.bashrc</FileName> :

<ProgramListing>
export QMAILHOST="mail.dotcom.fr"
export QMAILUSER="dchafai"
export QMAILNAME="Djalil Chafai"
export QMAILINJECT=f
</ProgramListing>

Ainsi, les messages que j'envoie apparaissent comme provenant de 
<Literal>dchafai@mail.dotcom.fr (Djalil Chafai)</Literal>.
Cette solution est interressante car elle marche avec tous les MUA faisant
appel au wrapper <ProductName>sendmail</ProductName> de
<ProductName>qmail</ProductName>, lui même appelant
<Application>qmail-inject</Application>.
De plus, cela permet de se débarrasser des problèmes de paranoïa des
passerelles de courriels de certains FAI.
</Para>

<Para>
En fait, pour déterminer le nom d'utilisateur,
<Application>qmail-inject</Application> utilise 
les variables d'environnement suivantes par ordre décroissant de préférence :
<Literal>QMAILUSER</Literal>,
<Literal>MAILUSER</Literal>,
<Literal>USER</Literal> et
<Literal>LOGNAME</Literal>.
Pour le nom de machine,
<Application>qmail-inject</Application> utilise la variable 
<ProductName>qmail</ProductName>
<FileName>defaulthost</FileName>. Elle peut être cependant forcée par les 
variables d'environnement
<Literal>QMAILHOST</Literal> et <Literal>MAILHOST</Literal>.
Le nom personnel est quant à lui donné par les variables d'environnement 
<Literal>QMAILNAME</Literal>, <Literal>MAILNAME</Literal> et
<Literal>NAME</Literal>.
</Para>

</Sect1>

<Sect1>
<Title>UUCP</Title>

<Para>
L'idée est un peu la même que celle utilisée pour le PPP.
Elle consiste à mettre une ligne dans <FileName>virtualdomains</FileName>
(voir la <XRef LinkEnd="virtualdomains">)

<ProgramListing>
.uucp:alias-uucp            
</ProgramListing>
          
qui routera les courriels devant transiter par UUCP vers
<Literal>alias-uucp</Literal>.
Le fichier <FileName>~alias/.qmail-uucp-default</FileName> devra alors
contenir un tube appelant le binaire qui injecte le courriel dans le
spool UUCP (<Application>uux</Application> par exemple).

<ProgramListing>
|preline -df /usr/bin/uux - -r -a "$SENDER" relaisuucp!rmail "($EXT2@$HOST)"
</ProgramListing>

Voir les pages de manuel de <Application>preline</Application>,
<Application>qmail-local</Application> et
<Application>qmail-command</Application> pour les détails.
Ainsi tout courriel à destination de <Literal>nom@machine.uucp</Literal>
sera envoyé par UUCP au relais <Literal>relaisuucp</Literal>.
</Para>

</Sect1>

<Sect1>
<Title>Listes de diffusion par ezmlm (à faire)</Title>

<Para>
<ProductName>ezmlm</ProductName>
est un gestionnaire de listes de diffusions écrit pas Dan
Berstein spécialement étudié pour <ProductName>qmail</ProductName>.
<ProductName>ezmlm</ProductName> est
beaucoup plus sophistiqué que le gestionnaire de listes minimal
<Application>qlist</Application> que contient <ProductName>qmail</ProductName>
nativement.
</Para>

<Para>
Le site <ULink URL="http://www.ezmlm.org/">http://www.ezmlm.org/</ULink>
est dédié à <ProductName>ezmlm</ProductName>.
</Para>

</Sect1>

<Sect1>
<Title>Statistiques par qmailanalog</Title>

<Para>
<ProductName>qmailanalog</ProductName> est un ensemble de scripts
<Application>awk</Application> écrits par 
Dan Bernstein qui fabriquent des statistiques sur le courriel en analysant 
les fichiers d'audit (logs) de <ProductName>qmail</ProductName>.
</Para>

<Para>
En général, <ProductName>qmailanalog</ProductName> est lancé par une crontab
hébdomadaire ou mensuelle. Vous trouverez un pointeur sur
<ProductName>qmailanalog</ProductName> dans sur site de
<ProductName>qmail</ProductName>. 
</Para>

<Para>
Dan Bernstein compte réécrire tout ou partie des scripts
<Application>awk</Application> en 
langage C. Les prochaines versions de
<ProductName>qmailanalog</ProductName> seront donc plus performantes.
</Para>

</Sect1>

</Chapter>
