Skip to content

WordPress contact form not sending email

Almost every WordPress form plugin ultimately calls wp_mail(), which falls back to PHP's mail() function. That path is unauthenticated, frequently unconfigured, and increasingly rejected outright by Gmail and Microsoft 365.

Check your site now

See whether a visitor can actually complete your form today.

Free · No signup · We never submit your form

Why this happens

01

wp_mail() falling back to PHP mail()

Without an SMTP plugin, WordPress hands the message to the server's local mail transfer agent. Many managed hosts either do not run one or block port 25 entirely, so the send fails after WordPress has already reported success.

02

The From address fails SPF or DMARC

If mail claims to come from your domain but leaves through a server your SPF record does not authorise, Gmail and Microsoft 365 will reject or quarantine it. Since Google and Yahoo tightened bulk sender rules, this rejects far more than it used to.

03

A security or caching plugin intercepting the request

Firewall plugins sometimes block the admin-ajax or REST endpoint the form posts to, particularly for visitors on shared or mobile IP ranges.

04

Anti-spam discarding genuine submissions

Akismet and similar tools can silently bin real enquiries. The submission looks successful to the visitor and never reaches your inbox.

How to check it yourself

  1. 01Install an SMTP plugin and send a test message from its own diagnostic tool.
  2. 02Confirm the From address uses your domain, not the visitor's address.
  3. 03Check your SPF record authorises whatever server actually sends the mail.
  4. 04Temporarily disable security and caching plugins and resubmit.
  5. 05Look for stored entries in the plugin's own database table — entries saved but no email means the failure is delivery, not the form.

The part you cannot check once

Fixing it is the easy half. Knowing it stays fixed is the hard half.

Every cause above can come back without anyone touching the page. API keys rotate, plugins update, DNS records get edited, licences lapse. The form still renders, still accepts the enquiry, still says thank you — and nothing arrives.

FormWatcher submits an identifiable test enquiry on a schedule and confirms it actually reaches your inbox. If delivery stops, you hear about it — rather than working it out from a quiet month.

FormWatcher recognises WordPress automatically

Common questions

Why does the form say it worked when nothing arrives?
A form can accept the enquiry, show a thank-you page, and still deliver nothing. Every signal a visitor can see says it worked. WordPress reports success as soon as wp_mail() hands the message over, long before any receiving server has accepted it.
Does an SMTP plugin fix this permanently?
It fixes the usual cause, but not for good. API keys are rotated, app passwords are revoked when someone turns on two-factor authentication, and DNS records get edited. Delivery can stop again without anything on the page changing.
How do I know if it breaks again?
Only by checking that a real submission still arrives. FormWatcher submits an identifiable test enquiry on a schedule and alerts you when it stops being delivered.

Related problems

All form delivery problems →