Zum Inhalt springen
Illustration: Illustration: Aus einem leeren Browserfenster führt ein grauer Weg mit einem Umschlag zu einer Tonne unter einem Filtertrichter, ein grün leuchtender Weg führt über einen Mailserver mit Siegel zu einem Briefkasten.
Security

WordPress-Mails kommen nicht an: Absender und SPF prüfen

Von · · 13 Min. Lesezeit

Wenn WordPress-Mails nicht ankommen oder im Spam landen, liegt es meist daran, dass der Empfänger sie nicht deiner Domain zuordnen kann. WordPress verschickt ab Werk über die PHP-Funktion mail() des Webservers, mit dem Absender wordpress@deine-domain.at. Steht dieser Webserver nicht in deinem SPF-Eintrag und signiert er nicht mit DKIM für deine Domain, ist die Mail für Gmail, Yahoo und Outlook.com nicht authentifiziert, und genau das sortieren sie seit 2024 und 2025 aus oder lehnen es ab.

Das Plugin ist selten das Problem, der Absender schon. Ob Contact Form 7, WPForms oder WooCommerce: Alle übergeben ihre Mails an wp_mail(), die Mailfunktion von WordPress. Ein SMTP-Plugin ändert nur den Weg hinaus. Ob die Mail ankommt, entscheidet der Empfänger an SPF, DKIM, DMARC und an der Adresse im From:. Wer ein SMTP-Plugin installiert und dort weiter die Gmail-Adresse des Formularausfüllers als Absender einträgt, hat nichts gewonnen.

Was WordPress ab Werk tut#

Der Quelltext von wp_mail() in wp-includes/pluggable.php ist eindeutig. Fehlt ein Absender, nimmt WordPress wordpress@ plus Hostname der Website ohne www., Anzeigename „WordPress“, und verschickt mit $phpmailer->isMail(), Kommentar: „Set to use PHP's mail()“. Die Umschlagadresse, an die Rückläufer gehen, setzt WordPress dabei nicht selbst; sie kommt aus der Mailkonfiguration des Servers.

Drei Folgen daraus:

  • Die Adresse wordpress@… existiert nur, wenn jemand sie beim Hoster angelegt hat. Der Kommentar im Quelltext sagt selbst, dass manche Hoster ausgehende Mails von dieser Adresse blockieren, wenn sie nicht existiert.
  • Die Mail verlässt den Webserver, nicht deinen Mailserver. Liegt dein Postfach bei Microsoft 365, Google Workspace oder einem anderen Anbieter als die Website, steht der Webserver nur dann in deinem SPF-Eintrag, wenn ihn jemand eingetragen hat.
  • true heißt nicht zugestellt. Die Dokumentation von wp_mail() schreibt, ein Rückgabewert true bedeute nur, dass die Versandmethode die Anfrage ohne Fehler angenommen hat, nicht dass der Empfänger die Mail bekommen hat. Das „Danke, Nachricht gesendet“ im Formular beweist also nichts.

Kommt gar nichts an, oder landet es im Spam?#

Zwei verschiedene Fehler, eine Prüfreihenfolge:

  1. Wird überhaupt gesendet? Bei WooCommerce steht das im Protokoll: unter WooCommerce > Status > Logs die Quelle transactional-emails. WooCommerce schreibt dort für jede Shop-Mail Sent, Failed, Disabled oder Skipped. Steht da Disabled, ist die Mail unter WooCommerce > Einstellungen > E-Mails abgeschaltet. Bestellungen im Status „Zahlung ausstehend“ lösen laut WooCommerce gar keine Mail aus. Sonst hilft das Protokoll eines SMTP-Plugins.
  2. Eine Testmail über genau diesen Weg an ein Gmail-Konto schicken: das Kontaktformular ausfüllen, eine Testbestellung auslösen oder auf der Anmeldeseite „Passwort vergessen?“ für einen Testbenutzer mit Gmail-Adresse anfordern. Nicht aus dem eigenen Postfach, das nimmt einen anderen Weg.
  3. Im Gmail-Konto „Original anzeigen“ öffnen. Oben stehen SPF, DKIM und DMARC mit PASS oder FAIL. Darunter steht Authentication-Results mit smtp.mailfrom= (die Domain, die SPF geprüft hat) und header.i= oder header.d= (die Domain der DKIM-Signatur). Wie man die Zeilen liest, steht in E-Mail-Header lesen.
  4. Die eigene Domain prüfen. Der E-Mail-Check liest SPF samt Zahl der DNS-Abfragen, sucht DKIM-Schlüssel unter 30 gängigen Selektoren (oder unter dem, den du aus dem Header einträgst) und zeigt die DMARC-Richtlinie, ohne Anmeldung.
  5. Kam ein Rückläufer, steht der Code darin. 550 5.7.26 von Gmail oder 550 5.7.515 von Outlook.com heißt: Authentifizierung fehlt. Was die Codes bedeuten, steht in E-Mail abgelehnt: 550 5.7.1.

