Exim4 mit mehreren Email-Accounts konfigurieren

Aus DebianforumWiki

Wechseln zu: Navigation, Suche
Baustelle.png Baustelle: Dieser Artikel ist eine Baustelle. Das heißt, jemand hat sich dieses Artikels angenommen und überarbeitet ihn gerade.

WikiWeb und Mailserver ‹ Exim4 mit mehreren Email-Accounts konfigurieren

Getestet.png Getestet: Dieser Hinweis soll dir dabei helfen, zu entscheiden, ob dieser Artikel auf deinem System funktionieren wird oder nicht. Solltest du feststellen, dass dieser Artikel bei einer ungetestet Version funktioniert, kannst du das gerne hier korrigieren oder im Forum anmerken.


Inhaltsverzeichnis

exim4 mit mehreren Email-Accounts betreiben

exim4 ist in der Standardkonfiguration dafür vorgesehen, dass man einen Smarthost mit einem Benutzeraccount zum Versenden von Emails verwenden kann. Da exim4 aber ein sehr mächtiges Tool ist, kann man mit etwas Aufwand die Funktion stark erweitern.

Mehrere Mailaccounts bei verschiedenen Providern

Ich habe im Laufe der Jahre verschiedene Email-Accounts bei unterschiedlichsten Betreibern angesammelt. Auf alle diese Accounts kommen Mails, und über fast alle versende ich Emails. Zu Testzwecken habe ich vor einiger Zeit einen eigenen Mailserver mit exim4 und cyrus, später dovecot statt cyrus aufgesetzt. Das Abholen der Emails von den unterschiedlichen Accounts mittels fetchmail ist kein Problem. Aber Versenden...

Mein Mailserver läuft auf localhost. In der Standardconfig von exim4 kann ich einen Mailserver als Smarthost angeben. Für viele wird das smtp.google.com sein. Aber was ist mit gmx, was ist mit dem Account aus der Arbeit?


Ich habe hier den Code und auch ein Debian-Paket bereitgestellt, wie die Konfiguration von exim4 erweitert werden kann, dass man damit über z.B. Thunderbird/Icedove mit unterschiedlichen Absenderidentitäten den entsprechenden Smarthost des Email-Providers verwenden kann.

exim4 wird mit

root@debian:~# apt install exim4

installiert.

Exim ist so aufgebaut, dass es Router, Transports, Rewrite-Rules usw. besitzt. Ein Router entscheidet, wohin ein Mail geroutet werden soll. Darin wird ein Transport angegeben. Dieser Transport übernimmt dann die eigentliche Transportaufgabe des Emails (z.B. um es in den lokalen Dovecot zu schicken, oder zu einem Smarthost, der das Email dann an den endgültigen Empfänger weiterleitet) Exim kann verschiedene Rollen einnehmen. Einerseits - wen ein Email zu mir kommt, ist es ein SMTP-Server für den Sender. So wie wenn ich mit Thunderbird ein Email an eine Google-Adresse schicke ist Exim in diesem Falle der Google-Server. Wenn ich aber ein Email über exim versende, dann ist exim zuerst in der Rolle wiederum des SMTP-Servers, der das Email vom Client entgegennimmt, und wechselt dann beim weiteren Versand in die Rolle eines Clients, der wiederum ein Email an einen weiteren SMTP-Server versendet. Exim kann also Server und Client sein.

Die Standardkonfiguration erlaubt schon viel, aber für über verschiedene Smarthosts je nach Absender (To:-Feld) im Email benötigt man neue Router und Transports.

Wechsel ins Konfigurationsverzeichnis von exim4 /etc/exim4

Hinweis.png Hinweis: alle Pfadangaben beziehen sich relativ zu diesem Konfigurationsverzeichnis!

root@debian:~# cd /etc/exim4

Wir erstellen einen neuen Router. Da die Konfigurationsdateien in alphanumerischer Sortierung aufsteigend abgearbeitet werden und bei Zutreffen der Regeln die Abarbeitung weiterer Router abgebrochen wird, muss der Router VOR dem normalen smarthost-Router zu liegen kommen. Daher die 199, da diese kleiner als die 200 in der Standardkonfig ist.

