Login schließen
Hinweis: In Ihrem Browser müssen Cookies und JavaScript aktiviert sein!
Login login
Mailman und Postfix: eine alternative Konfiguration

Eine Anmerkung vorweg:
Dies ist keine Anleitung, wie man einen kompletten Mailserver mit Postfix einrichtet. Zu diesem Thema finden sich viele Anleitungen im Internet. Ich schreibe hier nur, was ich anders gemacht habe als alle Anleitungen, die ich zu diesem Thema gelesen habe.
Die Pfade und Benuternamen beziehen sich auf eine Installation unter Ubuntu 10.04. Auf anderen Systemen können sie abweichen.

(I) Postfix und Mailman – die „normale“ Methode

Die übliche Konfiguration von Postfix mit virtuellen Domains und Mailman sieht etwa so aus:

/etc/postfix/main.cf:

alias_maps = hash:/etc/aliases,
             hash:/var/lib/mailman/data/aliases
virtual_mailbox_domains = meinedomain.de
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox
virtual_alias_maps = hash:/etc/postfix/virtual_alias,
                     hash:/var/lib/mailman/data/virtual-mailman

Zeile 3 legt „meinedomain.de“ als virtual mailbox domain fest. Dies ist die geeignete Einstellungen für Mailkonten, für die Postfix zuständig ist und für die es keinen zugehörigen UNIX-Nutzer gibt.
Die Zeilen 4 und 5 geben Dateien an, in denen die Mailkonten und Weiterleitungen für meinedomain.de aufgelistet sind. In der Regel wird man zur Verwaltung seiner Mailkonten eine Weboberfläche wie Postfixadmin oder vboxadm installieren. In diesem Fall wird man in den Zeilen 3-5 keine hartkodierten Domains und Hash-Tabellen verwenden, sondern MySQL-Abfragen.
Zeile 1 enthält eine Standardtabelle mit Aliassen für die lokale Zustellung – im Zusammenhang mit virtuellen Domains nicht weiter interessant.
Die Zeilen 2 und 6 verweisen auf Dateien, die von Mailman erzeugt werden. Dazu gleich mehr.

/etc/mailman/mm_gfc.py:

MTA='Postfix'
POSTFIX_STYLE_VIRTUAL_DOMAINS = ['meinedomain.de']

Mit Zeile 1 weist man Postfix an, bei jeder Änderung an den Mailinglisten die Dateien /var/lib/mailman/data/aliases und /var/lib/mailman/data/virtual-mailman zu aktualisieren. Die zweite Zeile legt fest, welche Domains in der Datei /var/lib/mailman/data/virtual-mailman berücksichtigt werden sollen.

Der Inhalt von /var/lib/mailman/data/aliases sieht etwa folgendermaßen aus:

info@meinedomain.de              info
info-admin@meinedomain.de        info-admin
info-bounces@meinedomain.de      info-bounces
info-confirm@meinedomain.de      info-confirm
info-join@meinedomain.de         info-join
info-leave@meinedomain.de        info-leave
info-owner@meinedomain.de        info-owner
info-request@meinedomain.de      info-request
info-subscribe@meinedomain.de    info-subscribe
info-unsubscribe@meinedomain.de  info-unsubscribe

Für jede Mailingliste ist ein solcher Abschnitt vorhanden. Damit werden Emails, die an die gelisteten Adressen adressiert sind, auf lokale Zustellung umgestellt. Das heißt: die Emails gehen nun an die UNIX-Konten info, info-admin, info-bounces usw. Diese UNIX-Konten existieren aber gar nicht, und das ist auch nicht nötig, denn es folgt mit /var/lib/mailman/data/virtual-mailman eine zweite Weiterleitung:

info:             "|/var/lib/mailman/mail/mailman post info"
info-admin:       "|/var/lib/mailman/mail/mailman admin info"
info-bounces:     "|/var/lib/mailman/mail/mailman bounces info"
info-confirm:     "|/var/lib/mailman/mail/mailman confirm info"
info-join:        "|/var/lib/mailman/mail/mailman join info"
info-leave:       "|/var/lib/mailman/mail/mailman leave info"
info-owner:       "|/var/lib/mailman/mail/mailman owner info"
info-request:     "|/var/lib/mailman/mail/mailman request info"
info-subscribe:   "|/var/lib/mailman/mail/mailman subscribe info"
info-unsubscribe: "|/var/lib/mailman/mail/mailman unsubscribe info"

Damit werden die Emails, die nun an UNIX-Konten adressiert sind, an das Programm /var/lib/mailman/mail/mailman weitergeleitet, jeweils mit zwei Parametern, die die auszuführende Aktion und den Listennamen angeben.

Dieses Konzept funktioniert ausgezeichnet – bis auf den Umstand, dass hier die Trennung zwischen Mailkonten und UNIX-Konten aufgehoben wird, die man durch die Verwendung von virtual_mailbox_domains erreicht hat. Wer möchte, kann seinen Postfix ja mal so konfigurieren und dann eine Liste Namens root anlegen. Alle Meldungen, die eigentlich nach /var/mail/root gehören, landen jetzt in der Mailingliste.

(II) postfix-to-mailman.py

Eine weitere oft dokumentierte Konfiguration verwendet das Python-Script postfix-to-mailman.py. Die bisherigen Mailman-Einträge in /etc/postfix/main.cf (Zeilen 2 und 6) fallen weg, dafür benötigt man in dieser Datei nun folgende Angaben:

relay_domains = list.meinedomain.com
relay_recipient_maps = hash:/var/lib/mailman/data/virtual-mailman
relay_transport = mailman:
mailman_destination_recipient_limit = 1