Stehen alle drei auf PASS und die Mail landet trotzdem im Spam, liegt es nicht am Versandweg von WordPress, sondern an Ruf oder Inhalt.

Die vier Ursachen, die im Header stehen#

1. SPF schlägt fehl. Die Mail kam vom Webserver, und der steht nicht im SPF-Eintrag der Domain. Typisch, wenn Website und Postfach bei verschiedenen Anbietern liegen.

2. SPF besteht, aber für die falsche Domain. smtp.mailfrom= zeigt einen technischen Namen des Hosters, nicht deine Domain. Das ist die Umschlagadresse, die der Server bei mail() setzt. SPF ist dann für den Hoster bestanden, für DMARC zählt das nicht, weil die Domain nicht zum From: passt.

3. Keine DKIM-Signatur für deine Domain. Fehlt DKIM-Signature ganz oder steht dort hinter d= nicht deine Domain, kann DMARC auch über DKIM nicht bestehen.

4. Im From: steht eine fremde Domain. Das ist der Klassiker bei Kontaktformularen: Als Absender ist die Adresse eingetragen, die der Besucher ins Formular getippt hat, etwa name@gmail.com. Dein Server darf für gmail.com weder SPF bestehen noch mit DKIM signieren. Gmail nennt das ausdrücklich unter seinen Anforderungen: Keine Gmail-Adressen im From: vortäuschen, Gmail werde dafür eine DMARC-Richtlinie quarantine anwenden. Bei anderen Anbietern ist es schärfer: Am 12.10.2026 stand im DNS für yahoo.com p=reject und für gmx.at und gmx.net p=quarantine. Bei einer Formularmail mit Yahoo-Absender fordert Yahoo also jeden Empfänger auf, sie abzulehnen.

DMARC verlangt, dass die Domain im From: zur Domain passt, für die SPF oder DKIM bestanden hat (Ausrichtung, englisch alignment). Wie das im Einzelnen funktioniert, steht in DMARC einrichten.

Illustration: Illustration: Ein Umschlag mit zwei leeren Feldern; das grüne Haus-Symbol oben passt zu einem Karteikasten daneben, das graue Wolken-Symbol unten führt mit einer gestrichelten Linie ins Leere.

Was die großen Anbieter verlangen#

Seit dem 1. Februar 2024 verlangen Gmail und Yahoo von jedem Absender SPF oder DKIM und eine Spamquote unter 0,3 %; ab 5.000 Mails am Tag zusätzlich DMARC und eine From:-Domain, die zu SPF oder DKIM passt. Seit November 2025 setzt Gmail das laut eigener FAQ verschärft durch, bis zu dauerhaften Ablehnungen. Microsoft verlangt für Outlook.com und Hotmail seit 5. Mai 2025 von Domains mit mehr als 5.000 Mails am Tag SPF, DKIM und DMARC und lehnt sonst mit 550 5.7.515 ab.

Eine Website mit Kontaktformular schickt keine 5.000 Mails am Tag. Für sie gilt die kleinere Regel, SPF oder DKIM, und genau die verfehlt mail(), wenn der Webserver weder im SPF-Eintrag steht noch signiert. Die Einzelheiten stehen in Warum landen meine Mails im Spam?.

Die Lösung in vier Schritten#

1. Über einen Server senden, der für deine Domain authentifiziert ist#

