X-original-to fehlt im header jeder Mail

Huhu,

Postfix ist das Programm, das den Header einfügen muss. X-Original-To soll ja den Envelope-Empfänger enthalten, also die Ziel-Adresse, die im SMTP-Dialog im RCPT TO:… geschickt wird. Damit ist auch klar, dass der Tipp mit den header_checks nicht das tut, was Sie wollen, denn der würde den Empfänger aus den Mailheadern nehmen, und nicht den Envelope-Empfänger. Im Fall der Nutzung von Bcc (und auch wenn der lokale User nicht im To sondern im Cc steht) wäre X-Original-To also falsch.

Leider kann man Postfix nicht anweisen, immer den X-Original-To-Header zu setzen, denn diese Funktionalität ist im jeweiligen Mail-Transport-Modul angesiedelt. Die Einlieferung von Postfix zu Kopano erfolgt unter UCS standardmäßig über das Protokoll LMTP, und genau der lmtp-Transport kann diese Header nicht setzen.

Welcher Transport sie setzen kann, ist der pipe-Transport, der zur Einlieferung ein externes Programm ausführt und die Mail an dieses Programm übergibt. Glücklicherweise liefert Kopano einen solchen LDA (»local delivery agent«) mit: /usr/sbin/kopano-dagent (der erledigt übrigens sowohl LMTP als auch Einlieferung via Pipe). Damit der anstelle des LMTP-Protokolls genutzt wird, sind einige Anpassungen nötig:

Es muss in Postfix ein neuer Transport definiert werden. Dazu ergänzen Sie die /etc/postfix/master.cf.local:

kopano unix  -       n       n       -       10      pipe
  flags=ODRhu user=kopano argv=/usr/sbin/kopano-dagent -R ${recipient}

Die Flags O und D sorgen dafür, dass die Header X-Original-To respektive Delivered-To eingefügt werden. Mehr dazu siehe man 8 pipe.

Als nächstes sorgen Sie dafür, dass der Transport, wenn er genutzt wird, immer nur mit einer Mail pro Aufruf gefüttert wird. Da es dafür keine Einstellung gibt, passen Sie die Datei /etc/postfix/main.cf.local an (zur Begründung siehe erneut man 8 pipe):

kopano_destination_recipient_limit = 1

Nun sorgen Sie dafür, dass der Transport auch genutzt wird und bauen anschließend die beiden Konfigurationsdateien aus den Templates und den *.local neu:

ucr set mail/postfix/virtual/transport=kopano
ucr commit /etc/postfix/{main,master}.cf

Nun sind wir soweit und können Postfix mit der angepassten Konfiguration neu starten:

systemctl restart postfix

Und das war’s. Zum Testen empfehle ich das Tool swaks, das installiert werden kann, wenn das unsupported-Repository aktiviert ist. Dann kann man nämlich super schnell die Einlieferung testen:

swaks --from mbunkus@mbu-test.intranet --to mbunkus@mbu-test.intranet --server 127.0.0.1

Man sollte natürlich nicht verschweigen, dass die Verwendung von pipe anstelle von lmtp einen kleinen Performancenachteil hat — es wird ja für jede Mail ein neuer Prozess gestartet. Das sollte aber ausschließlich bei wirklich großen Mailservern mit sehr hoher Anzahl von Konten zum Problem werden.

Gruß
mosu