Listen, so wie ich sie will – Meine Mailman-Anpassungen

Wir betreiben einen eigenen Server. Und wenn man schon mal so ein Ding hat, dann will man natürlich auch so viel machen, wie möglich ist.
Warum? Weil’s geht. Darum.
Also wollte ich natürlich auch mit Mailinglisten „spielen“. Und es sollte mit Mailman sein.

Aber wie so oft: Das Ding wollte nicht so wie ich. Warum nicht?

Mailman ist für die Verwaltung von Mailinglisten zuständig, Postfix spielt MTA.
Postfix kann virtuelle Domains verwalten, greift aber auch auf die klassische Aliases-Datei zurück.
Mailman legt für angelegte Listen unter dem Listennamen Einträge in einer eigenen alias-Datei an. Trifft der Name einer Liste den Benutzereintrag in der mailman-aliases, wird die ankommende Mail an mailman weitergereicht.

Mailman kann auch virtuelle Domains verwalten. Wird eine Liste mit virtueller Domain angelegt, kommt zu dem Eintrag in der mailman-aliases
ein Eintrag in der Datei virtual-mailman hinzu. Dort wird auf die vollständige Mail-Adresse der Liste geprüft und an den Benutzernamen weitergeleitet, der ja in der mailman-aliases mit Mailman verbunden ist.

Soweit, so gut. Allerdings ergibt sich folgendes Problem:

Wir haben eine Mailingliste „liste@domain1“.
Mailman legt Einträge in der virtual-mailman an, in der alles, was für „liste@domain1“ ankommt, auf den Benuzter „liste“ gemapt wird. In der Aliases-Datei wird für den Benutzer „liste“ mailman mit seiner entsprechenden Funktion aufgerufen.

Wenn jetzt eine Mail reinkommt für „liste@domain2“, wird diese Adresse zwar nicht in der virutal-mailman gefunden, wohl aber der Benutzer „liste“
in der mailman-aliases. Die Mail wird also an die Mailingliste ausgeliefert.

„Works as designed“, soll aber nicht!

Schnell hatte ich die Idee, den Benutzer, auf den in der virtual-mailman gemapt wird, durch einen Zusatz zu verändern – und die entsprechenden Einträge in der mailman-aliases ebenfalls.
Also: „liste@domain1“ wird in der virtual-mailman gemapt auf „liste—30ur0ia0vj0“, „liste—30ur0ia0vj0“ wird durch einen entsprechenden Eintrag in der mailman-aliases weitergereicht an mailman.
Wenn jetzt eine Mail für „liste@domain2“ reinkommt, kann die Adresse wie zuvor nicht in der virutal-mailman gefunden werden, durch den veränderten Benutzernamen aber auch nicht in der mailman-aliases. Die Mail geht also als unzustellbar zurück! So hätten wir es gerne…

Sowohl die aliases-Datei von mailman als auch die virtual-mailman werden durch das Script genaliases erzeugt, das abhängig vom verwendeten MTA unterschiedliche Funktionen aus anderen Scripten hinzulädt. Nach etwas suchen wurde ich fündig und habe als das „schuldige Script“ für meine Zwecke „Postfix.py“ identifiziert und direkt modifiziert.

    37a38,42
    > #Zufallszahlengenerator importieren
    > import random
    > #Zufallszahl erzeugen
    > ZUFALL = random.getrandbits(24)
    >
    112c117,119
    <         print >> fp, k + ‚:‘, ((fieldsz – len(k)) * ‚ ‚) + v

    >         #print >> fp, k + ‚:‘, ((fieldsz – len(k)) * ‚ ‚) + v
    >         #Eindeutigkeit mittels Zufallszahl
    >         print >> fp, k + ‚—‚ + str(ZUFALL) + ‚:‘, ((fieldsz – len(k)) * ‚ ‚) + v
    125c132
    <     loopdest = Utils.ParseEmail(loopaddr)[0]

    >     loopdest = Utils.ParseEmail(loopaddr)[0] + ‚—‚ + str(ZUFALL)
    150c157,159
    <         print >> fp, fqdnaddr, ((fieldsz – len(k)) * ‚ ‚), k

    >         #print >> fp, fqdnaddr, ((fieldsz – len(k)) * ‚ ‚), k
    >         #Eindeutigkeit mittels Zufallszahl
    >         print >> fp, fqdnaddr, ((fieldsz – len(k)) * ‚ ‚), k + ‚—‚ + str(ZUFALL)

Zur Erläuterung:

Am Anfang wird ein „Zufallszahlengenerator“ importiert, mittels dessen der Variable „ZUFALL“ ein eben zufällig erzeugter Wert zugewiesen wird.

Die Originalzeile, um die Einträge in der aliases zu erzeugen, wurde auskommentiert, aktiv ist die Variante mit der Zufallszahl als Zusatz.

Analog sind die Einträge anschließend zur Erzeugung der Datei virtual-mailman.

Was mir dann noch aufgefallen ist:

Wenn man eine Liste mit der Hauptdomain von mailman anlegt, kommen die Mails in meiner geänderten Konfiguration ursprünglich gar nicht an! In der virtual-mailman wurden die Listen nicht angelegt, weil die Hauptdomain der Logik nach ja nicht virtuell gemapt werden muss.
Es gibt in der Mailman-Config (mm_cfg.py) eine Variable POSTFIX_STYLE_VIRTUAL_DOMAINS. In diese darf man in der Originalkonfiguration die Hauptdomain nicht eintragen, weil es dann zu loops kommt. In meiner Konfiguration muss die Hauptdomain mit aufgenommen werden. Nur dann werden die Listen mit der Originaldomain auch in die virtual-mailman übernommen und nur so ist ein korrektes mapping auf die durch den Zusatz veränderten Benutzernamen in der aliases gewährleistet.

Das Ganze hat mich einiges an Nerven und Grübeln gekostet, aber jetzt funktioniert Mailman so wie ich es will!