Am einfachsten über das Postfach, das ohnehin für deine Domain sendet: Website-Mails über den SMTP-Server deines Mailanbieters, mit einem eigenen Postfach wie website@deine-domain.at. Normale Mails aus diesem Postfach bestehen SPF und DKIM schon. WordPress nimmt dann denselben Weg. Bei viel Versand, etwa in einem Shop, ist ein transaktionaler Versanddienst die Alternative; WooCommerce empfiehlt in seiner Dokumentation selbst einen eigenen SMTP-Anbieter, weil der zuverlässiger sei als die Mailfunktion des Servers.

Mit Plugin: Die drei verbreitetsten im Plugin-Verzeichnis sind WP Mail SMTP (über 4 Millionen aktive Installationen), FluentSMTP (über 700.000) und Post SMTP (über 300.000). Alle drei binden einen beliebigen SMTP-Server oder einen Versanddienst an.

Ohne Plugin: WordPress bietet dafür den Haken phpmailer_init, der läuft, nachdem PHPMailer eingerichtet ist und bevor gesendet wird. Als kleines Plugin in wp-content/mu-plugins/:

<?php
// wp-content/mu-plugins/smtp.php
add_action( 'phpmailer_init', function ( $phpmailer ) {
    $phpmailer->isSMTP();
    $phpmailer->Host       = 'smtp.dein-mailanbieter.example';
    $phpmailer->Port       = 587;
    $phpmailer->SMTPSecure = 'tls';
    $phpmailer->SMTPAuth   = true;
    $phpmailer->Username   = 'website@deine-domain.at';
    $phpmailer->Password   = SMTP_PASS; // steht in wp-config.php
} );
add_filter( 'wp_mail_from', fn() => 'website@deine-domain.at' );
add_filter( 'wp_mail_from_name', fn() => 'Deine Firma' );

Server, Port und Verschlüsselung stehen in der Hilfe deines Mailanbieters. Bei SMTP nimmt PHPMailer die From:-Adresse als Umschlagadresse, solange keine eigene gesetzt ist; damit passen SPF-Domain und From: zusammen, und Ursache 2 ist erledigt.

2. Absender auf die eigene Domain, Formularausfüller ins Reply-To#

Jede Mail, die die Website verschickt, bekommt im From: eine Adresse deiner Domain. Wer auf die Formularmail antworten will, braucht die Adresse des Besuchers im Reply-To:. Dann geht die Antwort an ihn, obwohl die Mail von dir kommt.

Contact Form 7: Im Formular auf den Reiter „Mail“. Ins Feld „Von“ (englisch „From“) eine Adresse deiner Domain, etwa Website <website@deine-domain.at>. Die CF7-Dokumentation schreibt, das Feld solle eine Adresse derselben Domain wie die Website enthalten, sonst gebe es einen Konfigurationsfehler. Unter „Zusätzliche Header“ (englisch „Additional headers“):

Reply-To: [your-email]

[your-email] ist der Name des E-Mail-Feldes im Standardformular; heißt es bei dir anders, entsprechend anpassen. CF7 empfiehlt außerdem, die Adresse wordpress@deine-domain beim Hoster wirklich anzulegen, weil die Standardvorlage sie als Absender verwendet und WordPress selbst sie für seine Benachrichtigungen nimmt.

WooCommerce: Unter WooCommerce > Einstellungen > E-Mails das Feld für die Absenderadresse. WooCommerce schreibt, dort gehöre eine Adresse der Domain der Website hin; eine Gmail- oder Yahoo-Adresse führe wahrscheinlich in den Spam-Ordner oder zur Ablehnung.

WordPress selbst (Passwort-Mails, Benachrichtigungen an den Administrator): Absender über den Filter wp_mail_from wie oben oder in den Einstellungen des SMTP-Plugins. WP Mail SMTP hat dafür einen Schalter, der den Absender für alle Mails erzwingt (Konstante WPMS_MAIL_FROM_FORCE, unten).

3. SPF und DKIM für genau diesen Weg#

Läuft der Versand über das bestehende Postfach, ist meist schon alles da. Bei einem Versanddienst kommt dessen Eintrag in den vorhandenen SPF-Eintrag, nicht in einen zweiten:

