Im Docker-Hub gibt es ein ausgezeichnetes Repository eines Mailservers. Es ist ein komplett ausgestatteter Mailserver mit Smtp, Imap, Antispam, Antivirus und so weiter. Dazu benötigt er kein MySQL oder Apache. Hier ist der Link zum Docker-Hub:

https://hub.docker.com/r/tvial/docker-mailserver/

Voraussetzung ist ein zunächst eine eigene Domain und ein Server, auf dem als erstes Docker installiert wird. Ich habe mir dazu einen frisch installierten Ubuntu-16.04-Server besorgt, um zu verhindern, dass mir eventuell alte Mailserver-Konfigurationen ins System funken.

Hinweis: Diese Anleitung funktioniert nicht mit einem vServer von Strato. Strato schrieb mir dazu: „Um Docker nutzen zu können, müssen Veränderungen am Kernel vorgenommen werden. Diese Möglichkeit besteht jedoch nicht aufgrund der verwendeten Virtualisierung.“ Ich habe diese Anleitung auf dem kleinsten Root-Server von netcup.de erfolgreich getestet.

Auf der Docker-Seite https://docs.docker.com/engine/installation/linux/ findet man die Links zu verschiedenen Linux-Installationsanleitungen. Die Installation teilt sich auf in die „Prerequisites“ (Voraussetzungen) und der eigentlichen Installation. Ich befolge die Installationsschritte der Prerequisites und der Installation genau. Zum Abschluss der Installation bestätigt mir ein „sudo docker run hello-world“, dass Docker nun funktioniert. Als „Optional configuration“ füge ich mich als User noch der Docker-sudo-Gruppe hinzu, so dass ich nicht immer vor den Befehl „docker“ noch ein „sudo“ schreiben muss. Falls eine Fehlermeldung wie „Cannot connect to the Docker daemon...“ sollte man die Befehle noch einmal als sudo-su ausführen. Anschließend ausloggen und wieder einloggen.

Mailserver von Git herunterladen

Die Daten für den Mailserver liegen zum einen bei Github, und ich lade mir folgendes Verzeichnis in mein Heimatverzeichnis:

git clone https://github.com/tomav/docker-mailserver.git
cd docker-mailserver

Im Verzeichnis docker-mailserver führe ich folgenden Docker-Befehl aus, der das Docker-Image herunterlädt:

docker pull tvial/docker-mailserver:latest

Docker Compose

Als nächstes installiere ich Docker Compose. Ich gehe zu https://github.com/docker/compose/releases
und lade mir dort die neueste Version 1.8.0 RC2 herunter, die dort gerade angeboten wird. Ich verwandele mich in sudo su und gebe das in Github angegebene Kommando ein:

curl -L https://github.com/docker/compose/releases/download/1.8.0-rc2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

Anschließend noch:

chmod +x /usr/local/bin/docker-compose

Mit

docker-compose -version

überprüfe ich, ob die Installation geklappt hat.

Als nächstes erzeuge ich eine yml-Datei mit dem Namen docker-compose.yml und gebe die Daten ein, wie auf der Docker-Hub-Seite des Mailservers vorgegeben. Wichtig ist nur, die Angabe bei „domainname:“ mit seiner eigenen Domain auszutauschen.

User anlegen

Weiter geht es mit dem Code auf der Docker-Hub-Seite. Ich lege einen User an, indem ich die Angaben unter e MAIL_USER und e MAIL_PASS entsprechend anpasse. Ein Blick in die Datei /config/postfix-accounts.cf zeigt mir, dass diese Datei noch leer ist. Ich gehe zurück in das Verzeichnis docker-mailserver. Nach Ausführen von

docker run --rm \
  -e MAIL_USER=ich@mydomain.de \
  -e MAIL_PASS=mypassword \
  -ti tvial/docker-mailserver:latest \
  /bin/sh -c 'echo "$MAIL_USER|$(doveadm pw -s SHA512-CRYPT -u $MAIL_USER -p $MAIL_PASS)"' >> config/postfix-accounts.cf

steht in der Datei /config/postfix-accounts.cf meine E-Mail-Adresse ich@mydomain.de mit verschlüsseltem Passwort. Das Passwort sollte anscheinend nur aus Buchstaben und Zahlen bestehen, mit Sonderzeichen wurde es bei mir fehlinterpretiert.

DKIM keys

Die DKIM keys werden wie angegeben erzeugt mit:

docker run --rm \
  -v "$(pwd)/config":/tmp/docker-mailserver \
  -ti tvial/docker-mailserver:latest generate-dkim-config

Dadurch wird die Datei config/opedkim/keys/mydomain.de/mail.txt erzeugt. Ihr Inhalt sieht in etwas so aus:

mail._domainkey IN      TXT     ( "v=DKIM1; k=rsa; "
          "p=MIGfMAb3toLV23+o7HC6DQEBAQUAA4GNADCBiQKBgQ0G/CSqGSIDiX1G26Byp7T22HB6/qM6dJSNDpPkLiK8JnSSGk/RacW/U/byUoUXYhuUoU/uaUck/icgrzfKiNVLJMSyeuilQBHRYiWd3QrS92+n4L9V2j8U2kH/Mfa+l5sHM895v82TLfbNCXGpgUh1T5YAPXTaIAUTTZSeaeL4UwIXAQAB" )  ; ----- DKIM key mail for myserver.de

Bei meinem Provider lege ich ein txt-Record an und trage unter der Rubrik "Host" ein:

mail._domainkey

Ins Feld "Destination" kommt hinein und ohne Gänsefüßchen:

v=DKIM1; k=rsa; p=MIGfMAb3toLV23+o7HC6DQEBAQUAA4GNADCBiQKBgQ0G/CSqGSIDiX1G26Byp7T22HB6/qM6dJSNDpPkLiK8JnSSGk/RacW/U/byUoUXYhuUoU/uaUck/icgrzfKiNVLJMSyeuilQBHRYiWd3QrS92+n4L9V2j8U2kH/Mfa+l5sHM895v82TLfbNCXGpgUh1T5YAPXTaIAUTTZSeaeL4UwIXAQAB

Alles weitere, was noch in der Datei steht, entfällt. Auf der Seite https://protodave.com/tools/dkim-key-checker/ überprüfe ich meinen DKIM Key, indem ich als Selector "mail" (also ohne "._domainkey) eingebe und unter Domain "mydomain.de".

Maiserver starten

Jetzt kommt der erste große Augenblick, und ich versuche, den Mailserver zu starten mit:

docker-compose up mail

Nun sollte der Mailserver all seine Dienste starten.

In Thunderbird erzeuge ich ein neues Konto, gebe meine Mailadresse ich@mydomain.de mit dem Passwort mypassword an und Thunderbird erkennt automatisch alle einzustellenden Parameter. Falls Thunderbird meckern sollte, kann man es mit folgenden Einträgen probieren, die bei mir immer funktioniert haben:

imap.mydomain.de - Port: 143 - STARTTLS - Normal password
smtp.mydomain.de - Port: 587 - STARTTLS - Normal password
Username: ich@mydomain.de

Die automatische Parametereinstellung funktioniert nur, wenn man sich auch direkt mit seiner Mailserveradresse, die hier bespielsweise mydomain.de lautet, anmeldet. Sollen Mails externer Domains auf unseren Mailserver geleitet werden, müssen die MX-Records beim Internet-Provider auf mail.mydomain.de gestellt werden.

Tmux

Hat man den Mailserver mit „docker-compose up mail“ gestartet, kann man schön beobachten, was sich auf dem Mailserver tut, aber es besteht nun nicht mehr die Möglichkeit, direkt auf den Server zuzugreifen, ohne den Mailserver mit Strg+c zu stoppen. Eine andere Möglichkeit wäre, den Mailserver mit „ docker-compose up -d mail“ zu starten. Dann besteht allerdings nicht die Möglichkeit, die Serveraktivitäten mitzuverfolgen. Um sowohl den Live-Log verfolgen zu können als auch auf den Server und den Container zuzugreifen installiere ich mir Tmux und starte die Prozesse in verschiedenen Fenstern.

Neuen User anlegen

Soll ein neuer Benutzer angelegt werden, erfolgt das mit den gleichen Befehlen wie oben bereits gezeigt, und die User-Adresse und das Passwort (nur Buchstaben und Zahlen) werden angepasst.

docker run --rm \
  -e MAIL_USER=newuser@otherdomain.de \
  -e MAIL_PASS=userpassword \
  -ti tvial/docker-mailserver:latest \
  /bin/sh -c 'echo "$MAIL_USER|$(doveadm pw -s SHA512-CRYPT -u $MAIL_USER -p $MAIL_PASS)"' >> config/postfix-accounts.cf

In der Datei ~/docker-mailserver/config/postfix-accounts.cf sollte sich nun der neue Benutzer inklusive verschlüsseltem Passwort befinden. Damit der neue Benutzer auch noch im Docker-Container unter etc/dovecot/userdb eingetragen wird, muss der Mailserver mit Strg+c heruntergefahren werden und kann anschließend mit

docker-compose up mail

sofort wieder gestartet werden.
Befinde ich mich in dem Verzeichnis /docker-mailserver, kann ich mich mit

docker exec -it mail bash

in den Docker-Container einwählen und lasse mir die Datei anzeigen mit

vi etc/dovecot/userdb

Auch dort ist nun der neue Benutzer verzeichnet.

E-Mail-Weiterleitung

Weiterleitungen werden über die Virtual Alias Map geregelt. Dazu wird unter ~/docker-mailserver/config die Datei postfix-virtual.cf geöffnet.

In der Datei selbst steht zum Beispiel:

# Alle Mails an Heinz werden an Jenni weitergeleitet:
heinz@mydomain.de       jenni@mydomain.de

# "Info"-Mails werden an mehrere Mitarbeiter verteilt:
info@mydomain.de        nina@mydomain.de, kathy@otherdomain1.de, jakob@otherdomain2.de

Um die Virtual Alias Map zu aktivieren, wird der Mailserver mit Strg+c gestoppt und mit docker-compose up mail wieder neu gestartet.

Falls man eine Adresse neu einrichtet, z.B. campaign@mydomain.de, und Mails an diese Adresse sollen an die bereits bestehende Adresse me@mydomain weitergeleitet werden, muss zunächst die Adresse campaign@mydomain.de in postfix-accounts.cf wie oben beschrieben eingetragen werden. Anschließend wird der Mailserver neu gestartet. Im nächsten Schritt wird die neue Adresse in der Datei postfix-virtual.cf auf me@mydomain weitergeleitet. Legt man die neue Adresse und die Weiterleitung gleichzeitig an, wird nichts erkannt trotz Serverneustarts.

Docker-Container

Um in den Container selbst zu gelagen, gibt man ein

docker exec -it mail bash

Die Dateien in dem Cotainer können bearbeitet werden, was aber nicht sinnvoll ist, da sie nach einem Mailserver-Neustart nicht mehr zur Verfügung stehen.

Good to know

# Find the MX (mail exchange) server
$ dig MX amazon.com +short
5 amazon-smtp.amazon.com.

# Find the ip address of the mx server
$ dig amazon-smtp.amazon.com +short
207.171.184.25

TLS-Check
https://www.checktls.com/TestReceiver

DNS-Check
www.intodns.com