Création d'un serveur de listes de diffusion avec Mailman + Exim

De ArchwikiFR

Ce tutoriel explique comment configurer un serveur de listes de diffusion (ou mailing list) avec le couple Exim et Mailman, destinés respectivement à l'envoi d'emails (serveur SMTP) et à la gestion de liste de diffusion. Sans aide, leur installation et configuration sous ArchLinux n'est pas une mince affaire, et la documentation que l'on peut trouver sur internet est très éparpillée. C'est pourquoi les messages correspondant aux erreurs corrigées à chaque étape de ce tutoriel sont également indiqués.

Important: Notez que si Mailman peut fonctionner sans serveur web, la gestion administrative de vos listes risque de se révéler très pénible, voire dangereuse. Il est donc VIVEMENT CONSEILLÉ d'installer et de configurer Apache.

Sommaire

Prérequis et installation

Tout d'abord, il est nécessaire d'installer les paquets d'exim et de mailman. Vu qu'exim et httpd sont définies comme dépendances de mailman, il nous suffit d'installer ce dernier.

# pacman -S mailman

Ajoutez une ligne « exim : ALL » dans le fichier /etc/hosts.allow, sans quoi vous vous exposeriez à des erreurs du type : « 554 SMTP service not available » lors des tentatives d'envoi de mails.

Si vous êtes derrière un routeur, configurez-le de telle sorte que le port 25 soit forwardé vers votre machine. Si vous ne le faites pas, les messages émis en direction de vos listes ne vous parviendront jamais, sans que vous ne sachiez pourquoi (quelques messages du genre « connection timed out » apparaîtront au bout de longues heures d'attente si vous n'avez pas modifié les réglages par défaut)…

Faire suivre le port 25 n'est pas suffisant si vous faites partie des heureux possesseurs de freebox (et sans doute d'autres boxes) : l'envoi de mails par le port SMTP de la freebox est bloqué par défaut, pour des raisons de sécurité. Pour corriger ça : rendez vous dans l'interface de gestion de votre compte Free, puis suivez « Fonctionnalités optionnelles de la Freebox (Wifi, Routeur, IPv6...) », le lien « Configurez » relatif aux « autres fonctions », et décochez la case « Blocage SMTP sortant ». Envoyez et redémarrez votre freebox.

Configurations

Configuration d'Exim

Mailman, en tant que serveur de liste de diffusion, a besoin d'un serveur SMTP pour envoyer les emails aux abonnés de la liste. Le serveur SMTP « naturel » pour Mailman est Exim. Le fichier de configuration d'Exim est situé en /etc/mail/exim.conf. Il est divisé en plusieurs parties, mais seules trois d'entre elles vont nous intéresser pour une mise en œuvre minimale. Notons que certaines installations peuvent avoir un fichier différent pour chacune de ces parties.

Partie principale

La partie principale (MAIN CONFIGURATION SETTINGS) régit le comportement global d'Exim. Cette partie contient donc des choses très intéressantes, telles que la gestion des délais d'attente et des timeout, sur lesquelles nous ne nous attarderons cependant pas ici (référez-vous aux commentaires).

Repérez le champ « primary_hostname » et donnez-lui la valeur de votre nom de domaine :

 primary_hostname = votre_domaine.org


Sans cette modification, l'envoi de mails se solderait par un échec avec un message d'erreur du type :

 R=dnslookup T=remote_smtp: SMTP error from remote mail server after MAIL FROM:<user@votre_domaine.org>:
 host truc.machin.fr [212.121.121.212]: 553 sorry, your envelope sender domain must exist (#5.7.1)


Ensuite, n'importe où dans cette section (c'est-à-dire avant la section suivante, « ACL CONFIGURATION » dans le fichier fourni par défaut avec ArchLinux), ajoutez ces quelques lignes, qui définissent la position des répertoires et script utilisés par Mailman, ainsi que l'utilisateur et le groupe auxquels ils appartiennent (mailman) :