deine-domain.at.  TXT  "v=spf1 include:spf.dein-mailanbieter.example include:spf.dein-versanddienst.example ~all"

Die Namen hinter include: nennt der jeweilige Dienst in seiner Anleitung. Zwei Grenzen aus RFC 7208: genau ein SPF-Eintrag je Domain und höchstens zehn DNS-Abfragen für include, a, mx, ptr, exists und redirect zusammen. Wer darüber liegt, hat einen ungültigen Eintrag (PermError). Zusammensetzen lässt er sich im SPF-Generator, der Weg Schritt für Schritt steht in SPF-Eintrag erstellen.

DKIM schaltet man beim Mailanbieter oder Versanddienst ein; der nennt einen oder mehrere DNS-Einträge, meist unter <selector>._domainkey.deine-domain.at. Ob der Schlüssel im DNS liegt, zeigt DKIM-Selector finden. Laut Google muss der Schlüssel für Gmail mindestens 1024 Bit lang sein, empfohlen sind 2048.

4. DMARC mit Berichtsadresse#

_dmarc.deine-domain.at.  TXT  "v=DMARC1; p=none; rua=mailto:dmarc@deine-domain.at"

Mit p=none verlangt die Domain von den Empfängern noch nichts, aber die Berichte zeigen, welche Versandwege noch nicht bestehen, auch die Website. Den Eintrag baut der DMARC-Generator, wann man auf quarantine und reject geht, steht in DMARC-Policy.

Das SMTP-Passwort und der Formular-Spam#

Ein SMTP-Zugang in WordPress ist ein Postfach-Zugang. Wer ihn erbeutet, verschickt mit deiner Domain, mit gültigem SPF und DKIM.

Das Passwort gehört nach Möglichkeit nicht in die Datenbank. WP Mail SMTP liest alle SMTP-Einstellungen auf Wunsch aus Konstanten in wp-config.php; die Plugin-Beschreibung sagt, das Passwort sei dann weder in den Einstellungen sichtbar noch in der Datenbank gespeichert. Steht es doch in der Datenbank, verschlüsselt WP Mail SMTP es; den Schlüssel legt das Plugin laut Quelltext aber ebenfalls in der Datenbank ab (Option wp_mail_smtp_mail_key), solange keine Konstante WPMS_CRYPTO_KEY gesetzt ist. Ein Datenbank-Abzug enthält dann beides.

// wp-config.php, oberhalb von „That's all, stop editing!“
define( 'WPMS_ON', true );
define( 'WPMS_MAILER', 'smtp' );
define( 'WPMS_SMTP_HOST', 'smtp.dein-mailanbieter.example' );
define( 'WPMS_SMTP_PORT', 587 );
define( 'WPMS_SSL', 'tls' );
define( 'WPMS_SMTP_AUTH', true );
define( 'WPMS_SMTP_USER', 'website@deine-domain.at' );
define( 'WPMS_SMTP_PASS', 'das-passwort' );
define( 'WPMS_MAIL_FROM', 'website@deine-domain.at' );
define( 'WPMS_MAIL_FROM_FORCE', true );

FluentSMTP bietet laut Beschreibung dieselbe Wahl und empfiehlt wp-config.php. Wo es geht, ist ein API-Schlüssel eines Versanddienstes mit Sendeberechtigung für genau diese Domain besser als das Passwort eines echten Postfachs. Und ein eigenes Postfach nur für die Website, nicht das der Geschäftsführung.

Formular-Spam ist ein Rufproblem. Füllen Bots das Formular mit fremden Adressen aus und schickt CF7 über „Mail (2)“ jedes Mal eine Bestätigung an die eingetragene Adresse, verschickt deine Domain Spam an Fremde. Rückläufer und Spam-Meldungen gehen auf das Konto deiner Domain, und die Spamquote, die Gmail und Yahoo unter 0,3 % sehen wollen, steigt. Eine automatische Antwort an den Absender deshalb nur dann, wenn das Formular gegen Bots geschützt ist. Ob die Server-IP schon auf einer Sperrliste steht, zeigt der Blacklist-Check.

