The worst faults on a WordPress site are the ones that report success. A visitor fills in your contact form, sees a confirmation message, and assumes you will be in touch. The plugin logs the submission as sent. Nothing appears in your inbox, and because nothing appears, nothing prompts you to look. Enquiry loss of this kind runs for months on a surprising number of sites and only surfaces when a customer phones to ask why nobody replied. It is one of the specific things a WordPress Maintenance Service should be testing monthly, precisely because no alert will ever tell you about it.
WordPress sends mail badly by default
Out of the box, WordPress hands messages to the server's PHP mail function. That was reasonable fifteen years ago. Today it produces mail with no authentication, sent from an IP address shared with whoever else is on that server, with a from address that frequently does not match your domain. Receiving servers treat that profile as suspicious for good reason. Some reject it outright, some file it as spam, and some accept it and quietly discard it, which is the worst outcome because your site records a success.
Authentication is the actual fix
Delivery is not a WordPress problem so much as a domain configuration problem. Three records do most of the work. SPF declares which servers are permitted to send for your domain. DKIM signs the message so the receiver can verify it was not altered. DMARC tells receivers what to do when the first two fail, and lets you receive reports on what is being sent in your name. Routing your site's mail through a dedicated sending service such as your existing mailbox provider or a transactional mail service, then configuring these records properly, resolves the overwhelming majority of delivery failures.
The form plugin is usually innocent
People change form plugins hoping it will fix delivery, which almost never works because the plugin is not the part that failed. The form collected the data correctly and handed it off correctly. What happened after the handoff is between your server and the recipient's mail provider. Before replacing anything, check whether the submission was stored in the database. Most form plugins can log entries locally, and enabling that is worth doing regardless, because it turns a lost enquiry into a delayed one.
What usually triggers it
Delivery rarely breaks on its own. It breaks after a change nearby: a host migration to a new IP, a switch to a different mail provider, an SPF record edited for a marketing tool that overwrote the previous entry, a certificate or API key expiring on an SMTP plugin, or a domain transfer that dropped DNS records nobody had documented. None of these produce an error on your site.
Order emails fail the same way
If you run a store, this matters more. Order confirmations, password resets and shipping notifications travel the same path as your contact form. A customer who pays and receives no confirmation assumes the transaction failed. That produces a support ticket, sometimes a duplicate order, and occasionally a chargeback. The cost of silent mail failure on a store is considerably higher than a missed enquiry, and it is equally invisible from the admin dashboard.
Test it deliberately and repeatedly
A single test to your own inbox proves almost nothing, because your own provider is likely to be lenient with mail from your own domain. Send to at least three different providers, check the spam folder in each, and look at the message headers to confirm authentication passed rather than assuming it did because the message arrived. Doing this once after setup is not enough either, since the DNS and provider changes that break it happen throughout the year. Building the check into routine WordPress Maintenance alongside updates is what catches a break in week two rather than month five.
The order to work through
Confirm the submission was stored. Check whether the message left the server at all. Verify SPF, DKIM and DMARC for the sending domain. Move away from PHP mail to authenticated SMTP. Set the from address to something on your own domain. Then enable local form logging and a failure notification so the next break announces itself.
A form that quietly discards enquiries is worse than no form at all, because at least a missing form does not promise anything.

Top comments (0)