## Mailman ====
# Home dir for your Mailman installation -- aka Mailman's prefix
# directory.
MAILMAN_HOME=/home/mailman
MAILMAN_WRAP=MAILMAN_HOME/mail/mailman

# User and group for Mailman, should match your --with-mail-gid
# switch to Mailman's configure script.
MAILMAN_UID=mailman
MAILMAN_GID=mailman

# The path of the list config file (used as a required file when
# verifying list addresses)
MAILMAN_LISTCHK=MAILMAN_HOME/lists/${lc::$local_part}/config.pck

Partie routeur

Un peu plus bas dans le fichier exim.conf se trouve la partie routeur (ROUTERS CONFIGURATION), qui définie la manière dont les adresses seront traitées. L'ordre est important, il est donc conseillé, à moins d'avoir d'autres utilisations d'Exim que l'envoi de mails pour Mailman, de mettre les routeurs pour Mailman au tout début de cette section, c'est-à-dire juste après la ligne « begin routers ». Voici les lignes à rajouter :

## Mailman #====
  mailman_main_router:
    driver = accept
    require_files = MAILMAN_HOME/lists/$local_part/config.pck
    transport = mailman_transport

  mailman_router:
    driver = accept
    require_files = MAILMAN_HOME/lists/$local_part/config.pck
    local_part_suffix = -bounces : -bounces+* : \
                        -subscribe : -unsubscribe : \
                        -confirm+* : -join : -leave : \
                        -owner : -request : -admin
    transport = mailman_transport
====####====

Partie transport

La partie transport (TRANSPORTS CONFIGURATION) décrit la façon dont les messages vont être gérés par Exim une fois l'adresse reconnue. Ajoutez-y les lignes suivantes, quelque part après « begin transports » :

## Mailman ====
mailman_transport:
    driver = pipe
    command = MAILMAN_WRAP \
        '${if def:local_part_suffix {${sg{$local_part_suffix} \
        {-(\\w+)(\\+.*)?}{\$1}}}{post}}' \
        $local_part
    current_directory = MAILMAN_HOME
    home_directory = MAILMAN_HOME
    user = MAILMAN_UID
    group = MAILMAN_GID

Quelques tests

Ajoutez exim à la liste des démons lancés au démarrage, dans le fichier /etc/rc.conf. Pour le lancez dès maintenant :

 sudo /etc/rc.d/exim start
Important: N'oubliez pas de le redémarrer après chaque modification d'exim.conf (en remplaçant « start » par « restart » dans la commande précédente).

Exim est maintenant configuré pour fonctionner avec Mailman. Testons-le quand même, on ne sait jamais…


La commande « exim -bV » vérifie la validité syntaxique du fichier de configuration d'Exim. Ça ne coûte rien de le faire.


Testons ensuite le port 25 (SMTP) :

 telnet localhost smtp

Vous devriez obtenir une invite de commande (que vous pouvez quitter avec la commande « quit ») précédée des lignes :

 Trying 127.0.0.1...
 Connected to localhost.localdomain.

Si ce n'est pas le cas, pas la peine d'aller plus loin. Vérifiez que localhost est bien défini dans /etc/hosts, et que vos règles iptables ne bloquent pas le port 25.

Si ça marche, passons au test suivant. Les deux commandes suivantes permettent respectivement de vérifier la présence d'une boîte locale et d'une adresse email réelle :

 exim -bt votre_login
 exim -bt une_adresse@mail.fr

Enfin, la commande exim permet également d'envoyer un mail directement, de la manière suivante :

exim -v une_adresse@mail.fr
From: votre_adresse@votre_domaine.org
To: une_adresse@mail.fr
Subject: un petit test
Coucou ? :D 


Tous les champs sont facultatifs. L'envoi s'effectue par un appui sur Ctrl+D, et des informations détaillées sur la réussite ou l'échec du transfert s'affichent dans le terminal.