Damit wird eine neue Subdomain list.meinedomain.com festgelegt, die nur für Mailinglisten genutzt wird. Die Datei /var/lib/mailman/data/virtual-mailman dient nun nicht mehr als Aliastabelle, sondern wird als Liste der gültigen Emailadressen für die Domain list.meinedomain.com verwendet. Schließlich folgt noch die Angabe, dass Emails für diese Domain vom Transport „mailman“ verarbeitet werden und dieser Transport nur eine Mail auf einmal verarbeiten kann.

Außerdem noch ein Eintrag in /etc/postfix/master.cf:

mailman unix  -       n       n       -       -       pipe
  flags=FR user=list 
  argv=/var/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}

Damit wird der oben erwähnte Transport „mailman“ definiert. „user=list“ gibt den UNIX-Benutzer an, unter dem Mailman läuft. Das Script /var/lib/mailman/bin/postfix-to-mailman.py tut nichts weiter, als die Parameter anders zu formatieren und an /var/lib/mailman/mail/mailman weiterzugeben.

Diese Variante löst das Problem mit den UNIX-Konten. Eine Mailingliste Namens root verursacht keinerlei Probleme. Doch der Nachteil dieser Konfiguration ist offensichtlich: Die Mailinglisten müssen eine eigene Domain verwenden.

(III) Meine Variante

Auf der Suche nach einer Lösung, die ohne Umweg über UNIX-Konten und ohne Extra-Domain auskommt, bin ich auf diese Anleitung gestoßen. Das hat mich zu folgender Lösung gebracht:

  1. Zunächst benötigt man ein zusätzliches Shell-Script: /var/lib/mailman/data/virtual_to_transport.sh
    #!/bin/bash
    sed -r -e 's/(^[^#]\S+\s+).+$/\1mailman:/' $1 > /var/lib/mailman/data/transport-mailman
    /usr/sbin/postmap /var/lib/mailman/data/transport-mailman
  2. Das Script muss von Mailman ausgeführt werden können:
    chown root:list /var/lib/mailman/data/virtual_to_transport.sh
    chmod 750 /var/lib/mailman/data/virtual_to_transport.sh
  3. In /etc/mailman/mm_gfc.py ist ein zusätzlicher Eintrag notwendig:
    MTA='Postfix'
    POSTFIX_STYLE_VIRTUAL_DOMAINS = ['meinedomain.de']
    POSTFIX_MAP_CMD = '/var/lib/mailman/data/virtual_to_transport.sh'
  4. Jetzt wird unser Script zum ersten Mal in Betrieb genommen. Die neu erzeugten Dateien erhalten passende Rechte:
    /usr/lib/mailman/bin/genaliases
    chown root:list /var/lib/mailman/data/transport-mailman*
    chmod 660 /var/lib/mailman/data/transport-mailman*
    (Das sollten die gleichen Rechte sein, die auch aliases und aliases.db haben. Nachzuprüfen mit ls -l /var/lib/mailman/data/aliases*)
  5. Es folgt die Konfiguration von Postfix.
    /etc/postfix/main.cf:

    alias_maps = hash:/etc/aliases
    virtual_mailbox_domains = meinedomain.de
    virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox,
                           hash:/var/lib/mailman/data/transport-mailman
    virtual_alias_maps = hash:/etc/postfix/virtual_alias
    transport_maps = hash:/var/lib/mailman/data/transport-mailman
    mailman_destination_recipient_limit = 1

    Der bereits bekannte Eintrag in /etc/postfix/master.cf:

    mailman unix  -       n       n       -       -       pipe
      flags=FR user=list 
      argv=/var/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}

Die Option POSTFIX_MAP_CMD in der Datei /etc/mailman/mm_gfc.py legt den Befehl fest, mit dem Mailman die Textversion von virtual-mailman in eine Hash-Tabelle umwandelt. Die Standardeinstellung ist /usr/sbin/postmap. Wir ersetzen diesen Befehl durch ein Shellscript, um die virtual-mailman-Tabelle von diesem Format

info@meinedomain.de              info
info-admin@meinedomain.de        info-admin
info-bounces@meinedomain.de      info-bounces

in dieses Format umzuschreiben:

info@meinedomain.de              mailman:
info-admin@meinedomain.de        mailman:
info-bounces@meinedomain.de      mailman:

Diese neue Tabelle wird dann mit /usr/sbin/postmap in eine Hash-Tabelle umgewandelt und in /etc/postfix/main.cf unter transport_maps angegeben. Dadurch muss für den mailman-Transport nicht mehr eine eigene (Sub)domain reserviert werden; es kann eine Domain genutzt werden, in der es auch andere Mailkonten gibt.
Man muss natürlich (wie auch schon bei Variante I) aufpassen, dass man nicht eine Mailingliste und ein Mailkonto mit gleichem Namen anlegt. Diese Gefahr lässt sich nicht vermeiden, wenn man Mailkonten und Mailman in der gleichen Domain betreiben will.

Falls ein Eintrag für virtual_mailbox_maps existiert und smtpd_reject_unlisted_recipient auf yes gesetzt ist (dies ist die Standardeinstellung), dann muss unsere transport-mailman-Tabelle zusätzlich noch einmal bei virtual_mailbox_maps aufgelistet werden. Andernfalls wird Postfix die Annahme von Mailinglisten-Emails verweigern.

veröffentlicht am 26.01.14 um 23:50 Uhr
Tags: Ubuntu, Computer, Mailserver, Linux

Kommentare

Es sind keine Kommentare vorhanden.

Kommentar verfassen

Name (notwendig)
Email (optional, wird nicht veröffentlicht)
Homepage (optional)

Kommentar:


Bitte übertrage die Zahl in umgekehrter Reihenfolge in das Feld Spamschutz!

Spamschutz (notwendig)