Muhammad Basim
WordPress

Contact Form Notifications Not Arriving: Every Cause

By Muhammad Basim·

Here's the version of this problem that costs the most: it's been happening for months and you don't know.

The form says "thank you." The visitor believes they've reached you. You believe nobody's been in touch. There's no error, no bounce, no alert — just an absence, and absences are invisible.

Most of the time there's one specific cause, and it's a setting almost everyone gets wrong for entirely sensible reasons.

The short version

The most common cause: your form's From address is set to the visitor's email address.

That means your server sends mail claiming to be from [email protected] — which is exactly the forgery pattern SPF and DMARC exist to stop. Gmail publishes a policy, your server isn't authorised to send as Gmail, and the message fails.

The fix: From should be your own domain. Put the visitor's address in Reply-To.

Five other causes follow.

Cause 1 — The From-address mistake

Form plugins encourage this. Contact Form 7's default template historically used [your-email] in the From field, and it seems obviously right — you want the email to look like it came from the person who wrote to you.

Why it fails: you're asking your web server to send mail as @gmail.com, @outlook.com, or @somecompany.com. None of those domains authorise your server in their SPF records. Gmail, Yahoo, and Microsoft all publish DMARC policies. The message fails authentication and gets rejected or filtered.

The correct configuration:

From:     Website Form <[email protected]>
Reply-To: [your-email]
Subject:  New enquiry from [your-name]

You get the same convenience — hitting reply goes to the visitor — without forging anything.

Where to change it:

Contact Form 7: the Mail tab, "From" field.
WPForms: Settings → Notifications → "From Email."
Gravity Forms: the notification's "From Email."
Fluent Forms: the notification settings.

If your From field contains a form tag pulling the visitor's address, that's your problem.

Cause 2 — PHP mail

Even with a correct From address, WordPress's default sending method fails.

wp_mail() uses PHP's mail(), which sends unauthenticated mail from your web server. Since 2024, providers require authentication, and plenty of hosts block PHP mail entirely — so your form reports success while nothing leaves.

The fix: route mail through a transactional service via SMTP. Step by step.

Cause 3 — It's arriving in your spam folder

Worth ruling out before assuming a sending failure, and easy to miss when notifications come from your own domain to your own inbox.

Check spam and junk. Also check any filters you've set — a rule sending anything containing "enquiry" to a folder you never open is a real and common cause.

If it's in spam: mark it as not spam, add the From address to your contacts, and fix the authentication so it stops happening.

Cause 4 — The recipient address is wrong

Sounds trivial, catches people regularly.

Check the "To" field in your form's notification settings. Common failures: a typo, an address from a previous role, a shared inbox that was decommissioned, or a forwarding rule that broke during an email migration.

Test by sending to a completely different address — a personal Gmail — to establish whether the problem is sending or receiving.

Cause 5 — Your host is blocking or throttling

Some hosts block PHP mail. Some rate-limit outbound mail. Some block SMTP ports.

The tell: everything is configured correctly and mail still doesn't leave, with no error.

How to check: install an email logging plugin. If the log shows the message as sent but the recipient has nothing anywhere, the mail isn't leaving the server.

The fix: SMTP through an external service via API where possible, which sidesteps port blocking entirely.

Cause 6 — A plugin conflict

Less common, and worth checking when nothing else explains it.

Caching plugins can interfere with form submission. Security plugins sometimes block form POST requests as suspected spam. Two form plugins running simultaneously can conflict. An optimisation plugin deferring JavaScript can break the form's submit handler.

How to check safely: use Health Check & Troubleshooting, which disables plugins for your session only — so you can test on a live site without visitors noticing. The method.

Testing properly

Work down until something fails.

1. Check the current From address. If it's a form tag pulling the visitor's email, stop here and fix it.

2. Submit the form yourself and check inbox, spam, and any filtered folders.

3. Submit with a different recipient address — send the notification to a personal Gmail temporarily. If it arrives there but not at your business address, it's a receiving problem.

4. Check your email log. Sent but not received means it isn't leaving the server. Not logged at all means the form isn't triggering wp_mail().

5. Test with plugins disabled via troubleshooting mode.

The safety net worth building

Even with everything working, don't rely on email as the only record of a form submission.

Email is a delivery mechanism that can fail — a filter changes, a mailbox fills, a DNS record breaks. If a lead exists only as an email that didn't arrive, it's gone.

Store submissions in the database. Most form plugins do this by default; some don't. Check yours, and turn it on if it isn't.

Then you have a record regardless. If email breaks for a fortnight, you can go back and see what came in — which is the difference between a technical annoyance and lost business.

Also consider: a second notification to a different address at a different provider, or pushing submissions to a CRM or a spreadsheet.

Frequently asked questions

Why does the form say sent but nothing arrives?
The success message confirms the form processed the submission, not that the email was delivered. Most form plugins show it as soon as wp_mail() returns without an error — and wp_mail() returns success when it hands the message off, even if the host blocks the actual sending or the receiving provider rejects it. Install an email logging plugin to see whether the message was genuinely attempted and what happened to it.

Should the From address be the visitor's?
No, and this is the single most common cause of form notifications failing. Setting From to the visitor's address means your server sends mail claiming to be from Gmail, Outlook, or their company domain — none of which authorise your server, and all of which publish DMARC policies. It fails authentication. Set From to your own domain and put the visitor's address in Reply-To, which gives you the same convenience without forging anything.

How do I log form submissions?
Most form plugins store submissions in the database by default — Gravity Forms, WPForms, and Fluent Forms all have an entries view. Contact Form 7 doesn't, and needs an add-on like Flamingo. Turn database storage on regardless of whether your email is working, because email is a delivery mechanism that can fail silently, and a lead that exists only as an undelivered email is a lost lead.

What to do next

Open your form's notification settings and look at the From field.

If it contains a form tag pulling the visitor's email address, you've found it — and that's a two-minute fix that resolves this for most sites.

While you're there, confirm your form is storing submissions in the database. Even with email working perfectly, that's the safety net that means a delivery problem costs you an afternoon rather than a month of leads.

Free: The 60-Minute Email Authentication Fix.


Related guides

Join the Newsletter

Get practical marketing tactics delivered straight to your inbox.

Muhammad Basim

Written by

Muhammad Basim

Related Articles

Newsletter

Free: The 60-Minute
Email Authentication Fix

A no-fluff checklist from the Deliverability Playbook. In one hour: set up SPF, DKIM & DMARC correctly, check your domain against blocklists, and pass Gmail & Yahoo's 2026 sender requirements.

No spam — that would be ironic. Unsubscribe anytime.