Your WordPress site looks great. Your contact form looks great. A visitor submits it, the form says “Thanks, we’ll be in touch!” — and the notification email never arrives in your inbox. Or it arrives in spam. Or it arrives three hours late, after the lead has already moved on.
You’re not unlucky. WordPress email is broken by default — and most fixes only solve half of the problem. Here’s why, and how to fix it for good.
Why wp_mail() emails go to spam
WordPress’s built-in wp_mail() function is a thin wrapper around PHP’s mail() function. By default, when your site sends an email, three things happen that almost guarantee delivery problems:
1. The “From” address fails SPF
Out of the box, WordPress sends from [email protected] (where yourhost.com is your hosting provider’s server hostname — not your real domain). When Gmail or Outlook receive this message, they check whether your hosting provider is authorized to send mail for that domain. It usually isn’t. SPF check fails. Message goes to spam.
2. There’s no DKIM signature
Modern mail servers expect every legitimate email to be cryptographically signed with DKIM. PHP’s default mail() function doesn’t sign anything. Even if SPF passes, the lack of DKIM signature is a strong spam signal to Gmail and Outlook.
3. DMARC alignment is impossible
Even if you manually set the From address to your real domain, the underlying sending IP is your shared hosting server — which has zero relationship with your domain. DMARC checks fail. Gmail silently drops the message.
The shared-host nightmare
Diagnose your WordPress delivery problem
Run these four checks in order:
1. Submit your contact form, password reset, or test order
Use a Gmail address you control. Wait 5 minutes. Check inbox AND spam folder. If it’s in spam, you have an SPF/DKIM/DMARC problem. If it’s missing entirely, you have a delivery problem.
2. Check your site’s mail log
Most WordPress sites don’t log outbound mail by default. If you have any SMTP / mail plugin installed (WP Mail SMTP, FluentSMTP, SecureSMTP), check its log for the recent send. Status should be “Delivered.” If status is “Failed,” the message never left your server.
3. Run a mail-tester.com diagnostic
Go to mail-tester.com (free, no signup). Send a test message from your WordPress site to the address they give you. Read the report. A score below 7/10 explains the problem.
4. Check the “From” address being used
Send yourself a test email and inspect the headers. Look for theFrom: line. If it says [email protected] instead of your real domain, that’s your problem in one line.
Three ways to fix WordPress email
Option 1: Configure SPF + DKIM manually (free, complex)
You can configure your hosting provider’s mail server to send from your real domain with proper SPF/DKIM/DMARC. This usually requires support tickets to your host, DNS record changes, and constant babysitting when records expire or get reset.
Pros: Free.
Cons: Most shared hosts don’t let you do this. Even on managed hosts, you’ll spend 4–8 hours setting it up and another 1–2 hours per month maintaining it. And it only fixes one site.
Option 2: Install an SMTP plugin + sign up for a mail service
Install WP Mail SMTP or FluentSMTP, then sign up for SendGrid / Mailgun / Brevo / SES, configure DKIM on the mail service side, paste credentials into the SMTP plugin, watch for quota errors and reputation problems.
Pros: Works reasonably well.
Cons: Two services to manage (the SMTP plugin and the mail provider). DKIM setup is non-trivial. Each provider has different quota tiers, billing, and dashboards. Total setup time: 2–4 hours for someone who’s done it before; a full afternoon for first-timers.
Option 3: Install the SecureSMTP plugin (recommended)
One plugin. One signup. Done. SecureSMTP combines the SMTP routing layer and the authenticated mail service in a single workflow — no third-party SMTP provider to configure, and only one DNS record to add for your sending domain.
Recommended: SecureSMTP plugin setup
- Sign up free at securessmtp.com/signup — 5,000 emails/month included, no card required.
- Dashboard → Forms → Sites → + Add Site. Copy the site’s API key from the last step. It is shown only once.
- WordPress Admin → Plugins → Add New Plugin → Upload Plugin → upload the SecureSMTP plugin .zip → Install Now → Activate.
- In wp-admin open SecureSMTP → Settings, paste the key into API Key and click Save and test connection. You should see “Connection OK”.
- Under Email Delivery, tick Route outgoing email through SecureSMTP and save. Until you tick it, WordPress keeps sending with its own mailer.
- Click Save and send test email to send yourself a test.
From then on, every email your site sends with wp_mail() (contact form notifications, password resets, WooCommerce order emails, comment notifications) goes through SecureSMTP and is signed with DKIM. New accounts send from their own verified sending domain (below). Older accounts can keep using [email protected] for a limited time, with your sender name, and the original From address becomes the Reply-To.
Send from your own domain
Verify it’s working
- Run mail-tester.com again. Score should jump to 9+/10.
- Send yourself a test order or form submission. It should arrive in the inbox within a minute.
- Check the plugin Mail Log. The email is listed with status Sent. The Email log in your SecureSMTP dashboard shows whether it was delivered, and opens if tracking is on.
- Check Gmail’s “Show original” on the test email. DKIM should pass. DMARC passes for your own domain once you send from a verified sending domain.
wp_mail() vs SMTP plugins vs SecureSMTP
| Feature | wp_mail() default | WP Mail SMTP + SendGrid | SecureSMTP plugin |
|---|---|---|---|
| Setup time | 0 min | 2–4 hours | A few minutes + DNS time |
| DKIM signing | No | Manual config | Automatic |
| Mail log | No | Limited | Full per-plugin breakdown |
| Spam classifier | No | No | AI scoring on every send |
| Hosted forms | No | No | Yes |
| Webhook events | No | No | Real-time |
| Cost | Free (broken) | $0–$15/mo | Free / $7/mo |
| Services to manage | 0 | 2 | 1 |
Frequently asked questions
Does this work on any WordPress host (managed, shared, VPS)?+
Yes. The plugin sends mail to the SecureSMTP API over HTTPS, so your host’s PHP mail() function and outgoing SMTP ports are not used. It works the same on shared, managed and VPS hosting, as long as the site can make outgoing HTTPS requests. It needs WordPress 6.0+ and PHP 8.0+.
What about WP Mail SMTP, FluentSMTP, and other SMTP plugins?+
WP Mail SMTP and FluentSMTP connect WordPress to a mail service you sign up for separately. You can point them at our SMTP settings (host smtp.securessmtp.com, port 587, username securessmtp, your site API key as the password). Or use the SecureSMTP plugin instead, which sends over our API and also shows hosted forms. Use one mail plugin, not two.
Will my WooCommerce / Gravity Forms / WPForms emails work too?+
Yes. Once Email Delivery is on, the plugin handles every wp_mail() call: WooCommerce order emails, Gravity Forms / WPForms / Forminator / Contact Form 7 / Elementor Forms notifications, password resets and comment notifications. No per-plugin setup. Emails that a plugin sends some other way (not with wp_mail()) are not affected.
What if the plugin or SecureSMTP API has an outage?+
If the API returns an error or cannot be reached, or the monthly limit is used up, the plugin sends that email with WordPress’s own mailer instead, so it still goes out (through the old path). The Mail Log marks it as “Fell back: API error”, so you can see it happened.
Do I need to set up SPF, DKIM, and DMARC records myself?+
New accounts send only from their own verified domain, so add a sending domain in the dashboard (any plan, including Free) and publish one DKIM TXT record; the advanced setup adds two more records so SPF aligns too. Until it is verified you can send test emails to yourself. Older accounts can keep using [email protected] for a limited time, with your sender name and the original From address as the Reply-To.
How is this different from just adding DKIM to my domain?+
DKIM only helps if WordPress's mail server is also allowed to sign for your domain. Most shared hosts don't expose DKIM configuration at the PHP mail() layer, so even if you add DKIM records, your wp_mail() emails won't be signed correctly. SecureSMTP signs every email with DKIM: as send.securessmtp.com in relay mode, or as your domain once you verify a sending domain. That works no matter how your host is set up.
Can I see which plugin/form sent which email?+
Yes. SecureSMTP → Mail Log in wp-admin lists every wp_mail() call with the source plugin, recipient, subject, status (sent, failed or queued) and time, and you can filter by source and status. Delivery results (delivered, bounced, opened) are in the Email log in your SecureSMTP dashboard, across all your sites.
Ready to fix it?
Related guides
Contact form not sending email? Why it happens and how to fix it
The five places a form email can fail, and a ten-minute check to find yours.
Why your form must not send “From” the visitor’s email
Send from your domain, reply to the visitor. Settings for each form plugin.
Contact form emails not reaching Gmail or Google Workspace
Find the email, read Gmail’s SPF/DKIM/DMARC verdict, fix the cause.
Contact form emails not reaching Outlook or Microsoft 365
Junk, quarantine, message trace and the 550 5.7.515 rejection.