The worst website failure is the silent one: the contact form looks fine, says "Thanks, we’ll be in touch," and delivers nothing. Businesses discover it weeks later, usually when a customer mentions "I tried your form," after a month of leads evaporating. If your WordPress contact form is not sending emails, here’s why WordPress email breaks, why it breaks silently, and the fix that ends it permanently.
A broken contact form doesn’t look broken. It looks like a quiet month, right up until you learn it wasn’t quiet.

Why WordPress email is fragile by design
Out of the box, WordPress sends mail through PHP’s mail() function: the server just flings the message into the world with no authentication, no delivery confirmation, and no error reporting. To Gmail and Outlook, a message from a random shared server claiming to be from your domain looks exactly like spam, because that’s precisely how spam is sent.
Sometimes it lands in inboxes, sometimes in junk, sometimes nowhere, and WordPress reports success in every case, because "success" only means the server accepted the handoff. Every form plugin hands its message to the same wp_mail function, so changing form plugins rarely helps. The weak link is the delivery route, not the form.
Why it breaks after working fine
The frustrating pattern ("it worked for two years!") has mundane triggers. Your host migrates you to a new server with a worse IP reputation. Another site on your shared server gets flagged for spam, poisoning the shared IP. Gmail and Microsoft tighten authentication rules (the 2024-era requirements made unauthenticated mail dramatically less deliverable). Or your domain’s DNS records changed during some unrelated update and the fragile arrangement collapsed. Nothing on your site changed; the world around the shortcut did.
The shared IP problem has the same root as slow budget hosting: you share one server with neighbours you never chose. If your site is also slow to respond, my guide on how to reduce TTFB on cheap shared hosting deals with that side.
The real fix: authenticated SMTP
Stop sending mail like spam and start sending it like mail. An SMTP plugin routes your form messages through a real, authenticated mail service, your business email account or a transactional provider, so receiving servers see verified, reputation-backed mail instead of anonymous server output.
Setup is a plugin (WP Mail SMTP and its peers), your mail service’s credentials, and one test send. Pair it with correct SPF and DKIM records on your domain, your mail provider lists the exact DNS entries, and deliverability problems drop to near zero.
The setup, step by step
- Choose the sending account: your business mailbox on Google Workspace or Microsoft 365, or a transactional email service.
- Install one SMTP plugin and enter the server details or API connection your provider gives you.
- Set the From address to a real address on your own domain, such as
website@yourdomain.com. - Add the SPF and DKIM records your provider lists, and a DMARC record once those pass.
- Send a test to a Gmail address, open it, and use "Show original" to confirm SPF, DKIM and DMARC all say PASS.
Mistakes that keep forms failing after SMTP
- Using the visitor’s address as the From address. Your server is not allowed to send as their Gmail account, so receiving servers reject or junk it. Put the visitor’s address in Reply-To instead, and replies still go to them.
- Two SPF records. A domain may have only one. Adding a second for the new provider breaks both, so merge them into a single record.
- A changed mailbox password. If the plugin logs in with a password and someone changes it, sending stops. An app password or API key avoids this.

Belt and suspenders: never rely on email alone
Even fixed pipelines deserve a backup, because leads are too expensive to trust to one channel:
Store every submission in the database
Most form plugins can save entries in the WordPress admin. Even if an email vanishes, the lead exists somewhere you can see.
Test the form monthly
A real submission through the live form, confirmed received, thirty seconds that catches silent failures within days instead of months. It’s a standing item on my maintenance checklist for exactly this reason.
Add a notification fallback
A second recipient address, or a WhatsApp/SMS ping on submission, means one broken channel never equals zero notice.
If your form is not sending right now
Check the form plugin’s stored entries first: the leads are probably sitting there, recoverable. Send a test to a Gmail address and check the spam folder; if it’s landing in junk, SMTP plus SPF/DKIM is your fix. If nothing arrives anywhere, your host may be blocking mail functions entirely: five minutes with their support confirms it, and authenticated SMTP bypasses the block anyway.
An hour of setup ends the whole category of failure, cheap insurance for the form your entire website funnels into. If you’d rather not touch DNS records yourself, you can hire a WordPress developer to set up SMTP, authentication and a monthly test in one go.
Once the emails arrive
Delivery is half the job. The other half is whether people fill the form in at all. If submissions are rare even when everything works, read why visitors don’t fill out your contact form.
One more thing worth checking while you are in the form settings: many form plugins load their styles and scripts on every page, not only the page with the form. That adds weight across the whole site. Loading those files only where the form appears is the same idea I describe in stopping render-blocking CSS in WordPress.




