<Chapter>
<Title>Configuration : la base</Title>

<Sect1>
<Title>Fichiers de contrôle</Title>

<Para>
La configuration de <ProductName>qmail</ProductName> se fait presque
entièrement via un ensemble de petits fichiers texte de «contrôle» tous situés
dans le répertoire <FileName>/var/qmail/control/</FileName> ou son équivalent
le cas échéant. Les différents programmes composant
<ProductName>qmail</ProductName> lisent le contenu de ces fichiers et
positionnent leurs variables en conséquence.
</Para>

<Para>
Des options par défaut sont prises pour chaque fichier inexistant.
Par défaut, un seul de ces fichiers existe, il s'agit de
<FileName>me</FileName> qui contient le nom qualifié de la machine.
</Para>

<Para>
Un <Command>man qmail-control</Command> donne une liste complète de tous ces
fichiers, des programmes <ProductName>qmail</ProductName> qui les utilisent
ainsi que des options prises par défaut. C'est très pratique.
</Para>

<Para>
Vous pouvez utiliser la commande <Command>qmail-showctl</Command> pour
obtenir un rapport sur les différents fichiers de contrôle présents sur votre
système <ProductName>qmail</ProductName> ainsi que les valeurs par défaut
utilisées.
</Para>

<Para>
Il ne faut surtout pas oublier de demander à <ProductName>qmail</ProductName>
de relire ses fichiers de contrôle après la modification de l'un d'entre eux.
Pour ce faire, il suffit de faire un 

<ProgramListing>
root:bash$ kill -HUP $(pidof qmail-send)
</ProgramListing>
</Para>

<Sect2 id="aliasempty">
<Title>aliasempty</Title>

<Para>
Le premier fichier de contrôle que vous serez amené à
modifier est sans doute <FileName>/var/qmail/control/aliasempty</FileName>.
Il contient le nom de la BAL dans laquelle le MDA
<Application>qmail-local</Application> livre le courriel lorsqu'il n'y a pas
de <FileName>.qmail</FileName>. Sa valeur par défaut est
<Literal>./Mailbox</Literal>.
</Para>

<Para>
Cette règle de livraison par défaut peut néanmoins être spécifiée
en ligne de commande à <Application>qmail-start</Application> lors du
lancement de <ProductName>qmail</ProductName>, voir la page de manuel.
Elle sera transmise à <Application>qmail-lspawn</Application>.
</Para>

<Para>
Pour conserver la livraison par défaut dans
<FileName>/var/spool/mail</FileName>,
vous pouvez imiter le paquetage <ProductName>qmail</ProductName> de la
<ProductName>Debian GNU/Linux</ProductName> :
se servir du MDA <Application>procmail</Application> et lancer
<ProductName>qmail</ProductName> par 

<ProgramListing>
 qmail-start |/usr/local/sbin/qmail-procmail
</ProgramListing>

Le script exécutable
<FileName>/usr/local/sbin/qmail-procmail</FileName> contenant

<ProgramListing>
 #!/bin/sh
            
 /var/qmail/bin/preline /usr/bin/procmail && exit 0

 # Erreur EX_TEMPFAIL ?
 [ $? = 75 ] && exit 111

 # Sinon on renvoie une «Permanent Error»
 exit 100
</ProgramListing>

</Para>

</Sect2>

<Sect2 id="locals">
<Title>locals</Title>

<Para>       
Un autre fichier très important pour vous sera sans doute 
<FileName>/var/qmail/control/locals</FileName>,
utilisé par <Application>qmail-send</Application>.
Il contient les noms des hôtes considérés comme locaux,
c'est à dire ceux pour lesquels les courriels que vous recevez et qui
leurs sont destinés seront livrés sur votre machine.      
Par défaut, cette variable vaut
la même valeur que le fichier de contrôle
<FileName>me</FileName> (votre nom de machine).
Un petit exemple valant mieux qu'un long discours,
voici un exemple de <FileName>locals</FileName>

<ProgramListing>
mondomaine.amoi            
mamachine            
mamachine.mondomaine.amoi
ftp
ftp.mondomaine.amoi
www
www.mondomaine.amoi
</ProgramListing>

<Literal>/var/qmail/control/me</Literal> contenant

<ProgramListing>
mamachine.mondomaine.amoi
</ProgramListing>

Bien sûr, il faudra de plus que les champs MX dans le DNS de
<Literal>ftp.mondomaine.amoi</Literal> et
<Literal>www.mondomaine.amoi</Literal>
pointent sur <Literal>mamachine.mondomaine.amoi</Literal>.
</Para>

