Postfix mit Virtual Users aus einer Datenbank

Wozu braucht man einen Domaintable?

Bei der Installation des Mailservers 2009 hatten wir eine wichtige Voraussetzung bei der Erarbeitung der den Aufgaben angepassten Konfiguration: es soll simpel sein!

Bei der alten Konfiguration und bei allen im Internet kommunizierten Lösungen zur Datenbankgestützten Konfiguration von Postfix ist mir eine Sache immer sauer aufgestossen: das völlig sinnlose Anlegen von Domaintables.

Domaintables beinhalten lediglich eine Information: welche Domains haben eine komplette Umleitung zu einem anderen Mailserver. Bei uns ist das einfach zu klären: KEINE!
Vollständige Mailumleitung ist ein Anachronismus aus den Zeiten, als es noch weniger SPAM gab als reguläre Mails. Genauso wie Catch-All-Domains. Beides grosser Mist.

Wenn ich also KEINE Domain habe, zu der ich keine Mailadresse habe, dann brauche ich keinen Domaintable, denn in jeder Mailadresse steht ja die Domain hinter dem @-Zeichen.

Da aber Postfix eine Prüfung auf Gültigkeit einer Domain vornimmt, muss es in der Lage sein, einen query an die DB zu liefern, der die Domains auflistet.

Wir machen das mit einem View unter Postgre SQL.

Code des psql view:

SELECT foo.domain, sum(foo.count) AS count
FROM ( SELECT substr(mail_users.mail, strpos(mail_users.mail, '@'::text) + 1) AS domain, count(*) AS count
FROM mail_users
WHERE length(mail_users.mail) > 0
GROUP BY substr(mail_users.mail, strpos(mail_users.mail, '@'::text) + 1)) foo
GROUP BY foo.domain;

 

Kleine Erläuterung:

  • mail_users
    • Tabelle der mailadressen
  • mail
    • Spalte (Feld) mit den Adressen
  • Where-klausel
    • braucht der View – und verhindert Leerzeilen
  • foo
    • das Ding braucht einen klaren unmissverständlichen Namen

Info: Der View-Code ist gekürzt, die abgefragte Quelle auch ein View – das kommt um das Handling zu vereinfachen für Multiple Accounts und um deaktivieren zu können.

Entscheidend ist, das eine Domain in dem Moment im „Domaintable“ auftaucht, wo eine Mailadresse eingerichtet wird – und verschwindet wenn es keine gibt. Das kleine Beispiel liefert den „Domaintable“ mit 2 Spalten: „domain“ und „count“, in der spalte „count“ steht dann noch, wieviele Mailadressen zu einer Domain vorhanden sind.

Das selbe mit MySQL zu versuchen ist zum Scheitern verurteilt: Verschachtelte Views die letztendlich auf sich ändernde Datenbestände zugreifen sind innerhalb kürzester Zeit völlig im Eimer und verlangen menschlichen Eingriff – ein absolutes No-Go.
MSSQL kann zwar Sichten, aber bei identischer Hardware zur o.g. Konfiguration ist es so, das man Morgens 10 Adressen konfiguriert, und das Ding Mittags immer noch Ressourcen frisst.

Wer auch immer das hier liesst, versteht, und froh ist es ergoogled zu haben, wird wissen was er zu tun hat – Viel Erfolg!