Was nicht hilft#

Ein SMTP-Plugin installieren und den Absender lassen. Steht im From: weiter die Gmail-Adresse des Besuchers oder eine Domain, für die der SMTP-Server nicht signiert, besteht DMARC so wenig wie vorher.

Das Formular-Plugin wechseln. CF7, WPForms und WooCommerce übergeben alle an wp_mail(). Der Versandweg bleibt derselbe.

Einen zweiten SPF-Eintrag für die Website anlegen. Zwei Einträge machen nach RFC 7208 beide ungültig, danach besteht SPF für keinen Versandweg mehr, auch nicht für das Postfach.

Den Empfänger bitten, im Spam-Ordner nachzusehen. Das hilft diesem einen Kunden. Die nächste Bestellbestätigung landet beim nächsten wieder dort.

Wenn du es nicht selbst machen willst#

In eigener Sache: cyberscale bin ich, Stefan Haun aus Tirol. Der E-Mail-Schutz für 390 € richtet SPF, DKIM und DMARC beim bestehenden Anbieter ein, schrittweise bis reject, ohne dass Newsletter oder Buchungssysteme hängen bleiben, mit vier Wochen Auswertung der DMARC-Berichte; die Website ist dabei einer der Versandwege. Die WordPress-Wartung für 49 € im Monat hält Updates, Backups und die Überwachung von Erreichbarkeit, Zertifikat und DMARC am Laufen. Einzelne Arbeiten wie das Umstellen auf SMTP rechne ich nach Aufwand ab, 60 € pro Stunde, vorher abgesprochen. Ist die Seite nach einem Angriff der Grund für den Spam, ist das ein Fall für die WordPress-Soforthilfe.

Häufige Fragen#

Warum kommen Mails von meinem WordPress-Kontaktformular nicht an?

Meist, weil WordPress ab Werk über mail() des Webservers sendet und der Empfänger die Mail nicht deiner Domain zuordnen kann: Der Webserver steht nicht im SPF-Eintrag, es gibt keine DKIM-Signatur, oder im From: steht die Adresse des Besuchers. Die Testmail an Gmail mit „Original anzeigen“ zeigt, welcher der drei Fälle es ist.

Brauche ich ein SMTP-Plugin für WordPress?

Ein Plugin ist der einfachste Weg, WordPress über einen echten Mailserver senden zu lassen. Es geht auch mit ein paar Zeilen Code über phpmailer_init. Entscheidend ist nicht das Plugin, sondern dass der Server für deine Domain SPF und DKIM besteht und der Absender eine Adresse deiner Domain ist.

Welche Absenderadresse gehört in Contact Form 7?

Eine Adresse derselben Domain wie die Website, so schreibt es die CF7-Dokumentation. Die Adresse des Besuchers kommt unter „Zusätzliche Header“ als Reply-To: [your-email] hinein, dann geht eine Antwort trotzdem an ihn.

Warum kommt die WooCommerce-Bestellbestätigung nicht an?

Zuerst unter WooCommerce > Status > Logs in der Quelle transactional-emails nachsehen, ob die Mail gesendet, abgeschaltet, übersprungen oder mit Fehler abgebrochen wurde. Bestellungen mit Status „Zahlung ausstehend“ lösen keine Mail aus. Steht dort Sent, liegt es an der Zustellung: Absenderadresse in den E-Mail-Einstellungen auf die eigene Domain, SMTP über einen authentifizierten Server.

Wo speichere ich das SMTP-Passwort am sichersten?

Nicht in der Datenbank, sondern als Konstante in wp-config.php; WP Mail SMTP und FluentSMTP unterstützen das beide. Besser noch ist ein API-Schlüssel eines Versanddienstes, der nur für diese Domain senden darf, statt des Passworts eines echten Postfachs.

Stand 12.10.2026. WordPress-Quelltext, Plugin-Beschreibungen, CF7- und WooCommerce-Dokumentation, Anforderungen von Google, Yahoo und Microsoft und die DMARC-Einträge von yahoo.com, gmail.com und gmx an diesem Tag gelesen.

Quellen (14)

Weiterlesen