Création d'un serveur de listes de diffusion avec Mailman + Exim
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.
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éfinit 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 lancer dès maintenant :
sudo /etc/rc.d/exim start
Pour ceux qui sont sous systemd, utilisez cette commande pour lancer automatiquement exim au démarrage :
sudo systemctl enable exim
Pour le lancer dès maintenant :
sudo systemctl start exim
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
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
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.
- Une explication intéressante permettant de comprendre les messages d'erreur délivrés par le serveur SMTP.
- La norme RFC1893, qui défini les codes d'erreurs du protocole SMTP
- La liste de diffusion de Mailman.
- La FAQ de Mailman.
- Guide de l'administrateur de liste sous Mailman.
- La documentation d'Exim.
- La FAQ d'Exim.