Mini-HOWTO qmail + MH

Christopher Richardson,(rdn@tara.n.eunet.de). Traduit par Diégo D'OLIVEIRA GRANJA (mortadel@free.fr)

v1.4, 5 Mars 1998
Dans ce document, je fais part de mes expériences d'installation afin d'aider les utilisateurs qui désirent utiliser la configuration ci-dessus pour la gestion de leur courrier électronique. v1.4: J'ai eu une nouvelle Linuxette, alors j'ai décidé de mettre à jour ce mini-HOWTO.

1. Introduction

Mes remerciements à tous les citoyens du net qui m'ont aidé, particulièrement Tony Nugent ( tony@trishul.sci.edu.au), et David Summers ( david@summersoft.fay.ar.us), ainsi que l'équipe de S.u.S.E GmBH ( http://www.suse.com) qui ont rendu l'installation de Linux tellement plus aisée, et enfin les auteurs des excellents programmes cités plus haut.

Qu'est-ce que qmail et pourquoi devrions-nous l'utiliser ? Voici le "baratin publicitaire" de son auteur, Dan Bernstein :

qmail est un agent de transport du courrier (MTA, Mail Transporter Agent), sécurisé, sûr, efficace et simple. Il est conçu pour remplacer complètement le système sendmail-binmail sur les stations UNIX connectées à Internet.

Sécurisé : La sécurité n'est pas seulement un but à atteindre, c'est une exigence absolue. La distribution du courrier est d'une importance critique pour les utilisateurs : elle ne doit pas être interrompue, alors elle doit être complètement sécurisée. (C'est la raison pour laquelle j'ai commencé à écrire qmail : je ne pouvais plus supporter les trous de sécurité de sendmail et des autres MTAs)

Sûr : La philosophie de qmail garantit qu'un message, une fois accepté dans le système, ne sera jamais perdu. De plus, qmail supporte maildir, un nouveau format de boîte aux lettres utilisateur très solide. Les maildirs, à la différence des fichiers mbox ou des dossiers MH, ne seront pas corrompus si le système plante pendant la distribution. Encore mieux, non seulement un utilisateur peut lire son courrier en sécurité sur NFS (Network File System), mais en plus un nombre illimité de clients NFS peuvent lui distribuer du courrier au même moment.

Efficace : Sur un Pentium sous BSD/OS, qmail peut facilement supporter 200000 messages locaux par jour -- il s'agit de messages distincts injectés et distribués dans les boîtes aux lettres dans un test réel -- ! Malgré le fait que les livraisons lointaines soient limitées par la lenteur des DNS (Domain Name Services : serveurs de noms de domaine) et de SMTP (Simple Mail Transfer Protocol : protocole simple de transfert de courrier), qmail dépasse 20 envois simultanés par défaut, de sorte qu'il permet de gèrer très rapidement des mailing-lists (C'est la raison pour laquelle j'ai fini qmail : je devais mettre en place une grosse liste de diffusion).

Simple : Qmail est beaucoup plus petit que n'importe quel autre MTA. Voici quelques raisons :

  1. Les autres MTAs ont des mécanismes séparés de forwarding, aliasing, et de gestion de mailing-lists. Qmail a UN simple mécanisme de forwarding qui permet aux utilisateurs de gérer leurs propres listes de diffusion.
  2. Les autres MTAs offrent toute une gamme de modes d'envoi, allant de rapide (et peu sûr) à lent (et mis en attente). L'envoi sous qmail est instantanément déclenché par la mise en attente de nouvelles entrées, aussi l'on peut dire que le système qmail n'a qu'un seul mode d'envoi : rapide ET avec mise en attente.
  3. Les autres MTAs incluent une version spécialisée d'inetd qui surveille la moyenne de chargement. La conception de qmail limite de manière interne la charge de la machine, ainsi le démon SMTP de qmail (qmail-smtpd) peut s'exécuter en toute sécurité avec l'inetd de votre système.

Remplaçant pour sendmail : qmail supporte le masquerading hôte et utilisateur, la dissimulation complète de l'hôte, les domaines virtuels, les null-clients, les commandes de relais, les enregistrements à double rebond, les programmateurs de relance de messages indépendants... En résumé, qmail n'est pas en reste côté modernité des caractéristiques. Qmail inclut également une fonction de "couverture", c'est-à-dire qu'il se fait passer pour sendmail, afin d'être utilisé de manière transparente par votre agent utilisateur courrier (MUA, Mail User Agent).

2. Ma configuration système

3. Installation de qmail

Suivez exactement les instructions du fichier INSTALL.

Remarques :

Prenez le temps de lire complètement la documentation, s'il vous plaît. Les numéros suivants se réfèrent aux étapes d'installation du fichier INSTALL sus-cité.


 smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env tcp-env
/var/qmail/bin/qmail-smtpd 

4. Maildir2smtp

Dan Bernstein a fourni un paquetage pour l'envoi d'e-mail en attente vers un FAI via dial-in. Ce paquetage est disponible sur son site sous le nom de serialmailxxx.

Installez ce paquetage comme décrit dans la page de manuel (Merci à Rupert Mazzucco ( maz@pap.univie.ac.at), cela marche du tonnerre !



       maildir2smtp - transmet un maildir par SMTP

       maildir2smtp est conçu pour transférer des messages par le biais
       d'une connection SLIP ou PPP. Pour mettre cela en place en fin de
       déconnexion, créez un nouveau maildir en alias :

          # maildirmake ~alias/pppdir chown -R alias ~alias/pppdir

       Mettez

          :alias-ppp

       dans control/virtualdomains et

          ./pppdir/

       dans ~alias/.qmail-ppp-default.  N'oubliez pas l'anti-slash dans
       pppdir/. Alors dans le script de démarrage PPP, mettez

          maildir2smtp ~alias/pppdir alias-ppp- $IP `hostname`

       en remplaçant $IP avec l'adresse IP distante.


Remarques :

5. Installation de MH

En addition à cela, j'ai également remplacé le fichier /mh-6.8.4/mts/sendmail/smail.c par le mh-qmail-smail.c de Dan Bernstein.

Voici à quoi ressemble mon fichier mh-6.8.4/conf/MH :


bin     /usr/bin/mh
etc     /usr/lib/mh
#mail   
#mandir /usr/man
#manuals        standard
chown   /bin/chown
#cp     cp
#ln     ln
#remove mv -f
cc      gcc
ccoptions -traditional -O2 -m486 -D_NFILE='getdtablesize()' 
          -DSIGEMT=SIGUSR1
curses  -lncurses
#ldoptions      -s
#ldoptlibs
lex     flex
#oldload        off
#ranlib on
mts     sendmail
#mf     off
#bboards        off
#bbdelivery     off
#bbhome /usr/spool/bboards
pop     on
popdir  /usr/lib/mh
sharedlib       sys5
slflags -fPIC
slibdir /usr/lib
mailgroup       mail
signal  void
sprintf int
#editor prompter
#debug  off
#regtest        off
options ATHENA
options BIND
options DPOP
options DUMB
options FCNTL
options MHE
options MHRC
options MIME
options MORE='"/usr/bin/less"'
options OVERHEAD
options POP2
options POPSERVICE='"pop3"'
options RENAME
options RPATHS
options RPOP
options SOCKETS
options SVR4
options SYS5
options SYS5DIR
options TERMINFO
options UNISTD
options VSPRINTF

Remarques :

5.1 Mtstailor

Comme qmail distribue le courrier dans le répertoire home (~/Mailbox), j'ai ajouté cela à mon mtstailor :


localname:      mickey
localdomain:    n.eunet.de
mmdfldir:       
mmdflfil:       Mailbox         
uucpldir:       
uucplfil:       
mmdelim1:       \001\001\001\001\n
mmdelim2:       \001\001\001\001\n
mmailid:        0
umincproc:
lockldir:
sendmail:       /usr/lib/sendmail

Remarques :


 servers: serveur_de_mail.compagnie.pays 

5.2 Mh_profile

Voici mon fichier .mh_profile :


Path: Mail
draft-folder: drafts
unseen-sequence: unseen
AliasFile: /home/rdn/.mh_aliases
send: -msgid
comp: -form /home/rdn/.mymh-components
MailDrop: /home/rdn/Mailbox

Remarques :

6. Fetchmail

J'ai décidé d'utiliser fetchmail parce que mon système Linux est utilisé par plusieurs personnes différentes (ma famille :-)) et fetchmail transmet le courrier sur le port SMTP, où qmail le prend en charge.

L'installation se fait sans problèmes, le dépôt multiple (Multi-drop) fonctionne avec le fichier .fetchmailrc suivant :


poll PersonalMail.Germany.EU.net
protocol pop3
username myname
password mypassword
# Les deux lignes suivantes s'occupent du multidrop
localdomains mydomain.de
is * here
# T2 des états de la FAQ de fetchmail, dont qmail a besoin
forcecr

7. Exmh

C'est mon gestionnaire de mail préféré. Je l'adore.

Il y a un seul problème : la plupart des paquetages TCL/TK pré-compilés ont l'option security activée. Le fichier script .xserverrc.secure, qui était fourni avec la S.u.S.E résout ce problème :



#!/bin/sh

#
# Déplacez ce fichier vers ~/.xserverrc, si vous
# ne voulez pas que tout le monde puisse accéder à votre
# serveur X
#
if [ -x /usr/bin/keygen ]; then
    if [ ! -x /usr/bin/hostname -a ! -x /bin/hostname \
         -a ! -x /usr/bsd/hostname ];
    then
        echo "startx: can't get my hostname - exiting"
        exit 1
    else
        host=`hostname`
    fi

    xauth add $host:0 . `/usr/bin/keygen`
    sleep 2
    xauth add $host/"unix":0 . `/usr/bin/keygen`
    exec X :0 -auth .Xauthority $*
else
    exec X :0 $*
fi

8. Procmail

La FAQ de qmail donne cette commande :

Dans /.qmail, ajouter

 
| preline procmail 

La version 3.11pre7 a changé la variable Boite aux Lettres définie par défaut. Avant, cela se trouvait dans config.h; c'est maintenant dans src/authenticate.c :


#define MAILSPOOLHOME "/Mailbox"        /* regarde l'entête / */
                                        /* délivre à $HOME/Mailbox */

J'ai réuni quelques trucs, extraits des forums comp.mail.mh et comp.mail.misc, dans un fichier .procmailrc. Merci à tous !



# UN EXEMPLE DE FICHIER .PROCMAILRC POUR LES DEBUTANTS
# Ecrit par Catherine Hampton 
# Version 1.1
# Mis à jour le 25/01/98
#
# Déposé dans le Domaine Public
#
#
# FIXER LES VARIABLES

# Variables internes
# Ce qui suit a été modifié par rdn le 03/03/1998

# Tout le monde dit que la variable SHELL est essentielle
SHELL=/bin/sh               #Shell utilisé pour lancer procmail.  
                            #Soyez sûr que cela pointe vers la
                            #version de sh de votre système. NE 
                            #LUI SUBSTITUEZ PAS un autre shell
                            #sauf si vous connaissez bien UNIX

LINEBUF=4096                #Nécessaire pour éviter à Procmail de 
                            #s'étouffer sur des longs champs "destinataires"
                            #ou sur des instructions concernant la manière de 
                            #traiter des e-mails particuliers

PATH=$HOME/bin:/bin:/usr/bin:/usr/local/bin:/usr/bin/mh:/usr/lib/mh:
                            #Path pour vos programmes -- il vaut mieux
                            #probablement le laisser ainsi.

VERBOSE=off                 #Mettez-le à "on" si vous essayez un nouveau
                            #champ "destinataire" afin que Procmail puisse 
                            #enregistrer littéralement chaque étape. 
                            #NE LE LAISSEZ PAS INDEFINIMENT, sinon cela 
                            #crée d'énormes fichiers-journaux (logfiles)

# Programme par défaut & situation des fichiers

MAILDIR=$HOME/Mail          #Vous devriez vous assurer de l'existence de
                            #cela.

DEFAULT=$HOME/Mailbox       #Boite de réception par défaut pour les 
                            #utilisateurs de shell2-5 sur Internet
                            #Remplacez-la par la valeur correcte de 
                            #votre système.


LOGFILE=$MAILDIR/procmail.log #L'emplacement des fichiers log. Recommandé,
                              #autrement les erreurs vous seront envoyées
                              #par e-mail :/

FORMAIL=/usr/bin/formail        #Pratique pour les champs de réponse auto-
                                #matique (autoreply recipes). Si vous n'êtes
                                #pas sur Internet, modifiez cela avec le
                                #chemin de votre version de formail.

SENDMAIL=/usr/sbin/sendmail     #Pratique pour les champs de réponse auto-
                                #matique (autoreply recipes). Si vous n'êtes 
                                #pas sur Internet, modifiez cela avec le 
                                #chemin de votre version de sendmail.

Procmail est un logiciel excellemment bien documenté. Lisez les pages de manuel afin de trouver des exemples pour créer votre fichier .procmailrc.

9. ISDN

J'inclus cela alors que cela n'a rien à voir avec qmail ou MH. Mais sans une connexion PPP vers un FAI, il n'y a pas de courrier électronique du tout. J'ai eu quelques problèmes pour faire fonctionner ma connexion ISDN. La distribution S.u.S.E propose une configuration pour ISDN, mais je voulais quelque chose de plus simple. Ce qui est présenté ici a été adapté des scripts de Bernhard Hailer (Merci, vraiment, merci !)

Le fichier rc.config suivant charge les modules nécessaires pendant l'initialisation :


#!/bin/bash
# Ceci est adapté du vieux script de Bernhard Hailer

LOCAL_NUMBER="91311234"        # numéro de téléphone local. 091311234
REMOTE_NUMBER="0911123456"     # numéro de téléphone du FAI
LOCAL_IP="192.168.0.99"        # J'ai une adresse IP dynamique alors ce
REMOTE_IP="195.112.123.11"     # sera la passerelle de votre FAI
DEVICE="ippp0"

SYSPATH="/sbin"
ISDNCTRL="$SYSPATH/isdnctrl"

case "$1" in
start)
        # turn on isdn
        insmod /lib/modules/2.0.33/net/slhc.o
        insmod /lib/modules/2.0.33/misc/isdn.o
        sleep 1
        # load the hisax module
        insmod /lib/modules/2.0.33/misc/hisax.o 
                                   id=Tel0 type=5 protocol=2 irq=10 io=0x300 
        echo "starting isdn4linux"
        # global
        $ISDNCTRL verbose 0

        $ISDNCTRL addif $DEVICE         # crée une nouvelle interface
        $ISDNCTRL addphone $DEVICE in $REMOTE_NUMBER
        $ISDNCTRL addphone $DEVICE out $REMOTE_NUMBER
        $ISDNCTRL eaz $DEVICE $LOCAL_NUMBER
        $ISDNCTRL l2_prot $DEVICE hdlc
        $ISDNCTRL l3_prot $DEVICE trans
        $ISDNCTRL encap $DEVICE syncppp
        $ISDNCTRL huptimeout $DEVICE 300 
        $ISDNCTRL chargehup  $DEVICE off
        $ISDNCTRL secure $DEVICE on

        $SYSPATH/ifconfig $DEVICE $LOCAL_IP pointopoint $REMOTE_IP metric 1
        $SYSPATH/route add default $DEVICE
        $SYSPATH/ipppd /dev/ippp0 file /etc/ppp/options.ipppd &
        $SYSPATH/route del default
        
        ;;
