#pragma keywords créer, mailing, list, Mailing, List, Créer

= Mailman 3 =

{{{#!wiki caution
Mailman 3 est encore en cours de déploiement, cette documentation risque d'évoluer dans les jours à venir.
}}}

<<TableOfContents>>

Mailman 3 est le service de listes de diffusions utilisé au Crans. Il vient remplacer [[CransTechnique/ServicesMineurs/MailMan|Mailman 2]], après près de 20 ans de bons et loyaux services.

Mailman est déployé sur le serveur [[CransTechnique/LesServeurs/Virtuels/ServeurMailman|mailman]]. L'interface web de Mailman est disponible sur https://lists.crans.org/ (à venir) ou sur https://mailman.crans.org/.

Les listes de diffusion sont dans le domaine {{{@lists.crans.org}}} (certaines ont des alias {{{@crans.org}}}).

== Installation ==

=== Mailman ===

Mailman 3 est gentiment packagé sous Debian, on se contente donc d'installer le paquet depuis APT.

Les données de Mailman seront stockées dans {{{/var/lib/mailman3}}}. On prévoie donc un disque dédié monté sur ce chemin.

Sur un Debian Bullseye propre, il suffit de faire :

{{{
$ sudo apt update
$ sudo apt install --no-install-recommends mailman3-full
}}}

Mailman est désormais déjà prêt à être configuré et utilisé :) Il est bon de vérifier néanmoins que le dossier {{{/var/lib/mailman3}}} appartient bien à {{{list:list}}}.

Pour des raisons de confort d'utilisation d'un terminal Django, installer iPython via le paquet {{{python3-ipython}}} peut se révéler très pratique.

=== Installation de la base de données ===

Mailman est essentiellement séparé en deux cœurs : {{{mailman}}} qui gère les listes et {{{mailman-web}}} qui gère l'affichage web avec Django. Les deux parties ont besoin de leur propre base de données.

Sur le serveur qui héberge [[CransTechnique/Services/PostGreSQL|PostgreSQL]] ([[CransTechnique/LesServeurs/ServeurTealc|tealc]] au Crans), il faut donc créer les deux bases de données :

{{{
$ sudo -u postgres createuser -P mailman3
$ sudo -u postgres createdb -O mailman3 mailman3
$ sudo -u postgres createuser -P mailman3web
$ sudo -u postgres createdb -O mailman3web mailman3web
}}}

On n'oublie pas d'autoriser les connexions dans {{{/etc/postgresql/11/main/pg_hba.conf}}} :

{{{
host   mailman3    mailman3    172.16.10.0/24    md5
host   mailman3    mailman3    fd00:0:0:10::/64    md5

host   mailman3web    mailman3web    172.16.10.0/24    md5
host   mailman3web    mailman3web    fd00:0:0:10::/64    md5
}}}


=== Configuration de Mailman ===

Sa configuration se trouve dans {{{/etc/mailman/mailman.cfg}}}, qui doit appartenir à {{{root:list}}} et avoir pour permissions {{{0640}}}.

On définit dans la partie {{{[database]}}} les paramètres de connexion à la base de données :

{{{
[database]
class: mailman.database.postgresql.PostgreSQLDatabase
url: postgres://mailman3:PASSWORD@172.16.10.1:5432/mailman3
}}}

Dans la partie {{{[webservice]}}}, on définit un mot de passe pour la connexion à l'API nommé {{{admin_pass}}}.

On configure enfin la réception et l'envoi de mails :

{{{
[mta]
incoming: mailman.mta.postfix.LMTP

outgoing: mailman.mta.deliver.deliver

smtp_host: 172.16.10.124  # Redisdead
smtp_port: 25
smtp_user: 
smtp_pass: 

lmtp_host: 127.0.0.1
lmtp_port: 8024

configuration: python:mailman.config.postfix
}}}

Les mails sont reçus localement par LMTP et pour l'envoi mailman s'adresse au serveur SMTP de Redisdead.

=== Configuration de Hyerkitty ===

