WordPress Contact Form Not Sending Email: A Working Fix
Separate a form that never submits from a form that submits and loses the notification, then fix the layer that is actually failing in Contact Form 7, Elementor, WPForms or Ninja Forms.
Quick fix: enable submission storage in your form plugin, then submit a test. If the entry is saved but no email arrives, the form works and the problem is mail delivery. If nothing is saved, the form is failing before it sends and the cause is validation, JavaScript or a conflict.
That single test splits the problem in half and prevents hours of reconfiguring the wrong thing.
Step 1: does the submission reach WordPress?
Every major form plugin can log entries in the database — Contact Form 7 needs an add-on such as Flamingo, while WPForms, Gravity Forms and Ninja Forms store entries by default. Elementor Pro records submissions under Elementor → Submissions.
Turn storage on and submit a test.
| Result | Where the problem is |
|---|---|
| Entry saved, no email | Mail delivery — go to step 3 |
| No entry, no error shown | JavaScript or AJAX failure — step 2 |
| No entry, validation error shown | Required field, captcha or spam rule — step 2 |
| Entry saved, email in spam | Authentication and From address — step 4 |
Step 2: fix a form that never submits
Open the browser console on the form page and submit again. A JavaScript error usually names the culprit file — commonly a second copy of jQuery, an optimisation plugin combining scripts incorrectly, or a caching layer serving a stale nonce.
Work through these in order:
- Disable JavaScript minification and combination in your performance plugin, then purge the cache. Combined scripts break form plugins more often than any other optimisation.
- Exclude the form page from full-page caching. A cached nonce expires and submissions are rejected as invalid.
- Test with the default theme active, then with only the form plugin enabled, to isolate a conflict. Do this on staging rather than the live site where possible.
- Check the captcha. Wrong reCAPTCHA keys, or a v3 score threshold set too high, block real visitors without a visible message.
- Confirm the REST API is reachable. Security plugins that block
/wp-json/break block-based and Elementor forms.
If a plugin conflict is likely and you cannot reach the admin, see how to disable plugins without admin access.
Step 3: fix the notification settings
Open the form's email settings and check each field.
- To — a real mailbox you can read. A typo here is the single most common cause.
- From — an address on the site's own domain. Never the visitor's address.
- Reply-To — the visitor's email field, so replying works normally.
- Subject — must not be empty; some transports reject empty-subject mail.
- Message body — must contain at least one field tag, or the plugin may treat it as incomplete.
In Contact Form 7 the Mail tab shows a warning icon next to fields it considers unsafe. Do not ignore it: CF7 refuses to send when the From address does not match the site domain.
Step 4: fix delivery
If entries are saved and the settings are right, the message is being created and then lost. This is a site-wide mail problem rather than a form problem — confirm it by requesting a password reset. If that email is also missing, follow the full diagnosis in WordPress not sending emails.
The short version:
- configure authenticated SMTP instead of PHP
mail(); - publish SPF and DKIM records for the sending domain;
- send from an address that exists as a real mailbox;
- check the sending service log to see whether the message was accepted, bounced or suppressed.
Provider-specific notes
Contact Form 7. Install Flamingo before debugging so you never lose a submission. CF7 reports mail failure with a red border and a message under the form; check debug.log for the underlying PHPMailer error.
Elementor Pro forms. The Email action runs after every other action in the list. If an earlier action — a webhook or a CRM integration — throws an error, the email step may never run. Remove other actions and test with Email alone.
Ninja Forms and WPForms. Both have an email log or debug mode in their settings. Enable it before assuming the transport is at fault.
WooCommerce order emails. These are separate from contact forms and have their own on/off switches under WooCommerce → Settings → Emails.
Verify the fix
Submit a real test from a phone on mobile data, not from the browser you have been debugging in with caches disabled. Confirm:
- the entry appears in the plugin's submission list;
- the notification lands in the inbox, not spam;
- pressing reply addresses the visitor, not your own site;
- the confirmation message to the visitor also arrives, if you send one.
Leave submission storage enabled permanently. It costs nothing and it means a lost notification never means a lost enquiry.
Frequently asked
- The success message only confirms the submission was processed. The notification failed afterwards, usually because the From address is not on your domain or the site has no authenticated SMTP configured.
- No. Put your own domain in the From field and the visitor's address in Reply-To. A message claiming to be from a Gmail address but sent by your server fails authentication checks.
- A misconfigured key pair makes validation fail silently, so the form never reaches the send step. Remove the captcha temporarily; if submissions resume, the keys or the domain allowlist are wrong.