<Para>
N'oubliez pas d'avertir <Application>qmail-send</Application>
après toute modification du fichier <FileName>locals</FileName> 
en lui envoyant un signal HUP :
<ProgramListing>
root:bash$ kill -HUP $(pidof qmail-send)
</ProgramListing>
</Para>

</Sect2>

<Sect2 id="defaulthost">
<Title>defaulthost et defaultdomain</Title>

<Para>
Les deux fichiers de contrôle
<FileName>/var/qmail/control/defaulthost</FileName>
et
<FileName>/var/qmail/control/defaultdomain</FileName>
s'avèrent très utiles.
Il permettent de spécifier la façon dont
<Application>qmail-inject</Application> complète les
adresses destinataires incomplètes.
Ainsi, une adresse ne contenant pas de partie
domaine sera complétée par <FileName>defaulthost</FileName>
et une adresse dont la partie domaine ne contient pas de point sera
complétée par <FileName>defaultdomain</FileName>.
La valeur par défaut est la même que celle de <FileName>me</FileName>, ce qui
ne correspond pas forcément à ce que vous souhaitez.
</Para>

<Para>
Les variables d'environnement
<Literal>QMAILDEFAULTDOMAIN</Literal> et
<Literal>QMAILDEFAULTHOST</Literal>
ont priorité sur le contenu des fichiers de contrôles correspondants.
</Para>

</Sect2>

<Sect2 id="rcpthosts">
<Title>rcpthosts</Title>

<Para>
Le fichier de contrôle <FileName>/var/qmail/control/rcpthosts</FileName> est
utilisé par <Application>qmail-smtpd</Application>.
Il permet de contrôler le relayage de courriel par la machine via SMTP.
</Para>

<Para>
Lorsque le fichier <FileName>rcpthosts</FileName> existe, 
<Application>qmail-smtpd</Application> refusera tout courriel dont la partie
domaine de l'adresse destinataire ne figure pas dans
<FileName>rcpthosts</FileName>.
Par défaut, c'est à dire en l'abscence de <FileName>rcpthosts</FileName>, 
<Application>qmail-smtpd</Application> accepte tous les courriels.
</Para>

<Para>
Voici un exemple de <FileName>rcpthosts</FileName>:

<ProgramListing>
.mondomaine.amoi
mondomaine.amoi                            
</ProgramListing>

<Application>qmail-smtpd</Application> refusera ici tout courriel à
destination d'une adresse extérieure au domaine
<Literal>mondomaine.amoi</Literal>.
</Para>

<Para>
Il est bien entendu très important que
<FileName>rcpthosts</FileName> autorise au moins 
les machines figurant dans le fichier de contrôle
<FileName>locals</FileName> pour que 
vous puissiez recevoir les courriels qui leurs sont destinés par SMTP.
</Para>

<Para>          
<FileName>rcpthosts</FileName> est ignoré si la variable d'environnement
<Literal>RELAYCLIENT</Literal> est positionnée. Auquel cas,
<Application>qmail-smtpd</Application>
ajoute son contenu à l'adresse de destination des courriels qui transitent
par lui.   
</Para>

<Para>
Lisez la page de manuel de <Application>qmail-smtpd</Application>
pour en savoir plus.
</Para>

<Para>
Le contrôle de relayage par <FileName>rcpthosts</FileName> est souvent 
associé à un contrôle au niveau TCP par un «wrapper» TCP. Voir  
<XRef LinkEnd="relayage">. Pour effectuer un rejet des courriels entrants par 
SMTP suivant l'expéditeur, reportez vous à
<XRef LinkEnd="badmailfrom">.
</Para>

<Sect2 id="badmailfrom">
<Title>badmailfrom</Title>

<Para>
<FileName>badmailfrom</FileName> est très utile pour éviter le 
courriel entrant non sollicité.
Il permet de spécifier les adresses d'expéditeurs interdits.
<Application>qmail-smtpd</Application> refusera tout courriel provenant d'eux.
Voici un exemple :

<ProgramListing>
@polution.com
polueur@poubelle.com
</ProgramListing>

<Application>qmail-smtpd</Application> refusera tout courriel provenant du
domaine <Literal>polution.com</Literal>
ou de l'adresse <Literal>polueur@poubelle.com</Literal>.
</Para>

<Para>
Pour faire du contrôle de relayage, se reportez à 
<XRef LinkEnd="relayage">
et
<XRef LinkEnd="rcpthosts">.
</Para>

</Sect2>

<Sect2 id="smtproutes">
<Title>smtproutes</Title>