Hyperkitty est le service d'archivage de Mailman. Pour l'activer, il faut ajouter dans le fichier de configuration de Mailman :

{{{
[archiver.hyperkitty]
class: mailman_hyperkitty.Archiver
enable: yes
configuration: /etc/mailman3/mailman-hyperkitty.cfg
}}}

Et renseigner le mot de passe dans {{{/etc/mailman3/mailman-hyperkitty.cfg}}} :

{{{
[general]
base_url: http://localhost/hyperkitty/
api_key: {{ mailman3.archiver_key }}
}}}

=== Configuration de Mailman-web ===

Sa configuration se trouve dans {{{/etc/mailman/mailman-web.py}}}, qui doit appartenir à {{{root:www-data}}} et avoir pour permissions {{{0640}}}.

{{{
SECRET_KEY = '{{ mailman3.web_secret_key }}'

ADMINS = (
     ('Mailman Suite Admin', 'root@crans.org'),
)

ALLOWED_HOSTS = [
    "localhost",  # Archiving API from Mailman, keep it.
    "mailman.crans.org",
    "lists.crans.org",
]

# Mailman API credentials
MAILMAN_REST_API_URL = 'http://localhost:8001'
MAILMAN_REST_API_USER = 'restadmin'
MAILMAN_REST_API_PASS = '{{ mailman3.restadmin_pass }}'
MAILMAN_ARCHIVER_KEY = '{{ mailman3.archiver_key }}'
MAILMAN_ARCHIVER_FROM = ('127.0.0.1', '::1')

# Add allauth_cas_crans path
import sys
sys.path.insert(0, "/usr/scripts/mailman")

INSTALLED_APPS = (
    'mailman_theme_crans',  # override templates
    'hyperkitty',
    'postorius',
    'django_mailman3',
    'django.contrib.admin',
    'django.contrib.admindocs',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'django_gravatar',
    'compressor',
    'haystack',
    'django_extensions',
    'django_q',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth_cas',
    'allauth_cas_crans',
)

# Database configuration
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mailman3web',
        'USER': 'mailman3web',
        'PASSWORD': 'PASSWORD',
        'HOST': '172.16.10.1',
        'PORT': 5432,
        'OPTIONS': {
        },
    }
}

# Reverse-proxy configuration
USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_SCHEME', 'https')

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True

EMAILNAME = 'crans.org'
DEFAULT_FROM_EMAIL = f'contact@crans.org'
SERVER_EMAIL = f'root@crans.org'

ACCOUNT_DEFAULT_HTTP_PROTOCOL = "https"
SOCIALACCOUNT_PROVIDERS = {
    'crans': {},
}

COMPRESS_PRECOMPILERS = (
  ('text/less', 'lessc {infile} {outfile}'),
  ('text/x-scss', 'sassc -t compressed {infile} {outfile}'),
  ('text/x-sass', 'sassc -t compressed {infile} {outfile}'),
)
COMPRESS_OFFLINE = True

POSTORIUS_TEMPLATE_BASE_URL = 'http://localhost/mailman3/'
}}}

Certains paramètres concernent la connexion au CAS, voir ci-dessous.

=== Connexion via le CAS ===

On souhaite que les adhérents se connectent sur l'interface web via le CAS du Crans. On comment pour cela par installer l'exension nécessaire pour {{{django-allauth}}}, qui n'existe malheureusement pas dans les paquets Debian :

{{{
$ sudo apt install --no-install-recommends python3-pip python3-lxml
$ sudo pip3 install django-allauth-cas
}}}

On ajoute alors le module {{{allauth_cas}}} aux applications installées (voir ci-dessus).

On souhaite alors configurer le CAS pour le Crans. On utilise pour cela le module {{{allauth_cas_crans}}} qui est implémenté dans le dépôt {{{scripts}}} du Crans. En le supposant clôné dans {{{/usr/scripts}}}, on ajoute alors au fichier de configuration de {{{mailman-web}}} :

{{{
import sys
sys.path.insert(0, "/usr/scripts/mailman")
}}}

