The contact form says "message sent" but nothing arrives
This is a different problem from WooCommerce order emails: here it’s a contact or quote form (Contact Form 7, WPForms, Gravity Forms...) showing a success confirmation to the visitor, while the email never actually leaves the server. The confirmation shows client-side regardless of whether the send actually succeeded server-side, which makes this more deceptive than a plain lost email.
How I go about it
-
Reproducing and checking the network
I send a test and check the browser’s network tools to see whether the submit request actually reaches the server, or gets blocked before it’s even sent.
-
Checking reCAPTCHA or hCaptcha
I check that the site key and secret key actually match, and that there’s no mismatch between the domain configured with the provider and the site’s real domain.
-
Testing the server-side send
I test wp_mail() directly to find out whether the block comes from the send function itself, often limited by PHP’s mail(), or an earlier step on the form side.
-
Looking for a JavaScript conflict
If the request never leaves, I look for a plugin breaking the form’s Ajax submit handler, often another plugin loading a duplicate or conflicting script.
-
Setting up an authenticated SMTP relay
If the block is on the send side, I configure an authenticated SMTP relay via the phpmailer_init hook, more reliable than the server’s native mail() function.
What I handle regularly
- The "your message has been sent" confirmation shows, but nothing ever arrives in the inbox
- The form seems to work, but no trace of the submission shows up anywhere
- The submit button stays stuck or doesn’t react at all to a click
- The form used to work fine, then stopped sending with no setting changed
- Some messages arrive, others don’t, with no obvious pattern
Why the confirmation sometimes lies
A contact form relies on the same weak point as transactional email: wp_mail() defaults to PHP’s mail() function, often poorly regarded by receiving mail servers. But here the trap is more deceptive, because the plugin shows a client-side success message as soon as the JavaScript runs, without waiting for reliable confirmation that the server-side send actually went through.
A misconfigured reCAPTCHA or hCaptcha key, site key and secret key swapped, or a domain mismatch, can silently block the submission itself: the visitor sees no error and no visible blocking. A JavaScript conflict caused by another plugin can also break the form’s Ajax submit handler, which looks like it "works" while never sending anything to the server.
Related pages
Describe your need in one minute
A few targeted questions so I can reply with an estimate rather than another questionnaire.