Aus historischen Gründen ist Ionos der MX für meine Mails und ebenfalls aus historischen Gründen liefere ich im Heimnetz meine Mail bei einem lokalen Exim ab. Direktes Versenden der Mail ist schon seit Jahren komplett unrealistisch, so dass mein Exim schon sehr lange authentifiziert eingeliefert hat. Nun hat sich ionos vor einer Weile entschlossen, DKIM zu machen. Dabei wollen sie, dass der authentifizierte Benutzer zur gleichen Domain wie der Mailabsender gehört – bei DKIM eine gute Idee. Da ich aber bisher verschiedene Domains mit dem gleichen User ageliefert hatte, musste ich handeln.

Die Lösung war – nach längeren Nachdenken – relativ einfach:

Ein Exim-Router, der so aussieht:

generic_sbr:
   driver = manualroute
   domains = !+local_domains
   transport =  remote_auth_smtp
   route_data = ${lookup{$sender_address_domain}lsearch{/etc/exim4/sbr_data}}

Dabei haben die sbr_data die Form

domain1: server1
domain2: server2
domain3: server1
…

Wenn eine Domain nicht in sbr_data steht wird der nächste Router probiert.

Der Transport ist

remote_auth_smtp:
  driver = smtp
  port = 587
  hosts_require_auth = *
  hosts_require_tls  = *

und der Clou steckt im Authenticator:

plain:
  driver = plaintext
  public_name = PLAIN
  client_send = ${lookup{$sender_address_domain}lsearch{/etc/exim4/clientauth.secrets}}
  client_set_id = ${listextract{2}{<^ ${lookup{$sender_address_domain}lsearch{/etc/exim4/clientauth.secrets}}}}

wobei die Datei clientauth.secrets die Form

domain1: ^user@domain1^PASSWD
domain2: ^user@domain2^PASSWD
…

hat. Was wirklich Arbeit gekostet hat ist die etwas wirre String expansion für client_set_id – aber damit wird das Log besser. Es ist schon faszinierend – man findet für wirklich abseitige Setups Lösungen im Exim.