Der Router ist wie der in conf.d/router/200_exim4-config_primary aber um eine geänderte "route_list" angepasst. Hier wählt exim4 anhand der $sender_address aus der Config-Datei /etc/exim4/sender.multismarthost_multiaccount.passwd den smarthost für die Absenderadresse.


Router

root@debian:~# editor conf.d/router/199_exim4-config_primary_multiaccount

In diese Datei fügst du folgenden Text ein:

  1.   .ifdef DCconfig_smarthost DCconfig_satellite
  2.   smarthost_multiaccount:
  3.     debug_print = "R: smarthost multiaccount for $local_part@$domain and $sender_address"
  4.     driver = manualroute
  5.     domains = !+local_domains
  6.     transport = remote_smtp_smarthost_multiaccount
  7.     route_list = * ${extract{1}{:}{${lookup{$sender_address}wildlsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}}
  8.     host_find_failed = defer
  9.     same_domain_copy_routing = yes
  10.     self = send
  11.     no_more
  12.   .endif

Die Zeile mit "transport = " gibt einen Transport an, der verwendet wird, wenn die Filerregeln (domains =!+local_domains ist, wenn die Domain des senders keine lokale domain ist, also z.B. localhost) zutreffen. Der Nae dieses Transports ist remote_smtp_smarthost_multiaccount. Da dieser Transport noch nicht existiert, legen wir ihn an. Das geschieht im Folgenden. Der oben genannte Name des Transports wird in der ersten Zeile mit dem Doppelpunkt festgelegt. Dann findet ihn auch der vorangegangene Router.

Transport

root@debian:~# editor conf.d/transport/30_exim4-config_remote_smtp_smarthost_multiaccount

Der Inhalt:

  1. ## Erweiterter Transport für Zustellung zu smarthosts, wenn auf dem selben Smarthost mehrere Mailaccounts und Aliases bestehen
  2. # Erweiterung von Jakobus Schürz
  3. remote_smtp_smarthost_multiaccount:
  4.   debug_print = "T: remote_smtp_list for $local_part@$domain an $sender_address"
  5.   driver = smtp
  6.   hosts_require_auth = ${extract{1}{:}{${lookup{$sender_address}lsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}}
  7. .ifdef REMOTE_SMTP_HOSTS_AVOID_TLS
  8.   hosts_avoid_tls = REMOTE_SMTP_HOSTS_AVOID_TLS
  9. .endif
  10. .ifdef REMOTE_SMTP_HEADERS_REWRITE
  11.   headers_rewrite = REMOTE_SMTP_HEADERS_REWRITE
  12. .endif
  13. .ifdef REMOTE_SMTP_RETURN_PATH
  14.   return_path = REMOTE_SMTP_RETURN_PATH
  15. .endif
  16. .ifdef REMOTE_SMTP_HELO_DATA
  17.   helo_data=REMOTE_SMTP_HELO_DATA
  18. .endif
  19. .ifdef DKIM_DOMAIN
  20. dkim_domain = DKIM_DOMAIN
  21. .endif
  22. .ifdef DKIM_SELECTOR
  23. dkim_selector = DKIM_SELECTOR
  24. .endif
  25. .ifdef DKIM_PRIVATE_KEY
  26. dkim_private_key = DKIM_PRIVATE_KEY
  27. .endif
  28. .ifdef DKIM_CANON
  29. dkim_canon = DKIM_CANON
  30. .endif
  31. .ifdef DKIM_STRICT
  32. dkim_strict = DKIM_STRICT
  33. .endif
  34. .ifdef DKIM_SIGN_HEADERS
  35. dkim_sign_headers = DKIM_SIGN_HEADERS
  36. .endif

Im folgenden werden aus der Datei mit den Authentifikations-Credentials passend zur Absenderadresse Username und Passwort für den jeweiligen Account am Smarthost ausgelesen. Und da verschiedene Authentifikations-Möglichkeiten angeboten werden können, gibts auch mehrere davon. Plain, Login, cram_md5...

Authentifikation

root@debian:~# editor conf.d/auth/20_exim4-config_authenticates_multiaccount

Der Inhalt:

  1. plain:
  2.   driver = plaintext
  3.   public_name = PLAIN
  4.   client_send = "^${extract{2}{::}{${lookup{$sender_address}lsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}}\
  5.                 ^${extract{3}{::}{${lookup{$sender_address}lsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}}"
  6. #  server_condition = \
  7. #                ${if eq {${readsocket{/var/run/courier/authdaemon/socket}\
  8. #                {AUTH ${strlen:exim\nlogin\n$2\n$3\n}\nexim\nlogin\n$2\n$3\n}}}{FAIL\n}{no}{yes}}
  9.   server_set_id = $2
  10.   server_advertise_condition = ${if eq{$tls_cipher}{}{}{*}}
  11.  
  12. login:
  13.   driver = plaintext
  14.   public_name = LOGIN
  15.   client_send = ": ${extract{2}{::}{${lookup{$sender_address}lsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}} \
  16.                 : ${extract{3}{::}{${lookup{$sender_address}lsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}}"
  17.   server_prompts = Username:: : Password::
  18. #  server_condition = ${if eq {${readsocket{/var/run/courier/authdaemon/socket} \
  19. #                {AUTH ${strlen:exim\nlogin\n$1\n$2\n}\nexim\nlogin\n$1\n$2\n}}}{FAIL\n}{no}{yes}}
  20.   server_set_id = $1
  21.   server_advertise_condition = ${if eq{$tls_cipher}{}{}{*}}
  22.  
  23. cram_md5:
  24.   driver = cram_md5
  25.   public_name = CRAM-MD5
  26.   client_name = ${extract{2}{:}{${lookup{$sender_address}lsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}}
  27.   client_secret = ${extract{3}{:}{${lookup{$sender_address}lsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}}

Änderungen der Standardkonfiguration

Die letzte Datei der Authentifikation steht aber im Konflikt zur Standardkonfiguration, daher müssen dort die drei Authentifizierungsmethoden plain, login und cram_md5 auskommentiert werden, da diese durch die letzte Datei ersetzt werden, da sie gerade davor neu definiert worden sind und nicht doppelt vorkommen dürfen.

root@debian:~# editor conf.d/auth/30_exim4-config_examples

Der Inhalt wird so modifiziert, dass er folgendermaßen aussieht:

  1. # plain_server:
  2. #   driver = plaintext
  3. #   public_name = PLAIN
  4. #   server_condition = "${if crypteq{$auth3}{${extract{1}{:}{${lookup{$auth2}lsearch{CONFDIR/passwd}{$value}{*:*}}}}}{1}{0}}"
  5. #   server_set_id = $auth2
  6. #   server_prompts = :
  7. #   .ifndef AUTH_SERVER_ALLOW_NOTLS_PASSWORDS
  8. #   server_advertise_condition = ${if eq{$tls_in_cipher}{}{}{*}}
  9. #   .endif
  10.  
  11. # LOGIN authentication has traditional prompts and responses. There is no
  12. # authorization ID in this mechanism, so unlike PLAIN the username and
  13. # password are $auth1 and $auth2. Apart from that you can use the same
  14. # server_condition setting for both authenticators.
  15.  
  16. # login_server:
  17. #   driver = plaintext
  18. #   public_name = LOGIN
  19. #   server_prompts = "Username:: : Password::"
  20. #   server_condition = "${if crypteq{$auth2}{${extract{1}{:}{${lookup{$auth1}lsearch{CONFDIR/passwd}{$value}{*:*}}}}}{1}{0}}"
  21. #   server_set_id = $auth1
  22. #   .ifndef AUTH_SERVER_ALLOW_NOTLS_PASSWORDS
  23. #   server_advertise_condition = ${if eq{$tls_in_cipher}{}{}{*}}
  24. #   .endif
  25. #
  26. # cram_md5_server:
  27. #   driver = cram_md5
  28. #   public_name = CRAM-MD5
  29. #   server_secret = ${extract{2}{:}{${lookup{$auth1}lsearch{CONFDIR/passwd}{$value}fail}}}
  30. #   server_set_id = $auth1

Logindaten in Datei hinterlegen

Schließlich müssen noch die Zugangsdaten, SMTP-Server zur Email-Adresse hinterlegt werden.

Dazu legst du die Datei sender.multismarthost_multiaccount.passwd an und befüllst sie mit folgender Syntax: Pro Zeile ist eine Mailadresse mit SMTP-Server und Zugangsdaten angegeben:

root@debian:~# editor sender.multismarthost_multiaccount.passwd
  1. user1@example.org:smtp.example.net:loginname-user1:verysecretpassword
  2. user2@example.org:smtp.example.net:loginname-user2:otherpassword
  3. user@invalid.invalid:mail.invalid.invalid:loginname:passwd
  4. ...

Festlegen einer Standard-Email-Adresse, damit auch mit "mail" oder "mailx" von der Commandline aus Emails versendet werden können. Clients wie Thunderbird senden einen Absender des Emails mit. Aber mail auf der Commandline kann das so nicht. Da ist der Absender nur dein Login-Name, mit dem du dich in Linux anmeldest.

root@debian:~# editor /etc/email-addresses
  1. unixuser: user2@example.org
  2. unixuser2: user@invalid.invalid

Anpassungen im Emailclient

Wenn du Thunderbird/Icedove einsetzt, dann definierst du einen einzigen SMTP-Server. Und zwar localhost, wenn du den Mailserver am lokalen Rechner laufen hast. Ansonsten trägst du den Servernamen ein, den du verwendest. Ebenso definierst du auch nur einen IMAP-Account, entsprechend dem Server, den du konfigurierst. Hier ist es ebenfalls localhost.

Für deine Mail-Account am IMAP-Server definierst du dann mehrere Identitäten. Jede dieser Identitäten muss mit der Email-Adresse und dem smtp-Server und den Zugangsdaten in der oben angelegten Passwortdatei /etc/exim4/sender.multismarthost_multiaccount.passwd aufgeführt werden. Und in jeder dieser Identitäten gibst du nur den einen konfigurierten SMTP-Server an. Insoferne der SMTP-Server auch das Versenden über eine Alias-Adresse erlaubt, kannst du hier auch alle alias-Adressen angeben. Sowohl bei den Identitäten in Thunderbird/Icedove, als auch in der Passwortdatei von exim4. Du musst noch testen, ob bei Alias-Adressen der Loginname (3. Spalte in der Passwortdatei) gleich dem Loginnamen für die Hauptadresse sein muss, oder ob du auch die Aliasadresse eintragen kannst.

Erzeugen der neuen Konfiguration und Neustart des Servers

Exims Config besteht aus Templates und Daten in /etc/exim4/ während die zur Laufzeit genutzte Config in /var/lib/exim4/ liegt. Daher gibt es ein update-exim4.conf Script, dass die Änderungen dort einspielt. Ein einfacher Restart hat die Änderungen der Konfig nicht übernommen.
root@debian:~# systemctl reload exim4.service
hab ich allerdings nicht getestet.
root@debian:~# systemctl stop exim4.service
root@debian:~# update-exim4.conf
root@debian:~# systemctl start exim4.servicd

Wie du deinen IMAP/POP-Server konfigurierst, findest du an anderer Stelle. Auch wie exim4 sonst noch so zu konfigurieren ist, ist nicht Thema dieses Artikels. Hier geht es rein um die Erweiterung für mehrere Accounts bei mehreren Providern und exim4 in der Rolle eines SMTP-Clients zum Versenden von Emails über einen Smarthost.

Installation mittels Debian-Paket

Die in diesem Artikel genannten Konfigurationsfiles sind auch in der jeweils aktuellen Version über ein Debian-Paket installierbar.

user@debian:~$ wget https://github.com/xundeenergie/exim4-multiaccount/exim4-multiaccount.deb
root@debian:~# dpkg -i exim4-multiaccount.deb
oder
user@debian:~$ sudo dpkg -i exim4-multiaccoung

Änderung der Standardkonfiguration von exim4

Hinweis.png Hinweis: Die Änderung von conf.d/auth/30_exim4-config_examples musst du auch bei der Installation des Debian-Paketes vornehmen!


Viel Erfolg bei der Erweiterung deines Exim-Mailservers.

Meine Werkzeuge