Installation von GNU Mailman unter Debian

Dieser Artikel beschreibt, wie GNU Mailman zusammen mit Exim unter Debian eingerichtet werden kann. Er setzt daher ein funktionierendes Mailsetup, ähnlich dem hier beschriebenen Setup voraus. Dabei handelt es sich um meine Mitschriften bei der Installation. Weitere Informationen finden sich unter Anderem in /usr/share/doc/mailman/README.Exim4.Debian.

Mailman installieren

Mailman kann unter Debian einfach aus den Repositories installiert werden.

$ apt-get install mailman

Anschließend muss manuell eine Liste namens mailman angelegt werden. In diesem Schritt müssen auch E-Mailadresse und Passwort des Listenbesitzers (und somit des Administrators) eingegeben werden. Die hier eingegebenen Werte sollte man sich gut merken.

$ newlist mailman

Dabei fordert das Skript einen auf, verschiedene Aliase in /etc/alias einzutragen, bevor Mailman das erste mal gestartet werden kann. Dies kann ignoriert werden, da Exim die Mailinglisten automatisch erkennen soll. Die Ausgabe der Aliasvorschläge wird in einem späteren Schritt deaktiviert.

$ /etc/init.d/mailman start

Um die Weboberfläche zu aktivieren, genügt es einen Symlink auf die mitgelieferte Beispielkonfiguration für Apache zu setzen. Voraussetzung hierfür ist, dass Apache2 ohne virtuelle Hosts betrieben wird. Ein Beispiel für virtuelle Hosts befindet sich jedoch auskommentiert in derselben Datei:

$ ln -s /etc/mailman/apache.conf /etc/apache2/conf.d/mailman
$ /etc/init.d/apache2 reload

Eine Beispielkonfiguration für Apache mit virtuellen Hosts könnte hingegen so aussehen:

$ more /etc/apache2/conf.d/mailman

/etc/apache2/conf.d/mailman
<VirtualHost *>
    ##
    ## BASIC CONFIGURATION
    ##
    ServerName lists.example.org
    ServerAdmin webmaster@exmaple.org

    ErrorLog ${APACHE_LOG_DIR}/lists.example.org/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/lists.example.org/access.log combined

    <Directory />
        Options -Indexes
        Order deny,allow
        Deny from all
    </Directory>

    ##
    ## MAILMAN MAILING LIST MANAGER
    ## See: /etc/mailman/apache.conf for examples
    ##
    RedirectMatch ^/$ /mailman/listinfo

    <Directory /usr/lib/cgi-bin/mailman/>
        AllowOverride None
        Options !ExecCGI
        AddHandler cgi-script .cgi
        Order allow,deny
        Allow from all
    </Directory>
    <Directory /var/lib/mailman/archives/public/>
        Options FollowSymlinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
    <Directory /usr/share/images/mailman/>
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>

    Alias /pipermail/ /var/lib/mailman/archives/public/
    Alias /images/mailman/ /usr/share/images/mailman/

    ScriptAlias /admin /usr/lib/cgi-bin/mailman/admin
    ScriptAlias /admindb /usr/lib/cgi-bin/mailman/admindb
    ScriptAlias /confirm /usr/lib/cgi-bin/mailman/confirm
    ScriptAlias /create /usr/lib/cgi-bin/mailman/create
    ScriptAlias /edithtml /usr/lib/cgi-bin/mailman/edithtml
    ScriptAlias /listinfo /usr/lib/cgi-bin/mailman/listinfo
    ScriptAlias /options /usr/lib/cgi-bin/mailman/options
    ScriptAlias /private /usr/lib/cgi-bin/mailman/private
    ScriptAlias /rmlist /usr/lib/cgi-bin/mailman/rmlist
    ScriptAlias /roster /usr/lib/cgi-bin/mailman/roster
    ScriptAlias /subscribe /usr/lib/cgi-bin/mailman/subscribe
    ScriptAlias /mailman/ /usr/lib/cgi-bin/mailman/
</VirtualHost>

In diesem Fall kann die Adminoberfläche mit folgender URL aufgerufen werden: http://lists.example.net/admin. Zuvor muss allerdings noch die Mailman-Konfiguration angepasst werden:

$ nano /etc/mailman/mm_cfg.py
DEFAULT_URL_PATTERN = 'http://%s/'
PRIVATE_ARCHIVE_URL = '/mailman/private'
IMAGE_LOGOS         = '/images/mailman/'
DEFAULT_EMAIL_HOST = 'lists.example.net'
DEFAULT_URL_HOST   = 'lists.example.net'

Folgende Zeilen werden  in jedem Fall benötigt, weil Exim die neuen Mailinglisten automatisch erkennen soll. Sie verhindern, dass das newlist-Kommando Änderungsvorschläge für /etc/aliases generiert, da diese für Exim nicht benötigt werden. Stattdessen wird eine Datei mit allen angelegten Mailinglisten generiert.

MTA = 'Postfix'
POSTFIX_ALIAS_CMD = '/bin/true'
POSTFIX_MAP_CMD = 'chgrp Debian-exim'
POSTFIX_STYLE_VIRTUAL_DOMAINS = [ 'example.com', 'example.org']
OWNERS_CAN_DELETE_THEIR_OWN_LISTS = Yes

ACHTUNG: Damit die Adminoberfläche auf die richtigen URLs verweist, muss sie mit fix_url repariert werden!

$ cd /usr/lib/mailman/bin
$ ./withlist -l -r fix_url mailman
$ /etc/init.d/mailman restart

Aus Sicherheitsgründen sollte nun die Standardliste mailman gegen unbefugte Beitritte gesichert werden. Dies geht am einfachsten über die Weboberfläche, indem man folgende URL aufruft und dann folgende Optionen auswählt: http://lists.example.net/admin/mailman/

  1. [Privacy options] --> [Subscription rules]
  2. Advertise this list when people ask what lists are on this machine? [No]
  3. What steps are required for subscription? [Confirm and Approve]
  4. [Submit your changes]

Um neue Listen über das Webinterface anlegen zu können, muss noch ein Site Password gesetzt werden. Dieses Passwort befähigt zur Administration aller Mailinglisten unabhängig vom Listenpasswort. ("Think root for Unix systems" laut Handbuch). Auf ähnliche Weise kann auch das "List Creator's Password" gesetzt werden. Es erlaubt nur neue Listen anzulegen, um diese Aufgabe an einzelne Personen weiterdelegieren zu können:

$ cd /usr/lib/mailman/bin
$ ./mmsitepass

Exim konfigurieren

Damit die neu angelegten Mailinglisten nun auch genutzt werden können, muss nun die Konfiguration von Exim angepast werden, so dass der Mailserver mit Mailman zusammenarbeiten kann. Dieser Schritt ist im Instllationsleitfaden von Mailman gut dokumentiert, weicht unter Debian jedoch davon ab, da die Eximkonfiguration von Debian nicht dem Standardverhalten einer großen Konfigurationsdatei entspricht. Stattdessen ist die Konfiguration unter Debian in vielen kleinen Dateien unterhalb des Verzeichnisses /etc/exim4/conf.d aufgehoben.

Zunächst schlägt die Dokumentation vor, ein paar globale Makros zu definieren:

$ nano /etc/exim4/conf.d/main/04_exim4-config_DES_mailman
.ifndef MAILMAN_HOME
MAILMAN_HOME=/var/lib/mailman
.endif
.ifndef MAILMAN_WRAP
MAILMAN_WRAP=MAILMAN_HOME/mail/mailman
.endif
.ifndef MAILMAN_USER
MAILMAN_USER=list  
.endif
.ifndef MAILMAN_GROUP
MAILMAN_GROUP=daemon  
.endif

Dann muss ein neuer Transport angelegt werden:

$ nano /etc/exim4/conf.d/transport/40_exim4_config_DES_mailman
mailman_transport:
  debug_print = "T: mailman_transport for $local_part@$domain"
  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_USER
  group = MAILMAN_GROUP
  freeze_exec_fail = true

Außerdem muss ein neuer Router angelegt werden:

