E-Mail-Versand im Docker-Container funktioniert nicht? So löst du das Problem

Viele Enterprise-Anwendungen erfordern eine Verbindung zu einem Mail-Server, um Benutzer per E-Mail zu benachrichtigen. E-Mails können vielfältige Informationen enthalten, wie das Zurücksetzen von Benutzerpasswörtern, die Auflistung neuer Dokumente in einem Kunden-Service-Portal oder Hinweise zu fehlgeschlagenen Build-Pipelines.
Zum Versenden von E-Mails nutzen Applikationen in der Regel einen externen Mail-Server, dessen Verbindung entsprechend konfiguriert wird. Neben der Server-Adresse sind oftmals Authentifizierungs-Daten, Protokoll und Verschlüsselung anzugeben. Die Konfiguration erfolgt in der Regel in den Administrations-Dialogen der Applikation oder über Konfigurations-Dateien. Für die anschließende Verifizierung der Mail-Funktion bieten viele Applikationen den Versand einer Testmail an.
Das nachfolgende Beispiel zeigt exemplarisch die Einstellungen in Keycloak.
Warum schlägt der E-Mail-Versand im Container fehl?
Wird die Applikation in einem Docker-Container betrieben, gestaltet sich die Konfiguration analog. Nach unserer Erfahrung gibt es abhängig von den Docker-Containern, die die Applikation betreiben, öfters Probleme beim Verbinden mit einem Mail-Server. Beim Versenden der Testmail werden in den Log-Dateien zwar entsprechende Fehlermeldungen angezeigt, aber oftmals gelingt auch nach Anpassung der Konfiguration eine Verbindung zum Mail-Server nicht. Dagegen funktioniert genau die gleiche Konfiguration in einem anderen Docker-Container problemlos.
Neben dem Netzwerk und Faktoren wie der Firewall kann der Docker-Container ein möglicher Verursacher des Verbindungsproblems sein. Die Anbieter der Applikationen stellen in vielen Fällen direkt die benötigten Docker-Container zur Nutzung bereit.
In unserem Fall trat das Verbindungsproblem mit dem Mail-Server bei Keycloak auf. Sämtliche Veränderungen der Konfigurations-Einstellungen ließen kein Versenden von E-Mails zu.
Mit Postfix gelingt der E-Mail-Versand im Container
Alternativen zur Umgehung des Problems sind die Nutzung eines anderen Docker-Images mit Keycloak oder selbst ein Keycloak Docker-Image zu erstellen, um dann zu überprüfen, ob der E-Mail-Versand mit einer der beiden Varianten funktioniert.
Allerdings sollte in unserem Fall das gehärtete, offizielle Docker-Image aufgrund der Erfahrungen beim Einsatz in anderen Kunden-Projekten genutzt werden.
Das Problem konnte durch die Nutzung eines Postfix-Docker Images gelöst werden. Durch den Einsatz von Docker Compose konnte dort der Service in die docker-compose.yml Datei eingebunden werden. Der Postfix-Container dient als ein SMTP-Relay Server und gibt die E-Mail an den Mail-Server der Domäne weiter.
Der nachfolgende Ausschnitt aus der docker-compose-yml Datei zeigt die entsprechenden Konfigurations-Einstellungen
postfix:
image: boky/postfix:latest
environment:
- RELAYHOST=smtpoutserver.de:587
- RELAYHOST_USERNAME=xxx@exensio.com
- RELAYHOST_PASSWORD=xxx
- ALLOWED_SENDER_DOMAINS=exensio.com
- TZ=Europe/Berlin
networks:
- keycloak-network
In einem zweiten Schritt wird in der Applikation der Postfix-Container als Zielserver eingerichtet. Hier wird direkt über das Docker-Netzwerk auf den Postfix Service zugegriffen. Dieser kann über den Hostnamen Postfix angesprochen werden und es müssen auch keine weiteren Einstellungen wie Benutzername oder Passwort konfiguriert werden, da die das Postfix-Relay übernimmt.
Fazit: SMTP-Relay als einfache Lösung für E-Mail-Probleme im Docker-Container
Die Nutzung eines Postfix-Docker-Images als SMTP-Relay-Server bietet in diesem Fall eine einfache und effiziente Lösung für Verbindungsprobleme mit Mail-Servern in Docker-Umgebungen.
Die vorgestellte Alternative, mit der Nutzung eines weiteren Docker-Containers als Zwischenschicht, kann ggf. auch bei anderen Authentifizierungs-Problemen wie HTTP Basic-Auth als Lösung dienen.