Installation de mailman

Installation de mailman sur Ubuntu Dapper Drake (6.06) LTS.

apt-get install mailman

Configuration de l’accès Web

J’ai choisi de rendre accessible les listes mailman via des URL de la forme /mailman/. Voici donc la configuration à utiliser pour rendre accessible

/etc/mailman/mm_cfg.py
1
2
3
4
5
...
DEFAULT_URL_PATTERN = 'https://%s/mailman/'
PRIVATE_ARCHIVE_URL = 'mailman/private'
IMAGE_LOGOS         = '/images/mailman/'
...
/etc/apache2/site-enabled/lists
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<VirtualHost *:80 *:443>
ServerName lists.example.com

ScriptAlias /mailman/ /usr/lib/cgi-bin/mailman/
<Directory "/usr/lib/cgi-bin/mailman/">
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>

Alias /images/mailman/ /usr/share/images/mailman/
<Directory "/usr/share/images/mailman/">
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

Alias /pipermail/ /var/lib/mailman/archives/public/
<Directory "/var/lib/mailman/archives/public">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

<IfModule mod_rewrite.c>
RewriteEngine on

# Redirect to SSL if available

    <IfModule mod_ssl.c>
      RewriteCond %{HTTPS} !^on$ [NC]
      RewriteRule . https://%{HTTP_HOST}%{REQUEST_URI}  [L]
    </IfModule>

# Redirect root access to mailman list

RewriteRule ^$ /mailman/listinfo [R=permanent,L]
RewriteRule ^/$ /mailman/listinfo [R=permanent,L]

</IfModule>

</VirtualHost>

Lien entre Postfix et Mailman

/etc/postfix/main.cf
1
2
3
4
5
...
recipient_delimiter = +
owner_request_special = no
unknown_local_recipient_reject_code = 550
...

Utilisation d’un domaine lists.example.com

/etc/postfix/main.cf
1
2
3
4
5
...
relay_domains = ... lists.example.com
transport_maps = hash:/etc/postfix/transport
mailman_destination_recipient_limit = 1
...
/etc/postfix/master.cf
1
2
3
4
...
mailman unix  -       n       n       -       -       pipe
   flags=FR user=list
   argv=/etc/mailman/postfix-to-mailman.py ${nexthop} ${user}
/etc/postfix/transport
1
2
3
...
lists.example.com   mailman:
...
/etc/mailman/mm_cfg.py
1
2
3
4
5
6
...
DEFAULT_EMAIL_HOST = 'lists.example.com'
DEFAULT_URL_HOST   = 'lists.example.com'
MTA = 'None'
DEB_LISTMASTER = 'postmaster@drazzib.com'
...

Inclusion des listes dans le domaine standard example.com

Dans ce mode de fonctionnement, les mails des listes sont de la forme : ma-liste@example.com ou ma-liste-post@example.com

/etc/mailman/mm_cfg.py
1
2
3
4
5
...
DEFAULT_EMAIL_HOST = 'example.com'
DEFAULT_URL_HOST   = 'example.com'
MTA = 'Postfix'
...

Mailman sait généré automatique un fichier alias qui peut être inclu dans la configuration de Postfix pour que ce dernier redirige les mails vers Mailman :

/etc/postfix/main.cf
1
2
3
...
alias_maps = hash:/etc/postfix/aliases,hash:/var/lib/mailman/data/aliases
...

Astuces

Traitement d’un recipient_delimiter à “-”

Lorsque l’on utilise pas le réglage par défaut de Postfix pour le recipient_delimiter, ou que l’on fait une migration depuis QMail, il faut modifier les paramètres transmis au script postfix-to-mailman.py.

/root/scripts/postfix-to-mailman.sh
1
2
3
4
#!/bin/bash

test -z "$3" || DELIM=-
cat | /etc/mailman/postfix-to-mailman.py "$1" "$2$DELIM$3"
/etc/postfix/master.cf
1
2
3
4
...
mailman unix  -       n       n       -       -       pipe
   flags=FR user=list
   argv=/root/scripts/postfix-to-mailman.sh ${nexthop} ${user} ${extension}

Eviter le passage du mail à Amavis en double

Lorsque vous utilisez Postfix + Amavis + Mailman, lors de la réception d’un mail sur le port 25 de Postfix, ce dernier le transmet à Amavis (content filter sur le port 10024) qui le scanne puis le réinjecte fois à Postfix sur le port 10025 (instance de Postfix “sans traitement”). C’est seulement à partir de ce point que le mail peut-être transmit à Mailman… Enfin…

Par défaut, Mailman génère des mails à transmettre aux membres de la liste demandée, en les envoyant à Postfix sur le port 25 : ils vont donc être à nouveau scannés par Amavis. Vous imaginez la perte de temps…

Il vous suffit de spécifier à Mailman de réinjecter ses mails générés sur le port 10025 (sur le Postfix sans Amavis) afin de court-circuiter le passage par Amavis.

/etc/mailman/mm_cfg.py
1
2
3
4
...
SMTPHOST = '127.0.0.1'
SMTPPORT = 10025
...

Permettre aux non-membres de poster sur une liste

Imaginons que vous souhaitiez mettre en place une liste de discussion qui fonctionne également comme un mail de “contact@”. Une liste qui permettent de recevoir de façon “collégiale” l’ensemble des mails envoyés à cette adresse puis d’en discuter.

Dans la configuration par défaut de Mailman, ce dernier efuse les mails envoyés par des non-membres avec le message suivant : Post by non-member to a members-only list

Pour changer la configuration d’une liste afin de mettre en place cette solution, il faut se rendre sur l’interface d’administration puis dans “Privacy options” > “Sender filters” et rechercher l’option “generic_nonmember_action”. Il faut mettre cette option à “Accept”.

Erreur : Message has implicit destination

Cela se produit notamment lorsque la liste est en fait “abonnée” d’une autre liste (par exemple une liste commercial@ qui est abonnée à la liste @contact). L’email est en fait envoyée à l’autre liste puis transmis à la liste en cours.

Par défaut, Mailman vérifie que la liste est bien présente dans les champs To ou Cc. Dans le cas contraire on obtient le message suivant et le message est mis en attente de modération : Message has implicit destination

Pour changer la configuration d’une liste, il faut se rendre sur l’interface d’administration puis dans “Privacy options” > “Recipient filters” et rechercher l’option “require_explicit_destination”. Il faut mettre cette option à “No” pour désactiver cette vérification.