<Para>
Le fichier de contrôle <FileName>/var/qmail/control/smtproutes</FileName>
permet de spécifier les relais SMTP que
<Application>qmail-remote</Application> devra contacter
pour router les courriels sortants. voir la page de manuel 
pour plus de détails. Voici un exemple :

<ProgramListing>
premier.domaine:mail.premier.domaine
second.domaine:mail.second.domaine:24
:mail.autre.domaine              
</ProgramListing>

Les courriels à destination de
<Literal>premier.domaine</Literal> seront transmis par SMTP au
port TCP 25 de
<Literal>mail.premier.domaine</Literal>, ceux à destination de
<Literal>second.domaine</Literal> seront transmis par SMTP au port TCP 24 de
<Literal>mail.second.domaine</Literal>. Quant aux autres courriels, ils seront
transmis au port TCP 25 de <Literal>mail.autre.domaine</Literal>.
</Para>

<Para>
<Application>qmail-remote</Application> utilise aussi les fichiers de contrôle
<FileName>helohost</FileName>, <FileName>timeoutconnect</FileName> et
<FileName>timeoutremote</FileName>,
voir la page de manuel de <Application>qmail-remote</Application>.
</Para>

</Sect2>

<Sect2 id="virtualdomains">
<Title>virtualdomains</Title>

<Para>        
Le fichier de contrôle <FileName>/var/qmail/control/virtualdomains</FileName> 
contient une liste de
domaines virtuels, un par ligne. Un domaine virtuel est un domaine
pour lequel la livraison se fera vers une seule adresse. Les domaines
virtuels sont pris en compte par <Application>qmail-send</Application>.
Par défaut, aucun domaine virtuel n'est défini. Voici un exemple de
fichier <FileName>virtualdomains</FileName> :

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

Dans cet exemple, les courriels à destination d'adresses dans le
domaine <Literal>mondomaine.amoi</Literal> sont livrés normalement,
pour celles se terminant par <Literal>.uucp</Literal>, la livraison a
lieu à l'adresse <Literal>alias-uucp</Literal>, quant aux
autres, ils sont livrés à l'adresse <Literal>alias-ppp</Literal>.
</Para>

<Para>
N'oubliez pas d'avertir <Application>qmail-send</Application>
après toute modification du fichier <Literal>locals</Literal> 
en lui envoyant un signal HUP :
<ProgramListing>
root$ kill -HUP pid_de_qmail-send
</ProgramListing>
</Para>

<Para>
Allez voir la page de manuel de <Application>qmail-send</Application> pour
plus de détails.
</Para>

</Sect2>

<Sect2>
<Title>Et les autres ?</Title>

<Para>
Je n'ai parlé que des principaux fichiers de contrôle, il y en a
beaucoup d'autres. Je vous conseille de faire un
«<Command>man qmail-control</Command>».
Vous y trouverez une liste de tout les fichiers de configuration,
les binaires qui les utilisent ainsi que les valeurs prises par défaut.
</Para>

</Sect2>

</Sect1>

<Sect1 id="livraison">
<Title>Livraison par qmail-local et utilisateur alias</Title>

<Para>          
Dans le système <ProductName>qmail</ProductName>, un utilisateur nommé
<Literal>login</Literal> contrôle 
toutes les adresses courriel de la forme <Literal>login-*</Literal> où l'étoile
représente une chaîne quelconque formée de caractères valides pour une adresse.
Cette règle générale peut être altérée par la mise en place d'un fichier
d'alias, voir la <XRef LinkEnd="alias">.
</Para>

<Para>
Pour chaque adresse <Literal>login-chaine</Literal>, l'utilisateur peut
décider de créer le fichier <FileName>~login/.qmail-chaine</FileName> qui
contiendra les instructions à suivre par
<Application>qmail-local</Application>, le livreur de courriel 
(MDA) de <ProductName>qmail</ProductName>.
Par convention, le fichier <FileName>~login/.qmail</FileName> correspond à
l'adresse <Literal>login</Literal> tout court. De plus, le fichier spécial
<FileName>~login/.qmail-default</FileName> lorsqu'il existe, joue le rôle de
fichier par défaut.
</Para>

<Para>
En l'abscence des fichiers
<FileName>~login/.qmail</FileName> et
<FileName>~login/.qmail-default</FileName>, 
<Application>qmail-local</Application>
livrera le courriel à destination de <Literal>~login</Literal>
en suivant la règle de livraison par défaut spécifiée au lancement de
<Application>qmail-send</Application>, voir la 
<XRef LinkEnd="aliasempty">.
En général, cette livraison se fait dans la BAL au format mbox
<FileName>~login/Mailbox</FileName> mais celà relève du choix de 
l'administrateur.
</Para>

