Ob Passwort-Reset, Monitoring-Alarm oder eine Benachrichtigung über ein fehlgeschlagenes Backup: Auch im Homelab ist ein zuverlässiger E-Mail-Versand elementar. Doch viele von uns scheuen den Aufwand in jeder Anwendung Zugangsdaten für den externen Mail-Anbieter (Smarthost) zu hinterlegen.
Abhilfe schafft hier ein zentrales SMTP-Relay. Dadurch müssen weniger Systeme sensible Zugangsdaten speichern, und die Konfiguration des ausgehenden Mailverkehrs lässt sich zentral verwalten. In diesem Artikel zeige ich dir, wie du das Ganze in 15 Minuten mit einem super simplen Postfix-Container umsetzt.
Das benötigst du für den Start:
| Docker & Docker Compose | Zum Bereitstellen und Verwalten des Postfix-Containers |
| Smarthost-Anbieter | Externer SMTP-Server für die Zustellung der E-Mails, beispielsweise mailbox.org |
| TLS-Zertifikat | Eigenes Zertifikat für die verschlüsselte Verbindung zwischen deinen Anwendungen und Postfix |
1. Docker Compose konfigurieren:
Für den SMTP-Relay verwenden wir das Image boky/postfix. Die Konfiguration erfolgt über Umgebungsvariablen in der Compose-Datei:
services:
postfix:
# Verwendetes Postfix-Docker-Image
image: boky/postfix:latest
# Name des Containers
container_name: postfix
# Container nach einem Neustart des Docker-Hosts automatisch starten
restart: always
# Postfix sieht die Quell-IP-Adressen der Clients
network_mode: host
environment:
# ANPASSEN: Vollständiger Hostname des lokalen SMTP-Relays
HOSTNAME: mailrelay.deine-domain.de
# ANPASSEN: SMTP-Server und Port deines Anbieters
RELAYHOST: <smtp.anbieter.org:587>
# ANPASSEN: Benutzername für die SMTP-Authentifizierung
RELAYHOST_USERNAME: <user@anbieter.org>
# ANPASSEN: Passwort oder App-Passwort des Mail-Anbieters
# Empfehlung: Zugangsdaten nicht direkt in der Compose-Datei speichern
RELAYHOST_PASSWORD: <Passwort>
# TLS-Verschlüsselung für die Verbindung zum externen SMTP-Server erzwingen
RELAYHOST_TLS_LEVEL: encrypt
# ANPASSEN: Vertrauenswürdige interne Netzwerke, die den Relay verwenden dürfen
# Beispiel: 192.168.178.0/24 (lokales Fritz!Box-Netz)
# Mehrere Netzwerke durch Leerzeichen trennen
MYNETWORKS: "192.168.178.0/24"
# ANPASSEN: Domains, die als Absenderdomains zugelassen werden sollen
# Die Domains müssen gegebenenfalls auch beim externen Mail-Anbieter als zulässige Absender eingerichtet sein
ALLOWED_SENDER_DOMAINS: "example.org homelab.example.net"
volumes:
# Zertifikate des SMTP-Relays in den Container einbinden
# ANPASSEN: Linker Pfad zum Verzeichnis mit deinen Zertifikaten
# Rechter Pfad: Zertifikatsverzeichnis im Container
# :ro = nur lesender Zugriff
- ./ssl-certs:/etc/postfix/certs:ro
# Benutzerdefiniertes Init-Skript für die TLS-Konfiguration
# ANPASSEN: Linker Pfad zum Skript auf dem Docker-Host
# Das Skript muss zum verwendeten Image und dessen Init-Mechanismus passen
- ./postfix-init-scripts/tls.sh:/docker-init.d/tls.sh:roAn dieser Stelle möchte ich noch kurz auf Best Practices für den Umgang mit Passwörtern in Docker-Compose-Dateien eingehen. Passwörter sollten nämlich nicht direkt in der docker-compose.yml hinterlegt werden.
Stattdessen empfiehlt es sich, diese in einer separaten .env-Datei abzulegen und über Umgebungsvariablen in die Compose-Konfiguration einzubinden. Dadurch stehen Passwörter nicht direkt in der Compose-Datei, was insbesondere bei der Git-Versionsverwaltung von Vorteil ist.
Lege dazu im selben Verzeichnis eine Datei namens .env an:
RELAYHOST_USERNAME=user@anbieter.org
RELAYHOST_PASSWORD=<Passwort>Passe anschließend die Umgebungsvariablen in deiner Compose-Datei an:
environment:
RELAYHOST_USERNAME: ${RELAYHOST_USERNAME}
RELAYHOST_PASSWORD: ${RELAYHOST_PASSWORD}Schütze die Datei vor dem Zugriff durch andere Benutzer:
chmod 600 .env⚠️ Wichtig: Eine
.env-Datei ist kein sicherer Passwortspeicher. Sie erleichtert es, Zugangsdaten aus der Compose-Datei herauszuhalten und über.gitignorevon der Versionsverwaltung auszuschließen. Vor unbefugtem Zugriff muss die Datei trotzdem durch geeignete Dateiberechtigungen geschützt werden.
2. TLS einrichten:
Damit Clients verschlüsselt mit dem Relay kommunizieren können, lässt sich Postfix mit einem eigenen Zertifikat konfigurieren. Dazu wird ein Init-Skript verwendet, das die Zertifikatpfade im Postfix-Container hinterlegt. Es befindet sich im Bind-Mount postfix-init-scripts und trägt den Namen tls.sh:
postconf -e 'smtpd_tls_cert_file=/etc/postfix/certs/example.com.fullchain'
postconf -e 'smtpd_tls_key_file=/etc/postfix/certs/example.com.key'Jetzt kannst du den Container endlich zum ersten Mal in Betrieb nehmen:
docker compose up -d 💡 Tipp: Wildcard-Zertifikate für dein Homelab:
Mit acme.sh kannst du innerhalb weniger Minuten ein Wildcard-Zertifikat von Let’s Encrypt für deine eigene Domain erstellen. Die Validierung erfolgt über eine DNS-Challenge, die von zahlreichen DNS-Anbietern unterstützt wird. Du benötigst dafür lediglich einen API-Key deines DNS-Anbieters und musst die entsprechende Schnittstelle einmalig konfigurieren.
3. E-Mail-Versand testen:
Nach dem Start sollte zunächst geprüft werden, ob der Container läuft:
docker compose psDie Logs zeigen, ob Nachrichten angenommen und an den Smarthost-Anbieter weitergeleitet werden:
docker compose logs -f postfixEin erfolgreicher Versand ist beispielsweise an einer Meldung wie dieser erkennbar:
status=sent (250 2.0.0 Ok: queued as ...)Fehler bei der Authentifizierung, TLS-Verbindungen oder Absenderadressen werden ebenfalls im Log sichtbar.
⚠️ Nr. 1 Fehlerquelle »Sender address rejected«:
Ein häufiger Fehler ist eine nicht autorisierte Absenderadresse. Die meisten SMTP-Relay-Anbieter akzeptieren nur Adressen, die für das jeweilige Konto freigegeben wurden. Als Fallback kannst du Postfix so konfigurieren, dass nicht autorisierte Absenderadressen beim Versand automatisch durch eine beim Mail-Anbieter zugelassene Adresse ersetzt werden.
Abschließende Gedanken:
Mithilfe dieses Postfix-Images lässt sich schnell ein zentraler SMTP-Relay für das Homelab einrichten. Deine Anwendungen können darüber E-Mails versenden, ohne selbst die Zugangsdaten des externen Mail-Anbieters speichern zu müssen.
Eine kleine Einschränkung gibt es bei der SMTP-Authentifizierung: Das Image bietet keine einfache Konfigurationsoption, um eine Passwortauthentifizierung für interne Clients einzurichten. Deshalb sollte der Zugriff auf vertrauenswürdige interne Netzwerke beschränkt bleiben.
💡 Tipp: Laufen alle Anwendungen auf demselben Docker-Host, kannst du Postfix und die betreffenden Container in dasselbe Docker-Netzwerk einbinden. Sie erreichen den Relay dann über
postfix:587. Eine Portfreigabe auf dem Host ist nur nötig, wenn externe Clients zugreifen sollen.