En cas d'erreur à l'un des tests ou plus tard, pensez à vérifier les fichiers de log : ils sont situés dans /var/log/exim/ (et lisible par root uniquement par défaut).

Configuration de Mailman

Exim est configuré, et vous vous êtes assurés qu'il fonctionnait correctement (si ce n'est pas le cas, vous risquez d'avoir des problèmes au niveau de l'inscription aux listes ou de l'envoi des messages). Il ne reste plus qu'à s'occuper de Mailman.

Éditez le fichier /home/mailman/Mailman/mm_cfg.py, et ajoutez-y à la fin :

 DEFAULT_EMAIL_HOST = 'votre_domaine.org'
 DEFAULT_URL_HOST = 'votre_domaine.org'
 PUBLIC_ARCHIVE_URL = 'http://%(hostname)s/archives/%(listname)s'


Suivez ensuite les instructions pour créer une nouvelle liste grâce à la commande :

 sudo /home/mailman/bin/newlist maliste
Important: Il est nécessaire de commencer par la création d'une liste nommée « mailman », même si vous ne vous en servez pas.


Cette commande vous donnera une liste d'aliases à copier dans le fichier /etc/aliases. Normalement ce n'est pas nécessaire, le deuxième routeur ajouté dans exim.conf est censé faire le travail. Si toutefois vous insistez, ce n'est pas la peine de créer ce fichier, vous pouvez simplement utiliser celui existant dans /etc/mail/. Il vous faut ensuite exécuter la commande « newaliases ».


Réglez les permissions en exécutant la commande suivante jusqu'à ce qu'elle n'affiche plus aucune erreur, et après chaque nouvelle création de liste :

 sudo /home/mailman/bin/check_perms -f
