Exim4 mit mehreren Email-Accounts konfigurieren

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


Wiki ‹ Web 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.




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:

  .ifdef DCconfig_smarthost DCconfig_satellite
  smarthost_multiaccount:
    debug_print = "R: smarthost multiaccount for $local_part@$domain and $sender_address"
    driver = manualroute
    domains = !+local_domains
    transport = remote_smtp_smarthost_multiaccount
    route_list = * ${extract{1}{:}{${lookup{$sender_address}wildlsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}}
    host_find_failed = defer
    same_domain_copy_routing = yes
    self = send
    no_more
  .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:

## Erweiterter Transport für Zustellung zu smarthosts, wenn auf dem selben Smarthost mehrere Mailaccounts und Aliases bestehen
# Erweiterung von Jakobus Schürz
remote_smtp_smarthost_multiaccount:
  debug_print = "T: remote_smtp_list for $local_part@$domain an $sender_address"
  driver = smtp
  hosts_require_auth = ${extract{1}{:}{${lookup{$sender_address}wildlsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}}
.ifdef REMOTE_SMTP_HOSTS_AVOID_TLS
  hosts_avoid_tls = REMOTE_SMTP_HOSTS_AVOID_TLS
.endif
.ifdef REMOTE_SMTP_HEADERS_REWRITE
  headers_rewrite = REMOTE_SMTP_HEADERS_REWRITE
.endif
.ifdef REMOTE_SMTP_RETURN_PATH
  return_path = REMOTE_SMTP_RETURN_PATH
.endif
.ifdef REMOTE_SMTP_HELO_DATA
  helo_data=REMOTE_SMTP_HELO_DATA
.endif
.ifdef DKIM_DOMAIN
dkim_domain = DKIM_DOMAIN
.endif
.ifdef DKIM_SELECTOR
dkim_selector = DKIM_SELECTOR
.endif
.ifdef DKIM_PRIVATE_KEY
dkim_private_key = DKIM_PRIVATE_KEY
.endif
.ifdef DKIM_CANON
dkim_canon = DKIM_CANON
.endif
.ifdef DKIM_STRICT
dkim_strict = DKIM_STRICT
.endif
.ifdef DKIM_SIGN_HEADERS
dkim_sign_headers = DKIM_SIGN_HEADERS
.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:

plain:
  driver = plaintext
  public_name = PLAIN
  client_send = "^${extract{2}{::}{${lookup{$sender_address}wildlsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}}\
                 ^${extract{3}{::}{${lookup{$sender_address}wildlsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}}"
#  server_condition = \
#                ${if eq {${readsocket{/var/run/courier/authdaemon/socket}\
#                {AUTH ${strlen:exim\nlogin\n$2\n$3\n}\nexim\nlogin\n$2\n$3\n}}}{FAIL\n}{no}{yes}}
  server_set_id = $2
  server_advertise_condition = ${if eq{$tls_cipher}{}{}{*}}

login:
  driver = plaintext
  public_name = LOGIN
  client_send = ": ${extract{2}{::}{${lookup{$sender_address}wildlsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}} \
                 : ${extract{3}{::}{${lookup{$sender_address}wildlsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}}"
  server_prompts = Username:: : Password::
#  server_condition = ${if eq {${readsocket{/var/run/courier/authdaemon/socket} \
#                {AUTH ${strlen:exim\nlogin\n$1\n$2\n}\nexim\nlogin\n$1\n$2\n}}}{FAIL\n}{no}{yes}}
  server_set_id = $1
  server_advertise_condition = ${if eq{$tls_cipher}{}{}{*}}

cram_md5:
  driver = cram_md5
  public_name = CRAM-MD5
  client_name = ${extract{2}{:}{${lookup{$sender_address}wildlsearch{CONFDIR/sender.multismarthost_multiaccount.passwd}{$value}fail}}}
  client_secret = ${extract{3}{:}{${lookup{$sender_address}wildlsearch{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:

# plain_server:
#   driver = plaintext
#   public_name = PLAIN
#   server_condition = "${if crypteq{$auth3}{${extract{1}{:}{${lookup{$auth2}lsearch{CONFDIR/passwd}{$value}{*:*}}}}}{1}{0}}"
#   server_set_id = $auth2
#   server_prompts = :
#   .ifndef AUTH_SERVER_ALLOW_NOTLS_PASSWORDS
#   server_advertise_condition = ${if eq{$tls_in_cipher}{}{}{*}}
#   .endif

# LOGIN authentication has traditional prompts and responses. There is no
# authorization ID in this mechanism, so unlike PLAIN the username and
# password are $auth1 and $auth2. Apart from that you can use the same
# server_condition setting for both authenticators.

# login_server:
#   driver = plaintext
#   public_name = LOGIN
#   server_prompts = "Username:: : Password::"
#   server_condition = "${if crypteq{$auth2}{${extract{1}{:}{${lookup{$auth1}lsearch{CONFDIR/passwd}{$value}{*:*}}}}}{1}{0}}"
#   server_set_id = $auth1
#   .ifndef AUTH_SERVER_ALLOW_NOTLS_PASSWORDS
#   server_advertise_condition = ${if eq{$tls_in_cipher}{}{}{*}}
#   .endif
#
# cram_md5_server:
#   driver = cram_md5
#   public_name = CRAM-MD5
#   server_secret = ${extract{2}{:}{${lookup{$auth1}lsearch{CONFDIR/passwd}{$value}fail}}}
#   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
user1@example.org:smtp.example.net:loginname-user1:verysecretpassword
user2@example.org:smtp.example.net:loginname-user2:otherpassword
user@invalid.invalid:mail.invalid.invalid:loginname:passwd
...

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
unixuser: user2@example.org
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.