$ nano /etc/exim4/conf.d/router/970_exim4-config_DES_mailman
# Messages get sent out with
# envelope from "mailman-bounces@virtual_domain"
# But mailman doesn't put such addresses
# in the aliases. Recognise these here.
mailman_workaround:
  debug_print = "R: mailman_workaround for $local_part@$domain"
  domains = +local_domains
  require_files = MAILMAN_HOME/lists/$local_part/config.pck
  driver = accept
  local_parts = mailman
  local_part_suffix_optional
  local_part_suffix = -bounces : -bounces+* : \
           -confirm+* : -join : -leave : \
           -subscribe : -unsubscribe : \
           -owner : -request : -admin : -loop
  transport = mailman_transport
  group = MAILMAN_GROUP

# Mailman lists
mailman_router:
  debug_print = "R: mailman_router for $local_part@$domain"
  domains = +local_domains
  condition = ${lookup{$local_part@$domain}lsearch{MAILMAN_HOME/data/virtual-mailman}{1}{0}}
  require_files = MAILMAN_HOME/lists/$local_part/config.pck
  driver = accept
  local_part_suffix_optional
  local_part_suffix = -bounces : -bounces+* : \
                      -confirm+* : -join : -leave : \
                      -subscribe : -unsubscribe : \
                      -owner : -request : -admin : -loop
  transport = mailman_transport
  group = MAILMAN_GROUP

Zum Schluss muss noch sichergestellt werden, dass Mailman nicht versucht, mehr Mails auf einmal zu versenden, als es Exim zulässt, weil Exim sonst ein den Queue-Modus umschaltet, wodurch die Zustellung der Mails deutlich verlangsamt wird. Konkret bedeutet das, dass der Wert SMTP MAX SESSIONS PER CONNECTION in der Mailman-Konfiguration kleiner als der Wert smtp_accept_queue_per_connection von Exim. Da der Wert in der Exim4-Konfiguration von Debian aber nicht auftaucht, soll hier erstmal nichts geändert werden.

Damit die veränderte Konfiguration aktiv wird, muss die Eximkonfigurationsdatei neugeneriert und der Mailserver durchgestartet werrden:

$ update-exim4.conf
$ exim4 -bV
$ /etc/init.d/exim4 restart

Das Setup testen

Die Exim-Konfiguration kann ganz einfach mit Exim selbst getestet werden, indem einfach geprüft wird, ob Mails an bestimmte Empfänger zugestellt werden können. Für diesen Test können die verschiedenen Adressen der Site List (mailman) verwendet werden, die ja ohnehin vorhanden sein muss.

$ exim4 -bt mailman-subscribe
$ exim4 -bt mailman-unsubscribe
$ ...

Das Ergebnis muss jeweils eine Beschreibung der verwendeten Transporte und Router sein, ähnlich dieser Ausgabe:

R: system_aliases for mailman-subscribe@developer-showcase.de
R: mailman_workaround for mailman@developer-showcase.de
mailman-subscribe@developer-showcase.de
  router = mailman_workaround, transport = mailman_transport

Wenn eine solche Ausgabe erscheint, ist noch ein Fehler in der Konfiguration oder es wurde vergessen, die globale Konfigurationsdatei von Exim4 neuzubauen.

R: system_aliases for mailman-subscribe@lists.example.net
R: mailman_router for mailman-subscribe@lists.example.net
mailman-subscriber@lists.example.net is undeliverable: Unrouteable address

Nach diesem technischen Test noch ein funktionaler Test. Mit dem Kommando newlist wird eine neue Liste angelegt, welche daraufhin über die Weboberfläche mit Teilnehmern gefüllt wird. Anschließend kann eine Mail an die Liste geschickt werden, um zu sehen, ob diese korrekt zugestellt wird.

$ newlist
Enter the email of the person running the list: owner@example.net
Initial test password:
Hit enter to notify test owner...

Die Teilnehmer können in der Weboberfläche unter folgender URL hinzugefügt werden: http://lists.example.net/admin/test/ --> [Membership Management...] --> [Mass Subscription].

Anschließend schickt man mehrere Mails an die Liste und prüft, ob diese korrekt zugestellt werden. Die Absenderadresse sollte dabei natürlich der Liste angehören. Wenn alles funktioniert, kann die Liste über die Weboberfläche wieder gelöscht werden. (Vgl. Konfigurationsoption OWNERS_CAN_DELETE_THEIR_OWN_LISTS von Mailman, weil dies standardmäßig nicht erlaubt ist.)


attachments

imageappend Append an Image
>