Exim4 mit mehreren Email-Accounts konfigurieren
Baustelle: Dieser Artikel ist eine Baustelle. Das heißt, jemand hat sich dieses Artikels angenommen und überarbeitet ihn gerade. |
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: 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: 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.