WordPress emails not sending? Causes and fixes
Updated
WordPress sends email with PHP's mail() function by default. That function hands the message to the web server's local mail program, with no authentication and no feedback. Almost every "WordPress email not sending" problem comes from that design.
Find the cause
Work down this list. Each step rules something out.
1. Is the email even being created?
Install a plugin that logs outgoing mail, or check your form plugin's settings. Confirm the form sends to a valid address and that the notification is switched on. A surprising number of cases are a mistyped recipient.
2. Check the spam folder, and a second mailbox
Send the same message to a Gmail and an Outlook address. If it reaches the spam folder, delivery works and authentication is the problem. If it reaches neither, the server is not sending it.
3. Look at the sender
By default WordPress sends from wordpress@yourdomain.com, an address that rarely exists. Mailbox providers treat a sender that cannot receive mail with suspicion. Use a real address on your domain, and make sure it matches a domain you have set up for sending.
4. Check the host
Many hosts block or throttle outbound mail, especially on shared plans and cloud servers where port 25 is closed. Ask your host whether mail() is enabled and whether outbound SMTP ports are open. If the answer is "no", no SMTP-based fix will work, but an HTTPS email API will, because it uses port 443.
5. Check SPF, DKIM and DMARC
These DNS records prove the message came from somewhere allowed to send for your domain. Check them with the free tools:
- SPF checker for a single record, under ten lookups
- DKIM checker for a valid signature key
- DMARC checker for a policy
Then read a delivered message's headers for spf=, dkim= and dmarc= results. See SPF, DKIM and DMARC explained for what each result means.
6. Check the content
Plain, short messages from forms and shops deliver well. Problems come from image-only emails, link shorteners, and subject lines in capitals. Compare the failing email with one that works.
The fix that lasts
Stop using mail(). Send through a service that authenticates your domain and tells you when something fails. There are two ways to connect WordPress to one:
| Method | Works when | Notes | |---|---|---| | SMTP plugin | Your host allows outbound SMTP | Needs SMTP credentials, and port 587 or 465 open | | HTTPS email API | Almost always | One request over port 443 |
Inboxili is an API service with no SMTP endpoint. An Inboxili for WordPress plugin is coming soon and is not released yet. Until then, you can send from custom code as shown on that page, or use the free tools above to fix the records that make mail() fail.
Things the API cannot do
If you replace mail() with the Inboxili API, know its limits: one recipient per request, and no attachments, Cc, Bcc or Reply-To field. Plugins that attach invoices or rely on Reply-To for form submitters need a different approach for those messages.
After it works
Keep an eye on it. A form that sends an email per submission is a spam target, so add a CAPTCHA or honeypot. Read the PHP mail() article if you maintain custom code, and the contact form workflow for a safe pattern.
Frequently asked questions
- Why does WordPress say the email was sent but nothing arrives?
- WordPress reports success when it hands the message to the server's mail system, not when anyone accepts it. The message may be queued, rejected, or junked later.
- Do I need an SMTP plugin?
- You need a way to send that is authenticated and permitted by your host. That can be SMTP or an HTTPS email API. Inboxili uses an API, not SMTP.
Set up reliable email delivery
Create a workspace, verify a domain, and make your first API call.