Postfix & Relaying per Adresse

Und noch ein ein Postfix Eintrag. Diesmal zum Thema Relaying und Postfix.

Folgende Problematik:

Wir haben eine Kunden der auf eine Domain mehrere hundert (POP3-)Postfächer/Adressen hat und diese nun über einen externen M$ Exchange Cluster (nicht wir) abwickeln möchte. Den Empfang (insbesondern mit Spamfilter) und Versand (Smarthost) sollen weiterhin wir machen. Der Clou an der Sache ist nun, dass es nicht sofort umgezogen werden soll, sondern nach und nach einzelne Postfächer. Bisher habe ich eigentlich nur zwei Arten von Relaying unter Postfix genutzt:

  1. für ganze Domains per “relay_domains“, “transport_maps” und ggf. “relay_recipient_maps
  2. überhaupt alle ausgehenden Mails per “relayhost

Nun kenne ich auch noch eine dritte Variante: Transport für einzelne Mailboxen.
Prinzipiell ist es ganz einfach, man muss nur bei einem Postfach als Ziel keinen lokalen Pfadnamen sondern (im typischen Postfix Syntax) ein: smtp:target:port.

Und da wir das ganze im laufenden Betrieb umstellen wollen hätte ich gerne eine schnelle Rückstellmöglichkeit. Daher belasse ich die (virtual_)mailbox_maps wie sie sind und setze einfach für jede zu relayende Adresse zusätzlich noch einen Eintrag in eine transport_maps Datenbank.
Was dabei noch ein ganz praktischer Seiteneffekt ist (wenn man es weiss, sonst kann’s zu Kopfschmerzen führen): (virtual_)alias_maps lassen sich nicht so einfach beirren und bleiben weiterhin aktiv. Es wird ggf. nur zusätzlich relayt.

Beispiel:

main.cf:

virtual_mailbox_domains = hash:/tmp/virtual_domains
virtual_mailbox_maps = hash:/tmp/mailbox_maps
virtual_alias_maps = hash:/tmp/alias_maps
transport_maps = hash:/tmp/transport_maps

/tmp/virtual_domains:

mydomain.tld     OK

/tmp/mailbox_maps:

mail1@mydomain.tld     storage1/mail1@mydomain.tld
mail2@mydomain.tld     storage2/mail2@mydomain.tld

/tmp/alias_maps:

mail3@mydomain.tld     outside1@otherdomain.tld
mail4@mydomain.tld     outside2@otherdomain.tld



/tmp/transport_maps

mail1@mydomain.tld     smtp:[relaytarget.tld]:25
mail3@mydomain.tld     smtp:[relaytarget.tld]:25

Nun würde also

  • jede eingehende Mail an mail1@.. immer an relaytarget.tld (den A-Record, nicht den MX, weil der sind ja wir) weitergeleitet werden
  • jede an mail2@.. weiterhin lokal in die Mailbox gehen
  • alles an mail3@.. sowohl relayt als auch weitergeleitet
  • jede an mail4@.. nur weitergeleitet

werden.

Auf eins bin ich bisher allerdings noch nicht gekommen (das war mein erster Lösungsansatz): wie kann ich gleichzeitig in ein lokales Postfach ausliefern und an einen (oder mehrere?) ander Mailserver relayen ? So könnte man z.B. auch ein einfaches Backup realisieren.

UPDATE:

Es geht tatsächlich! Man kann ohne weiteres an mehrer Ziele gleichzeitig relayen (und/oder an mehrere lokale Postfächer ausliefern, das nimmt sich nichts). Ich bin ganz zufällig, eigentlich versehentlich darauf gekommen ..
Anstatt (wie oben zusätzliche) transport_maps zu verwenden muss man einfach zusätzliche (virtual_)mailbox_maps definieren!
Bei obigem Beispiel würde dass bedeuten:

virtual_mailbox_domains = hash:/tmp/virtual_domains
virtual_mailbox_maps = hash:/tmp/mailbox_maps
virtual_alias_maps = hash:/tmp/alias_maps, hash:/tmp/transport_maps

und fertig ist es ! Innerhalb einer einzelnen Hash-Datei sollte es ja keine zwei Einträge mit dem selben Schlüssel (sprich: zweimal die gleiche Mailadresse) geben, aber zwei Lookup-Tabellen mit jeweils einmal der Mailadresse und einem Ziel ist ohne weiteres drin.

Leave a Reply