Ein SMTP-Relay nimmt E-Mail an und leitet sie an einen anderen Mailserver weiter. Wer eine eigene Anwendung betreibt, die Mails versendet, braucht in der Regel eines – und die häufigste Fehlkonfiguration führt dazu, dass die Mail im Spam-Ordner landet oder gar nicht ankommt.
Warum ein Relay statt direktem Versand
- Kein PTR-Eintrag für den Anwendungsserver: Viele Empfänger weisen Mail von Adressen ohne gültige Rückwärtssuche ab. Der Relay-Server hat einen, der Anwendungsserver nicht.
- Reputation: Ein sauber betriebener Relay-Server hat eine gute Reputation. Eine frisch aufgesetzte Anwendung nicht.
- Dynamische Adressen: Server in einer Cloud ohne feste Adresse werden von einem großen Teil der Empfänger abgewiesen.
- Zentrale Verwaltung: SPF, DKIM, DMARC, Warteschlange und Protokoll an einer Stelle.
- Annahmepflicht: Ein Relay kann Mail annehmen, wenn der Empfänger kurzzeitig nicht erreichbar ist – und später zustellen.
Die drei Rollen, die auseinandergehalten werden müssen
1. MTA (Mail Transfer Agent) Postfix, Exim, Sendmail
Spricht SMTP mit anderen Servern, verwaltet die Warteschlange.
2. MSA (Mail Submission Agent) Port 587 mit STARTTLS + Auth
Was Anwendungen und Mailprogramme zum SENDEN nutzen.
3. MDA (Mail Delivery Agent) Dovecot
Legt die Mail ins Postfach und stellt sie per IMAP bereit.
Fuer eine Anwendung mit Versandbedarf braucht man einen MSA
oder einen MTA mit Submission-Port - NICHT Port 25 direkt.
Port 25 ist der Server-zu-Server-Verkehr.
Postfix als Relay konfigurieren
# /etc/postfix/main.cf
myhostname = app.example.org
mydomain = example.org
myorigin = $mydomain
# Nur lokal lauschen - die Anwendung laeuft auf demselben Host
inet_interfaces = loopback-only
inet_protocols = ipv4
mynetworks = 127.0.0.0/8
# Alles ueber den Relay des Providers leiten
relayhost = [w00db51b.kasserver.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain, login
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
# Absender umschreiben: Die Anwendung darf nicht "root@..."
# als Absender verwenden, das wird abgewiesen.
smtp_generic_maps = hash:/etc/postfix/generic
# /etc/postfix/generic:
# root@localhost Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.
# @app.local Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein.
# Warteschlange
maximal_queue_lifetime = 2d
bounce_queue_lifetime = 1d
# Nach 2 Tagen wird aufgegeben - dann kommt eine Fehlermeldung.
# Kuerzer einstellen, wenn die Mail zeitkritisch ist (z. B. 4h).
# Ratenbegrenzung (verhindert, dass der Provider sperrt)
default_destination_rate_delay = 1s
smtp_destination_concurrency_limit = 5
# Protokoll
maillog_file = /var/log/mail.log
# Zugangsdaten - chmod 600!
# /etc/postfix/sasl_passwd:
# [w00db51b.kasserver.com]:587 m082146e:geheim
postmap /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
postmap /etc/postfix/generic
systemctl restart postfix
Testen: der Ablauf, der Fehler findet
# 1. Konfiguration pruefen
postfix check
# 2. Warteschlange ansehen
mailq
postqueue -p | tail -20
postsuper -d ALL # Warteschlange leeren (Vorsicht!)
postcat -q # einzelne Mail ansehen
# 3. Versand von Hand testen - mit vollstaendiger Protokollausgabe
swaks --to Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. \
--from Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. \
--server 127.0.0.1:25 \
--header 'Subject: Testmail' \
--body 'Testinhalt'
# swaks ist das wichtigste Werkzeug: Es zeigt den kompletten
# SMTP-Dialog - so sieht man, an welcher Stelle es scheitert.
# Ohne swaks: mit openssl den Dialog mitlesen
openssl s_client -starttls smtp -connect 127.0.0.1:25 -crlf
# EHLO test
# MAIL FROM:
# RCPT TO:
# DATA
# Subject: Test
#
# Testinhalt
# .
# QUIT
# 4. Protokoll mitlesen
tail -f /var/log/mail.log | grep -E 'to=|status=|relay='
journalctl -u postfix -f
# 5. Ergebnis anhand des Status bewerten
# status=sent zugestellt - gut
# status=deferred voruebergehend nicht zustellbar (Warteschlange)
# status=bounced endgueltig abgelehnt - Ursache im Protokoll!
# status=rejected waehrend der SMTP-Sitzung abgelehnt (Spamfilter, SMTP-Auth)
# "Relay access denied" -> mynetworks oder Authentifizierung falsch
# "Sender address rejected" -> Absenderumsschreibung fehlt
# "Connection timed out" -> Port 587 blockiert oder falsche Adresse
# "535 Authentication failed" -> Zugangsdaten falsch (Sonderzeichen im Passwort!)
Zustellbarkeit: SPF, DKIM und DMARC
Ohne diese drei Einträge landet Mail von einem neuen Absender fast immer im Spam – oder wird ganz abgelehnt.
# 1. SPF - welche Server duerfen fuer die Domain senden?
# example.org. IN TXT "v=spf1 mx a:relay.provider.net -all"
# mx der eigene MX darf senden
# a:host dieser Host darf senden
# -all alles andere hart ablehnen (empfohlen)
# ~all alles andere markieren (weicher, weniger gut)
# ACHTUNG: maximal 10 DNS-Abfragen im SPF-Eintrag!
# Zu viele include: = SPF-Fehler = Spam.
# 2. DKIM - Signatur der ausgehenden Mail
# Der Relay-Server signiert mit einem privaten Schluessel;
# der oeffentliche liegt als TXT-Eintrag unter
# ._domainkey.example.org
# Pruefen:
dig +short TXT default._domainkey.example.org
opendkim-testkey -d example.org -s default -vvv
# 3. DMARC - was soll mit nicht authentifizierter Mail geschehen?
# _dmarc.example.org. IN TXT "v=DMARC1; p=quarantine; rua=mailto:Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein. "
# p=none nur beobachten (Start)
# p=quarantine in Spam verschieben
# p=reject ablehnen
# Der Bericht an rua: zeigt, wer in deinem Namen sendet -
# sehr aufschlussreich.
# 4. Ergebnis pruefen
dig +short TXT example.org | grep spf
dig +short TXT _dmarc.example.org
dig +short TXT default._domainkey.example.org
# Online-Pruefer nutzen: mail-tester.com zeigt die Bewertung
# inklusive aller Eintraege und Fehler.
Häufige Fehler
- Falscher Absender. Die Anwendung sendet als
root@localhostoderwww-data@server. Umsschreibung insmtp_generic_mapsist Pflicht. - Port 25 statt 587. Viele Provider und Netzwerke blockieren 25 ausgehend. Submission ist 587 mit STARTTLS und Authentifizierung.
- SMTP-Authentifizierung fehlt. Der Relay verlangt sie; dann kommt Relay access denied.
- Zertifikat nicht geprüft.
smtp_tls_security_level = encryptohne CA-Datei akzeptiert jedes Zertifikat – ein Angreifer in der Mitte kann mitlesen. - Kein
noanonymous. Der Server akzeptiert dann auch Verfahren ohne Anmeldung – eine offene Weiterleitung ist die Folge und führt zur Sperrliste. - Keine Ratenbegrenzung. Ein Ausgabefehler in der Anwendung erzeugt 10.000 Mails in Minuten. Der Provider sperrt den Zugang – oft für Tage. Immer begrenzen.
- SPF-Eintrag über dem Limit. Mehr als 10 DNS-Abfragen macht den SPF ungültig.
include-Verschachtelungen prüfen. - DKIM nicht signiert. Der Relay speichert die Mail weiter, wie er sie bekommt. Wer DKIM nutzen will, muss selbst signieren oder einen Relay verwenden, der es tut.
- Warteschlange nicht beobachtet. Eine wachsende Warteschlange bedeutet, dass Zustellungen scheitern. Ein Maß für die Größe gehört auf ein Dashboard.
- Zugangsdaten im Klartext an falscher Stelle.
/etc/postfix/sasl_passwdbrauchtchmod 600– die Datei mit Klartextpasswort wird sonst von jedem gelesen. - Fehler nicht sichtbar. Ein
mail()-Aufruf in einer Skriptsprache liefert einen Wahrheitswert – ob die Mail angekommen ist, weiß man erst nach Prüfung von Warteschlange und Protokoll. Immer zentral protokollieren.
Verwandte Grundlagen: SMTP, SPF, DKIM und DMARC, DNS, SPF.