On peut désormais ajouter le module {{{allauth_cas_crans}}}. On n'oubliera pas d'autoriser https://mailman.crans.org/ et https://lists.crans.org/ d'accéder au CAS.

=== Thèmes Crans personnalisés ===

Une fois les scripts Crans sourcés comme ci-dessus, il suffit d'ajouter en première application {{{mailman_theme_crans}}} pour remplacer les thèmes par défaut.

=== Migration de la base de données, collecte des fichiers statiques ===

Pour migrer la base de données et créer les différentes tables, une fois Mailman bien configuré, il suffit de lancer :

{{{
$ sudo -u www-data mailman-web migrate
}}}

Pour importer les fichiers statiques :

{{{
$ sudo -u www-data mailman-web collectstatic
}}}

Et enfin, pour compresser et mettre en cache certaines ressources (afin d'optimiser le délai de réponse) :

{{{
$ sudo -u www-data mailman-web compress
}}}

Toutes ces opérations sont à faire après chaque mise à jour de mailman.

=== Redémarrer mailman ===

Les services sont gérés par systemd :

{{{
$ sudo systemctl restart mailman
$ sudo systemctl restart mailman-web
}}}

=== Postfix ===

==== Configuration standard ====

On installe un serveur Postfix qui servira uniquement à recevoir les mails (comme indiqué plus haut, l'envoi des mails se fait en contactant directement redisdead). On commence par installer {{{postfix}}} :

{{{
$ sudo apt install --no-install-recommends postfix
}}}

Sa configuration se fait dans {{{/etc/postfix/main.cf}}}. Le début de la configration est assez standard :

{{{
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# This postfix configuration set up a MTA only to send and receive mailing list mails

# When a mail is sent to @localhost, this domain will be used
myorigin = crans.org

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# Uncomment the next line to generate "delayed mail" warnings
delay_warning_time = 4h

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2

# TLS parameters
smtpd_tls_cert_file=/etc/letsencrypt/live/crans.org/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/crans.org/privkey.pem
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

# Limit to 200Mo by message
message_size_limit = 209715200

# Default aliases
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

# Only localhost
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

# Listen on IPv4 and IPv6
inet_interfaces = all
inet_protocols = all

# Do not use gethostname
myhostname = mailman.adm.crans.org
mydomain = crans.org

# Softbounce, ask remote mail server to send the mail again if error
# Do not keep it active in production!
soft_bounce = no
}}}

On veillera en particulier à bien générer un certificat TLS via certbot nommé {{{crans.org}}}.

On ajoute la configuration spécifique à Mailman 3 :

{{{
# Mailman3 integration
recipient_delimiter = +
unknown_local_recipient_reject_code = 550
owner_request_special = no
transport_maps =
    hash:/var/lib/mailman3/data/postfix_lmtp
local_recipient_maps =
    hash:/var/lib/mailman3/data/postfix_lmtp
relay_domains =
    hash:/var/lib/mailman3/data/postfix_domains
}}}

Il suffit ensuite de recharger Postfix.

==== Configuration du serveur mail principal ====

On souhaite que les mails soient reçus par le serveur mail principal, à savoir redisdead, afin de faire un premier tri et de gérer lui-même la sécurité des mails.

On ajoute alors {{{redisdead.crans.org}}}, {{{freebox.crans.org}}} et {{{sputnik.crans.org}}} en serveurs MX pour {{{lists.crans.org}}}.

Dans le fichier {{{/etc/postfix/main.cf}}}, on pense bien à ajouter {{{lists.crans.org}}} dans le champ {{{$mydestination}}} (et non {{{relay_domains}}} uniquement).

Dans {{{/etc/postfix/transport}}}, on indique à postfix de transporter les mails envoyer sur une adresse {{{@lists.crans.org}}} sur le serveur de Mailman :

{{{
lists.crans.org              smtp:[172.16.10.110]
}}}

Après un rechargement de postfix, les mails sont prêts à être distribués !

----
CatégorieCrans CatégoriePagePublique