WordPress email not sending is rarely a WordPress bug
By default WordPress hands mail to PHP’s mail function, which hands it to whatever mail agent the server happens to run. Nothing in that chain proves the message came from you.
Receiving servers have become far stricter about that. Mail that cannot be authenticated is increasingly not filed as spam, it is rejected outright. So when you find WordPress email not sending, the useful idea is this: a form plugin reporting success and a message actually arriving are two completely different events.
Check SPF, DKIM and DMARC first
These three DNS records tell receiving servers whether to trust mail claiming to come from your domain.
- SPF lists which servers are allowed to send on behalf of your domain.
- DKIM adds a cryptographic signature so the receiver can verify the message was not altered in transit.
- DMARC tells receivers what to do when SPF or DKIM fail, and where to send reports about it.
If you send through a host that is not listed in your SPF record, or your DKIM signature does not match, delivery becomes unreliable in ways that look completely random. dmarc.org has a readable overview of how the three fit together.
Send through a real SMTP service
The single most effective fix is to stop relying on the server’s default mail and send through an authenticated SMTP service instead. A plugin such as FluentSMTP or WP Mail SMTP routes WordPress mail through a provider that is already trusted and already signing correctly.
It also gives you a log. Without one you are guessing about whether the message ever left, and that guesswork is most of the difficulty in diagnosing these problems.
Then work out where it actually stopped
There are only three places a message can be lost, and each needs a different fix:
- It never left. A PHP error, a broken form action, or mail disabled at the server. The SMTP log will be empty.
- It left and was rejected. Authentication or reputation. The log shows a bounce, and the bounce reason is worth reading carefully.
- It arrived and was filed as spam. Content, sending reputation, or a missing DMARC policy.
Most reports of WordPress email not sending turn out to be the second case. Working out which of the three you have removes almost all of the guesswork.
The one that catches people out
Moving a site to a new host moves the website, but a domain’s mail records live in the same DNS zone. Change nameservers without carrying the MX, SPF and DKIM records across and email stops, usually a few hours after everybody has agreed the migration went smoothly.
Mail records are worth checking deliberately as part of any migration rather than discovering the problem afterwards.
Questions people ask about this
Why do my contact form emails go to spam?
Usually because the message cannot be authenticated. If SPF does not list the sending server, or DKIM is missing, a receiving provider has little reason to trust it. Sending through an authenticated SMTP service resolves most of this.
Do I really need an SMTP plugin?
For any site sending mail that people rely on, yes. Default server mail is unauthenticated and unlogged, which makes both delivery and diagnosis considerably worse.
My email broke right after moving host. Why?
Almost certainly the DNS zone. Changing nameservers moves the mail records too, so MX, SPF and DKIM have to be carried across deliberately or mail simply stops arriving.