stop)
        #turn off isdn
        rmmod hisax.o  
        sleep 1
        rmmod isdn.o
        rmmod slhc.o
        echo "Shutting down isdn4linux"
        $ISDNCTRL delif ippp0
        ;;
*)
        echo "Usage: $0 (start|stop)"
        exit 1
        ;;
esac

J'utilise le script suivant pour appeler l'extérieur, il est nommé tout simplement isdn on|off.



#!/bin/bash
# Ceci est adapté du vieux script de Bernhard Hailer

IP_ADDRESS="195.112.123.11"

case "$1" in
on)
        
        
        echo "Calling ippp0"
        /sbin/isdnctrl dial ippp0
# la pause est importante car cela donne à PPP le temps de s'installer
        echo "Sleep for 8s for PPP handshake"
        sleep 8s
        /sbin/route add default ippp0
        echo "line open - checking...."
      
# vérifie si la négociation PPP est réussie :
        set `ping -qc3 -i1 $IP_ADDRESS 2>/dev/null | grep transmitted`
        if [ $4 -gt 0 ];
        then
                echo "succeeded."
                echo "Starting fetchmail daemon"
                /usr/bin/fetchmail -d 600 -k -v -a -L /var/log/fetchmail
                echo "Flushing mail queue...."
                /usr/local/bin/serialmail/maildir2smtp 
                            ~alias/pppdir alias-ppp- mail.server.ip.no `hostname`
        else
                echo "failed!"
                /sbin/isdnctrl hangup ippp0
        fi
        