<Para>
Il en va tout autrement pour les courriels à
destination de <Literal>login-chaine</Literal>.
<Application>qmail-local</Application> ne livrera pas un courriel à
destination de <Literal>login-chaine</Literal>
s'il ne trouve ni <FileName>~login/.qmail-chaine</FileName> ni
<FileName>~login/.qmail-default</FileName> au moment de livrer.
En fait, ce courriel sera intercepté par l'utilisateur spécial
<Literal>alias</Literal>
si son fichier <FileName>~alias/.qmail-default</FileName> existe et
retournera à l'expéditeur sinon.
</Para>

<Para>
Les fichiers <FileName>~login/.qmail-*</FileName> ont tous la même syntaxe.
</Para>

<Sect2>
<Title>Remarques sur <Application>qmail-local</Application></Title>

<Para>
Je rappelle qu'il faut faire très attention aux droits d'accès aux
répertoires personnels des utilisateurs. En effet, le MDA
<Application>qmail-local</Application>
refusera de livrer le courrier à un utilisateur dont le répertoire personnel
est autorisé en écriture pour le groupe ou pour tout le monde. Idem pour le
bit «sticky». La même remarque s'applique aux fichiers
<FileName>.qmail*</FileName>.
Voir la page de manuel <Application>dot-qmail</Application>.
</Para>

<Para>
Il faut aussi signaler que <Application>qmail-local</Application>
convertit toutes les majuscules en minuscules dans les noms de fichiers
<FileName>.qmail-*</FileName>. Il convertit aussi le caractère point en
caractère deux-points et réciproquement.
Ainsi, pour que le courriel à destination de 
<Literal>jojo.lapin</Literal> soit livré à l'utilisateur
<Literal>jojo</Literal>, il suffit que jojo possède un 
<FileName>.qmail-jojo:lapin</FileName> dans son répertoire
personnel <FileName>~jojo</FileName>.
</Para>

</Sect2>

</Sect1>

<Sect1>
<Title>Syntaxe des .qmail*</Title>

<Para>
Plongeons-nous à présent dans le contenu de ces fameux fichiers
<FileName>.qmail*</FileName>.
Ces fichiers contiennent les instructions que doit suivre le MDA
<Application>qmail-local</Application> pour livrer le courriel.
Çelà peut rappeler vaguement le mécanisme des fichiers
<FileName>.forward</FileName> du monde de <Application>sendmail</Application>.
Voici un exemple :

<ProgramListing>
# mon .qmail à moi
# Un pipe 
|qbiff
# Un forward
&amp;moi@ailleurs.laba
# Livraison dans une BAL maildir
./maildir/
# Livraison dans une BAL mbox
./mbox
</ProgramListing>

On le voit, chaque ligne contient une et une seule instruction de livraison.
Les lignes sont toutes analysées à chaque courriel livré par 
<Application>qmail-local</Application>.
Elles peuvent contenir des commentaires préfixés par une dièse.
Dans cet exemple, chaque courriel sera tubé dans
<Application>qbiff</Application>,
redirigé (forwarded) vers
<Literal>moi@ailleurs.laba</Literal> et livré dans les boites aux lettres
<FileName>~/maildir/</FileName> et <FileName>~/mailbox</FileName>.
</Para>

<Para>

<ItemizedList>
<ListItem><Para>
<Application>qbiff</Application> est un petit programme de notification
d'arrivée de courriel livré avec <ProductName>qmail</ProductName>.
Il annonce l'arrivée d'un courriel par un bip et un petit message sur le
terminal;
</Para></ListItem>

<ListItem><Para>
La directive de redirection (forwarding) se fait par une perluette.
En fait on peut se passer de la perluette lorsque l'adresse courriel
commence par une lettre ou un chiffre;
</Para></ListItem>

<ListItem><Para>
Les nom de boites aux lettres commencent toujours par un point
suivit immédiatement d'une barre de répertoire
(<FileName>./</FileName>).
Il se terminent toujours par une barre de répertoire
pour les boites au format maildir et jamais pour les boites au format
mbox. Les boites au format maildir doivent être créées avant d'être
utilisées au moyen de l'utilitaire
<Application>maildirmake</Application> qui fait partie de la
distribution <ProductName>qmail</ProductName>;
</Para></ListItem>

</ItemizedList>
</Para>

<Para>
<Application>qmail-local</Application> exécute les livraisons vers tubes de
la forme

<ProgramListing>
|commande
</ProgramListing>

en écrivant le courriel dans l'entrée standard d'un

