5. Configuration : pour aller plus loin

5.1 Le super fichier d'alias /var/qmail/users/assign

qmail possède, d'une base données d'alias compilée au format CDB. Sa version ASCII est stockée dans le fichier /var/qmail/users/assign et sa version compilée dans /var/qmail/users/cdb. Le programme qmail-newu permet de compiler la version ASCII en CDB. La version compilée est lue par qmail-lspawn avant l'appel à qmail-local.

En général, le mécanisme des .qmail s'avère suffisant pour une utilisation courante. Il est cependant assez lent comparé à une base de données d'alias compilée. De plus, la base de données permet un contrôle plus subtil des adresses. Il faut bien comprendre que la base d'alias est lue par qmail-lspawn alors que les .qmail sont lus par qmail-inject. Les deux mécanismes ne sont pas mutuellement exclusifs mais successifs. L'un opère en UID 0 et l'autre en mode utilisateur. En fait, la base de donnée d'alias permet de spécifier à qmail-lspawn le .qmail qu'il doit utiliser pour la livraison par qmail-user en mode utilisateur.

La version ASCII ressemble à un fichier passwd. Voir la page de manuel qmail-users pour une description de son format. L'utilitaire qmail-pw2u permet d'ailleurs de fabriquer la base de données /var/qmail/users/assign à partir de votre fichier /etc/passwd. Très utile pour commencer.

Voici un exemple de fichier /var/qmail/users/assign :


=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:
=backup-reports:alias:70:65534:/var/qmail/alias:-:postmaster:
=bbsadmin:alias:70:65534:/var/qmail/alias:-:postmaster:
=dumper:alias:70:65534:/var/qmail/alias:-:postmaster:
=hostmaster:alias:70:65534:/var/qmail/alias:-:postmaster:
=listmaster:alias:70:65534:/var/qmail/alias:-:postmaster:
=mailer-daemon:alias:70:65534:/var/qmail/alias:-:postmaster:
=manager:alias:70:65534:/var/qmail/alias:-:postmaster:
=orphanage: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:::
.          

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

5.2 PPP et serialmail

Lorsque la machine n'est connectée à l'Internet que de façon intermitante en PPP par modem par exemple, les courriels à destination de l'extérieur restent dans la queue de qmail jusqu'à la prochaine connection. Il est alors utile d'envoyer un signal ALRM à qmail-send à l'établissement de la lisaison IP (par exemple dans le script /etc/ppp/ip-up.local ou équivalent) pour qu'il traite les courriels stockés dans la queue immédiatement.

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

Cette méthode a cependant un inconvénient. Supposons qu'aucune connection 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 toutes les gestions de queue. La variable qmail queuelifetime represéente la durée de vie en seconde d'un courriel dans la queue. Elle vaut par défaut 604800 secondes (1 semaine).

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 de l'établissement de la liaison IP par PPP de vider cette boite aux lettres 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 boite aux lettres avec n'importe quel MUA, ce qui est tout de même mieux que de toucher à la queue de qmail.

Nous créons donc une boite au lettres nommée ~alias/ppp par :


root$ maildirmake ~alias/pppdir
root$ chown -R alias ~alias/pppdir

J'ai choisis le format maildir pour des raisons de robustesse. Il nous faut ensuite créer le fichier ~alias/.qmail-ppp-default qui doit contenir la ligne
./pppdir/

Enfin il faut ajouter une ligne à la fin du fichier /var/qmail/control/virtualdomains :
votre.domaine:
.votre.domaine:
:alias-ppp

ainsi, la livraison vers notre boite aux lettres se fera pour les courriels à destination des adresses extérieures au domaine votre.domaine.

Reste maintenant à trouver un moyen pour vider cette boite aux lettres sur le port 25 de notre FAI. C'est là qu'intervient serialmail, que vous l'on trouve sur pobox.com/~djb/serialmail.html. serialmail existe aussi sous forme de paquetage source Debian, je recommande fortement cette méthode à ceux qui possèdent une Debian GNU/Linux.

serialmail est un ensemble de petits programmes écrits par Dan Bernstein dont maildirsmtp qui permet justement de vider une boite aux lettres au format maildir sur un port 25 SMTP.

maildirsmtp fait appel à tcpclient lui même faisant partie de UCSPI-TCP (voir pobox.com/~djb/ucspi-tcp.html). Un paquetage source Debian GNU/Linux est disponible.

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


  maildirsmtp ~alias/pppdir \
               alias-ppp- mail.votre.provider \
               votrehost.votre.domaine 2>>/var/log/maildir2smtp.log 

où mail.votre.provider désigne la passerelle courriel de votre FAI.

La principale critique que l'on pourrait porter à ce système est que serialmail vide les messages sur le port 25 séquentiellement. Le moindre bloquage empêche le traitement du reste de la boite aux lettres.

Avant de terminer cette section, je vous rappelle que la variable qmail smtproutes permet de spécifier à qmail-remote les relais de courriels à contacter (cf. la page de manuel). L'idéal pour une machine isolée, connectée de façon intermitante à l'Internet par PPP, est de demander à qmail-remote de transmettre tout les courriels sortants à la passerelle de courriel du FAI. Cela évite à qmail-remote 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 /var/qmail/control/smtproutes :


 :mail.votre.provider             

5.3 Changer son identité (user masquerading)

Si vous désirez modifier votre identité apparente dans les courriels que vous envoyez, il vous suffit d'utiliser les variables d'environnement QMAILHOST, QMAILUSER et QMAILNAME. Ces variables sont prises en considération par qmail-inject lors de l'injection de vos courriels dans la queue (cf. la page de manuel). Les champs From: et Return-Path: 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 intermitante via une adresse IP dynamique.

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

Voici par exemple ce que j'ai rajouté à mon fichier .bashrc :


export QMAILHOST="mail.dotcom.fr"
export QMAILUSER="dchafai"
export QMAILNAME="Djalil Chafai"
export QMAILINJECT=f

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

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

5.4 Interfaçage avec UUCP

L'idée est un peu la même que celle utilisée pour le PPP. Elle consiste à mettre une ligne dans virtualdomains


.uucp:alias-uucp            

qui routera les courriels devant transiter par UUCP vers alias-uucp. Le fichier ~alias/.qmail-uucp-default devra alors contenir un pipe appelant le binaire qui injecte le courriel dans le spool UUCP (uux par exemple).
|preline -df /usr/bin/uux - -r -a "$SENDER" relaisuucp!rmail "($EXT2@$HOST)"

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

5.5 Listes de diffusion par ezmlm (à compléter)

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

5.6 Statistiques par qmailanalog

qmailanalog est un ensemble de scripts qui fabriquent des statistiques sur le courriel en analysant les traces (logs) de qmail. En général, qmailanalog est lancé par une crontab hébdomadaire ou mensuelle. Vous trouverez un pointeur sur qmailanalog dans le site de qmail.