;;

off)
                echo -n "Shutting down fetchmail daemon"
                /usr/bin/fetchmail --quit
                
                /sbin/isdnctrl hangup ippp0
                /sbin/route del default         # and delete route
                echo "You're off line"
;;

*)
        echo -e "\aUsage:"
        echo "isdn on"
        echo "isdn off"
;;

esac

La portion suivante est le fichier d'options du démon ipppd, /etc/ppp/options.ipppd :

# Basé sur :
# Klaus Franken, kfr@suse.de
# Version: 27.08.97 (5.1)
# 
# Ce fichier est une copie par YaST du fichier /etc/ppp/ioptions.YaST 
# vers le fichier options.

user "myuserid"

# le nom de mon système (only for CHAP !)
# name my_system_name

# accepte les adresses IP transmises par son homologue
# utilisé avec les adresses IP dynamiques
ipcp-accept-local
ipcp-accept-remote
noipdefault

# essaie d'obtenir l'adresse IP de l'interface
# option spécifique à ipppd (contrairement à pppd)
# utilisé seulement avec des adresses IP statiques
#useifip

# désactive toutes les compressions d'en-têtes
-vj
-vjccomp
-ac
-pc
-bsdcomp

# parfois, vous pouvez en avoir besoin
#noccp

# unité de réception maximale (mru, max receive unit)
mru 1524
# unité de transmission maximale (mtu, max transmit unit)
mtu 1500

# Si la machine est un serveur, forcez l'authentification en décommentant
# l'une des lignes suivantes. Toutefois, si la machine est un client, faire
# cela empêche la réussite de la connexion (message "peer refused to authenticate").
# Alors décommentez SEULEMENT sur un serveur.
# "+pap" / "+chap" NUR AKTIVIEREN, WENN DIES EIN SERVER IST!!!
#+pap
#+chap

# Si vous avez des problèmes avec la liaison (pas de réponse du premier
# paquet-lcp), essayez de diminuer le délai de ré-essai (retry-cycle). 
# Fixé par défaut à 3 secondes, essayez par exemple 2 secondes
# lcp-restart 2

10. Sources

Paquetages requis :

Le net est toujours en perpétuel mouvement, aussi est-il un peu utopique de donner des sources fiables à 100%. Néanmoins, cela ne mange pas de pain...

11. Avertissements

L'habituel sermon : "Pas de garanties, pas de remboursements ; utilisez à vos propres risques."

12. Post-Scriptum

Est-ce que quelq'un a fait fonctionner MH avec Maildi r? Je n'ai pas essayé -- le principe de ne pas bloquer un système qui tourne bien. Si oui, écrivez-moi vos informations pour une inclusion dans la prochaine version de ce document.