Important: Si vous obtenez une erreur du type « Permission denied » dans /home/mailman/logs/error (empêchant par exemple l'enregistrement des mails dans les archives), réexécutez cette commande check_perms.


Enfin, démarrez le démon mailman (pensez également à l'ajouter dans votre rc.conf) :

 sudo /etc/rc.d/mailman start

Votre liste a pour adresse maliste@votre_domaine.org. Vous pouvez désormais proposer à vos amis, collègues, clients ou autres de s'inscrire à votre liste en envoyant un email à maliste-subscribe@votre_domaine.org, ou un mail avec comme sujet « subscribe » à maliste-request@votre_domaine.org, ou encore si vous avez configuré Apache de passer par l'interface web à http://votre_domaine.org/mailman/listinfo/maliste.

Quant à vous, n'oubliez pas de régler finement les paramètres de votre liste, soit en manipulant les fichiers de configuration situés dans /home/mailman (déconseillé !!!), soit en utilisant les commandes dédiées dans /home/mailman/bin, ou tout simplement en utilisant l'interface de gestion administrateur dédiée à ça, située en http://votre_domaine.org/mailman/admin/maliste (conseillé !!! Mais nécessite d'avoir configuré Apache).

Configuration d'Apache

Si vous souhaitez fournir une interface web pour les archives ou la gestion administrative de vos listes de diffusion, il vous faudra également installer et configurer Apache.

En supposant que celui-ci soit installé et configuré correctement (n'oubliez pas d'ajouter httpd à la liste des démons lancés au démarrage dans /etc/rc.conf), tout ce qu'il vous reste à faire est de rajouter la possibilité d'interagir avec Mailman. Pour cela, éditez le fichier /etc/httpd/conf/httpd.conf et ajoutez-y les lignes suivantes :

 ## Mailman ====
 ScriptAlias /mailman/ /home/mailman/cgi-bin/
 Alias /archives/ /home/mailman/archives/public/


Ces deux lignes auront pour l'effet de placer les répertoires cités à la racine de votre serveur : l'accueil des listes en http://votre_domaine.org/mailman/, et les archives en http://votre_domaine.org/archives/.

Afin de pouvoir régler de manière précise les préférences de ces deux sections vous aurez également besoin des lignes suivantes (dans le même fichier) :

## Mailman ====
<Directory /home/mailman/cgi-bin/>
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>
<Directory /home/mailman/archives/public>
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>


Il ne vous reste qu'à (re)démarrer le démon httpd pour prendre en compte ces changements :

 sudo /etc/rc.d/httpd restart

FAQ & erreurs courantes

Un certain nombre de messages d'erreur et les solutions associées sont déjà disséminées dans le texte précédent. En voici quelques autres :


Problèmes avec qrunner

Typiquement, vous rentrez chez vous et vous apercevez que votre ordinateur a pris un coup à cause d'un orage… Au redémarrage, les mails en attente ne sont toujours pas acheminés, et un « pgrep mailman » ne vous renvoie rien, ce qui signifie que le démon mailman n'est pas en route. Un petit coup d'œil dans les logs (fichier /home/mailman/logs/error) vous indique une des erreurs suivantes :

Le verrou du qrunner principal ne peut être obtenu.

« //Le verrou du qrunner principal ne peut être obtenu. Il semble qu'il y ait un vieux fichier verrou du qrunner principal. Essayer de redémarrer mailmanctl avec l'option -s.// »

Ou en VO : « The master qrunner lock could not be acquired. It appears as though there is a stale master qrunner lock. Try re-running mailmanctl with the -s flag. »

Comme indiqué, essayez la commande :

 /home/mailman/bin/mailmanctl -s start

Impossible de disposer d'un verrou pour le qrunner principal.

« Impossible de disposer d'un verrou pour le qrunner principal. Il semble qu'un autre processus qrunner principal soit en cours d'exécution. »

Redémarrez qrunner :

 /home/mailman/bin/mailmanctl start

Problèmes de permissions

Mailman CGI error!!!
The Mailman CGI wrapper encountered a fatal error. This entry
is being stored in your syslog:

Group mismatch error. Mailman expected the CGI
wrapper script to be executed as group "http", but
the system's web server executed the CGI script as
group "nobody". Try tweaking the web server to run the
script as group "http", or re-run configure,
providing the command line option `--with-cgi-gid=nobody'.


L'utilisateur et le groupe utilisés par défaut dans les paquets serveurs archlinux sont http. Si vous avez modifié l'utilisateur du démon apache en nobody, par exemple pour suivre un autre tutoriel, il est préférable de repasser en http. Pour ce faire, éditez le fichier /etc/httpd/conf/httpd.conf et modifiez les lignes :

 User nobody
 Group nobody

en :

 User http
 Group http

Puis redémarrez le serveur apache, et par précaution mailman :

 sudo /etc/rc.d/httpd restart
 sudo /etc/rc.d/mailman restart

Il est fort probable que vous rencontriez quelques soucis au niveau des droits sur certaines pages, que ce soit avec mailman ou vos autres serveurs, tels que dokuwiki. Il est donc conseillé après une telle modification de vérifier manuellement (c'est-à-dire avec un navigateur web) les pages impliquant vos différents serveurs, et en cas de problème de modifier le propriétaire des fichiers correspondants. Par exemple si vous n'arrivez pas à afficher l'interface web de mailman :

 sudo chown -R http /home/mailman

Ou si votre wiki ne fonctionne plus (NB: dans ce cas précis, pensez également à supprimer, s'il existe, le fichier /tmp/sess_XXX où XXX est une suite aléatoire de lettres et de chiffres) :

 sudo chown -R http /srv/www/dokuwiki
 

Une autre solution consiste à utiliser le groupe mailman. Pour ce faire, il faut modifier l'user http et l'ajouter au groupe mailman :

usermod -aG mailman http

Liens utiles (ou pas)

NB : Les liens suivants sont tous en anglais.

Outils personnels