<ProgramListing>
sh -c commande
</ProgramListing>

exécuté dans le répertoire personnel du destinataire.
L'entête du courriel ne contient alors pas les champs
<Literal>Return-Path</Literal> et
<Literal>Delivered-To</Literal>
mais <Application>qmail-local</Application> passe beaucoup d'informations
par variables d'environnement, par exemple <Literal>SENDER</Literal> et
<Literal>RECIPIENT</Literal> (voir la page de manuel 
<Literal>qmail-command</Literal>).
Pour les commandes qui ne ne prennent pas en
compte ces variables, comme
<ProductName>procmail</ProductName> ou
<ProductName>formail</ProductName> par exemple, il suffit
d'utiliser le binaire <Application>preline</Application> livré avec
<ProductName>qmail</ProductName> qui insère 
les champs <Literal>Return-Path</Literal> et <Literal>Delivered-To</Literal>
dans le message avant de l'écrire dans l'entrée standard de la commande.
Par exemple :

<ProgramListing>
|preline formail -A "Status: RO" | procmail
</ProgramListing>

</Para>

<Para>
Je vous conseille fortement de faire un
«<Command>man dot-qmail</Command>»
pour en savoir plus sur la syntaxe et les subtilités du format des
fichiers <FileName>.qmail</FileName>.
</Para>

<Para>
D'autres binaires peuvent vous être très utiles dans vos
<FileName>.qmail*</FileName>.
Jetez un coup d'oeil par exemple à la page de manuel de
<Application>condredirect</Application>
et à celle de <Application>forward</Application>.
</Para>

<Para>
Pour effectuer une modification sûre de vos fichiers
<FileName>.qmail*</FileName>,
Dan Bernstein recommande de positionner le bit «sticky» sur son
répertoire personnel par un

<ProgramListing>
chmod +t $HOME
</ProgramListing>

pendant la durée de la modification.
En effet, <Application>qmail-local</Application> refusera de livrer dans un
répertoire dont le bit sticky est positionné. Une fois la modification
effectuée, il vous suffit de désactiver le bit sticky  de votre
répertoire par un

<ProgramListing>
chmod -t $HOME
</ProgramListing>

Le plus simple est de se faire un alias pour son shell favori.
Par exemple, pour <Application>bash</Application>, je rajoute la ligne :

<ProgramListing>
alias edqm='chmod +t ~; && vi $1 && chmod -t ~;'
</ProgramListing>

à mon <FileName>~/.bash_profile</FileName>.
</Para>

</Sect1>

<Sect1>
<Title>Gestion de la file d'attente (à compléter)</Title>

<Para>
La file d'attente de <ProductName>qmail</ProductName> est stockée dans
<FileName>/var/qmail/queue/</FileName>.
Elle est constituée de plusieurs répertoires. Chaque message est stocké dans
un fichier dont le nom est un numéro d'i-noeud, ce qui assure son unicité.
La structure de la file d'attente est expliquée dans le fichier
<FileName>INTERNALS</FileName> livré avec les sources. 
</Para>

<Para>
La numérotation par i-noeud rend malheureusement un peu problématique la
restauration d'une file d'attente sauvegardée. Il existe cependant des
utilitaires qui permettent de passer outre. Allez voir sur le site de
<ProductName>qmail</ProductName>.
</Para>

<Para>
Les deux binaires <Application>qmail-qstat</Application> et
<Application>qmail-qread</Application> permettent
d'en connaitre son contenu. Ils font partie de la distribution
<ProductName>qmail</ProductName> et ont donc leur page de manuel respectives.
</Para>

<Para>
<Application>queue-fix</Application> est un programme écrit par Eric Huss
<ULink URL="mailto:e-huss@netmeridian.com">e-huss@netmeridian.com</ULink>
qui permet de vérifier l'intégrité de la file d'attente de
<ProductName>qmail</ProductName> et de la réparer au besoin.
</Para>

<Para>
<Application>qmHandle</Application> est un script Perl écrit par
Michele Beltrame 
<ULink URL="mailto:mick@io.com">mick@io.com</ULink>.
Il permet de lister en couleurs le contenu de la file d'attente de
<ProductName>qmail</ProductName> ainsi que d'en supprimer des messages. 
</Para>

<Para>
<Application>queue-fix</Application> et <Application>qmHandle</Application>
ne font pas partie de la distribution <ProductName>qmail</ProductName>.
Vous trouverez des pointeurs sur eux deux sur le site de
<ProductName>qmail</ProductName>.
</Para>

</Sect1>

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

<Para>
</Para>
      
</Sect1>

</Chapter>





