Postfix Transport für Mailboxen über Postfixadmin

Abstract

Das weit verbreitete Adminstrationswerkzeug Postfixadmin hat kein Feld, um einen Postfix-Transport für einzelne Mailadressen zu konfigurieren.

Das weit verbreitete Adminstrationswerkzeug Postfixadmin hat kein Feld, um einen Postfix-Transport für einzelne Mailadressen zu konfigurieren.

Konkret geht es um ein noch häufig vorzufindendes Setup, bei dem interne Mailserver (Exchange etc.) einzelne Mailboxen per POP3 regelmäßig abfragen, um diese in einem internen Office-Netzwerk zu bearbeiten, andere Mailboxen jedoch von externen Nutzern nur über IMAP genutzt werden.

Die POP3-Abfragemethode ist nicht sehr elegant, besser ist es, Mail an die jeweiligen internen User auf den internen Mailserver per Postfix-Transport zu routen. Das geht natürlich nur, wenn eine statische Zieladress-IP zur Verfügung steht.

Vorteil
Keine Belastung des Dovecot-Servers, keine Verzögerungen mehr bei der Mail-Zustellung.
Nachteil
Je nach Einstellung bouncen Mails, wenn die externen Mailserver länger nicht erreicht werden können.
Achtung
Die existierenden Mailadressen/Mailboxen müssen in jedem Fall im Postfixadmin gepflegt werden, und selbstverständlich müssen geroutete Mailboxen auf den gerouteten Mailservern existieren. Außerdem sollten auf den gerouteten Mailservern ankommende geroutete Mails in keiner Weise verzögert werden, z.B. mit Verfahren wie Greylisting etc.

Die derzeitige Version von Postfixadmin hat leider kein Feld, um ein Nutzer/Mailbox-basierendes Mail Transport Routing vom Domainadmin selbst pflegen zu lassen. Diese Feature ist aber für die nächsten Versionen von Postfixadmin angekündigt.

Um nun einen SMTP-Transport für Mailboxen zu realisieren, muss man die MySQL-Abfragen für das Postfixadmin-Alias-Feld verändern (eine Mailbox, die ohnehin per SMTP "geroutet" wird, braucht keinen Alias mehr).

mysql_virtual_alias_maps.cf

...
query = SELECT goto FROM alias WHERE goto NOT REGEXP
'somenot.exist.servernamein.dns' AND address='%s' AND active = 1;

mysql_virtual_transport_maps.cf

...
query = SELECT CONCAT('smtp:[', SUBSTRING_INDEX (goto,'@', 1),']') FROM
alias WHERE goto REGEXP 'somenot.exist.servernamein.dns' AND
address='%s' AND active = 1;

main.cf

...
transport_maps = hash:/etc/postfix/transport,
mysql:/etc/postfix/mysql_virtual_transport_maps.cf
...
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
...

nun kann man

ip.ad.dr.ess@... im Alias-Feld der Mailbox angeben.

Das produziert folgenden Transport:

email@... smtp:[ip.ad.dr.ess]

Außerdem werden damit allen anderen "gotos" außer Kraft gesetzt.

somenot.exist.servernamein.dns ist frei wählbar, muss aber den Postfixadmin Syntax Check überstehen und sollte nicht im DNS zu finden sein, damit keine Konflikte entstehen können.

Diese Lösung sollte nicht benutzt werden, wenn z.B.

relay_domains = mysql:/etc/postfix/mysql_relay_domains_maps.cf

im Postfix Setup verwendet wird

Important

Es könnten allerhand Konflikte mit dem bestehenden Postfix Setup erzeugt werden, also ausführlich vor Inbetriebnahme testen. Außerdem sind Transport Tables in MySQL wirklich kritisch – der MySQL-Server muss dann wirklich immer erreichbar sein! Hier handelt es sich um einen Workaround, eine wirklich schöne Lösung ist es nicht!

Robert Schetterer, 11. February 2013