Home/Blog/WordPress Fixes
WordPress Fixes

Contact Form 7 Not Working? Fix Emails & Errors (2026)

By Christy Sparks
Published Jun 28, 2026
Updated Oct 12, 2026
15 min read

Your Contact Form 7 form stopped working. Maybe you get a red "There was an error trying to send your message" box. Maybe the form says it worked but nothing lands in your inbox. Maybe the little spinner just turns forever. Every one of those means lost customers, so you want it fixed today.

The good news: Contact Form 7 itself almost never breaks. It has more than 10 million active installs and a long track record. In our experience the cause is nearly always one of three things around it: email delivery, something blocking the form’s background request, or the message being treated as spam. This guide helps you work out which one in about two minutes, then fix it. To make sure we gave you accurate information, we built a test site, broke it on purpose in each of these ways, and captured the real screens and error messages.

TL;DR

  • Contact Form 7 rarely breaks. Nearly every complaint is email delivery, a blocked background request, or a spam verdict.
  • Fastest check: install Flamingo (free, from the same authors) and send a test. If the message appears in Flamingo, the form works and your email delivery is the problem. Fix it with SMTP and a From address on your own domain.
  • One surprise: Contact Form 7’s default "There was an error trying to send your message" text is used for both a failed email and a spam verdict, so the same message can mean two different problems.
  • Short on time? Hire us today. A Contact Form 7 fix is typically our $129 Plugin Fix Basic.

Request a Plugin Fix →

Start here: match what you see

What you seeMost likely causeGo to
Form says "Thank you… sent" but no email arrivesEmail delivery, a wrong To address, or demo mode left onFix 1, 2, 3, 6
"There was an error trying to send your message. Please try again later."The email failed to send, or the message was flagged as spamFix 1, 4
The spinner never stops and nothing happensThe background request is blocked, or a script errorFix 5
"One or more fields have an error"Validation, reCAPTCHA keys, or a cached pageFix 6
"Error: Contact form not found."The shortcode points at a form that no longer existsFix 7
It broke right after an updateA plugin conflict or a version requirementFix 8

First, find out whether the form or your email is failing

Out of the box, Contact Form 7 emails each submission and keeps no copy. Its own documentation says that by default it does not write any user personal data to the database. That means a failed email is a lost lead, and it also makes troubleshooting a guessing game.

Install Flamingo, a free plugin from Contact Form 7’s authors, then send yourself a test message. Flamingo saves every submission to your WordPress database. Here is what we saw when we reproduced the problem on a test site whose email was broken. The visitor sees an error:

Contact Form 7 form on a WordPress page showing a red box reading There was an error trying to send your message. Please try again later.
The visitor-facing error after clicking Submit on our broken test site. (Click to enlarge.)

But the message was received and saved, in Flamingo’s Inbound Messages screen:

Flamingo Inbound Messages screen in WordPress listing a message from Dana Whitfield received through Contact Form 7
Flamingo recorded the message even though the email failed. The form works and the email is the problem. (Click to enlarge.)

Use that to narrow it down:

  • The test message is in Flamingo’s Inbox: the form works and the email is failing. Go to Fix 1
  • It is in Flamingo’s Spam tab: Contact Form 7 judged it to be spam. Go to Fix 4
  • It is not in Flamingo and the form spins: the submission never reached the server. Go to Fix 5
  • It is not in Flamingo and you see field errors: go to Fix 6

Flamingo stores names and email addresses, so mention it in your privacy policy, and delete old messages you do not need. Even if your form is fine today, installing it now means you will never lose an enquiry to a silent email failure again.

Fix 1: Send mail through SMTP instead of your server’s mail function

By default WordPress passes the email to a basic mail function on your web server. That message is unauthenticated, often comes from a shared server address that other sites have already damaged, and many hosts throttle or block it. When it fails, the visitor sees an error. When it "succeeds," the receiving mail provider may still silently discard it.

To see what is really happening, make WordPress write mail failures to its debug log. Add this small snippet as a file at wp-content/mu-plugins/log-mail-failures.php (create the folder if it does not exist), or paste it into a code snippets plugin, with WP_DEBUG_LOG turned on as shown in our debug log guide:

<?php
add_action( 'wp_mail_failed', function ( $error ) {
	error_log( 'wp_mail failed: ' . $error->get_error_message() );
} );

After one failed submission on our test site, wp-content/debug.log contained:

wp_mail failed: Could not instantiate mail function.

That message means the server could not hand the email off at all. Your log may show something different, such as an authentication or connection error, and any of them points to the same cure: stop relying on the server’s mail function and send through a proper mail service.

The simplest route is the free WP Mail SMTP plugin. Choose a mailer that matches the email you already have: Google or Microsoft if you use Google Workspace or Microsoft 365, or a transactional email service such as SendGrid, Brevo, Mailgun, Postmark, or Resend. The "Other SMTP" option works with any standard SMTP server. Avoid putting a personal account password into any plugin, and prefer the OAuth sign-in options the Google and Microsoft mailers offer.

WP Mail SMTP settings screen showing the From Email field, the Force From Email switch, and the grid of mailer choices
WP Mail SMTP’s main settings: a From Email on your own domain, and the mailer choice. After you pick one, the screen asks for the details your provider gives you. (Click to enlarge.)

Save, then open WP Mail SMTP → Tools → Email Test and send a test message. When we did, the form went from an error to a success. The same Contact Form 7 form now reads:

Contact Form 7 green success message reading Thank you for your message. It has been sent.
The same form after routing mail through SMTP. (Click to enlarge.)

Fix 2: Use a From address on your own domain

This is the single most common setting mistake we see. Open Contact → Contact Forms, edit the form, and look at the Mail tab. The From field must be an address on your site’s domain, such as wordpress@yourdomain.com. If you put a Gmail, Yahoo, or Outlook address there, mail providers see a message claiming to be from their domain but sent by your server, which is exactly what spoofing looks like, and they reject it or send it to junk.

Contact Form 7 even warns you about it. This is what we got when we typed a Gmail address into the From field:

Contact Form 7 Mail tab showing a red From field with the warning Sender email address does not belong to the site domain
Contact Form 7’s own warning: "Sender email address does not belong to the site domain." (Click to enlarge.)

The fix is to use an address on your domain in From, and let the visitor’s address ride in a Reply-To header so you can still reply to them in one click. The default Additional headers field already does this with Reply-To: [your-email]. After the fix the warning is gone:

Contact Form 7 Mail tab with the From field set to an address on the site domain and no configuration warning
From set to an address on the site domain. No warning. (Click to enlarge.)

We checked what actually arrives. These are the headers of the email our test site sent after the fix:

From: "Example Plumbing Co." <wordpress@example-plumbing.test>
Reply-To: dana@example.org
Subject: Example Plumbing Co. "Water heater quote"

While you are on the Mail tab, check the To field. The default [_site_admin_email] sends to the Administration Email Address in Settings → General, which may be an old address or a mailbox nobody reads. Put a real inbox in there and test it.

Fix 3: Set up SPF, DKIM, and DMARC for your domain

These three DNS records are how receiving mail servers decide whether to trust a message that claims to come from your domain:

  • SPF lists the servers allowed to send mail for your domain
  • DKIM adds a digital signature to each message so the receiver can verify it was not altered
  • DMARC tells receivers what to do when SPF or DKIM checks fail, and where to send reports

You add them at whoever hosts your domain’s DNS, using values supplied by your email or SMTP provider. Since 2024, Google and Yahoo have required authentication for bulk senders (those sending more than 5,000 messages a day). A small contact form is not a bulk sender, but authenticated mail lands in inboxes far more reliably, so it is worth the ten minutes.

WP Mail SMTP’s test email reports on this. On our fake test domain, which has no DNS records, it flagged the problem straight away:

WP Mail SMTP email test result showing Domain Check Results with a failed SPF check and a recommended DMARC record
WP Mail SMTP’s domain check. Our test domain has no records, so SPF fails and DMARC is flagged. A properly set up domain shows these as passing. (Click to enlarge.)

You can also send a test message to a Gmail address, open it, choose Show original from the three-dot menu, and read the SPF, DKIM, and DMARC lines at the top. You want all three to say PASS.

Not sure what you are looking at?

Mail settings, DNS records, and plugin conflicts are not something every business owner should have to debug. We diagnose and fix Contact Form 7 problems every week and tell you the price before we start.

Request a Plugin Fix →

Fix 4: Check whether your message is being treated as spam

Here is the part most guides miss. In Contact Form 7’s source, the default message for a failed email and the default message for a spam verdict are word for word the same: "There was an error trying to send your message. Please try again later." So the red box alone cannot tell you which problem you have.

Contact Form 7 can flag spam through several checks: the Akismet integration, reCAPTCHA or Cloudflare Turnstile scoring, and a check against WordPress’s own disallowed words list (Settings → Discussion → Disallowed Comment Keys). A word you put in that list for blog comments can quietly block legitimate form messages too.

To find out which one you have:

  1. Look at Flamingo → Inbound Messages → Spam. Flagged messages end up there, as the Flamingo screenshot above shows with its Inbox and Spam tabs
  2. On the form’s Messages tab, temporarily change the text for "Submission was referred to as spam" to something unique, such as "SPAM VERDICT", and resubmit. If you now see that text, spam filtering is the cause
  3. Review your Akismet, reCAPTCHA, or Turnstile keys under Contact → Integration, and your disallowed words list

Fix 5: The spinner never stops (a blocked request or a script error)

Contact Form 7 does not reload the page when someone clicks Submit. JavaScript sends the data to your site in the background, to an address under /wp-json/contact-form-7/v1/, and shows the answer. If the browser never gets a proper answer, the form just keeps spinning, with no error text at all. We reproduced it by blocking the WordPress REST API for logged-out visitors, which is exactly what some security plugins and "disable REST API" settings do:

Contact Form 7 form after clicking Submit with a loading spinner next to the button and no message
The tell-tale symptom: a spinner beside the Submit button that never resolves, and no message. (Click to enlarge.)

Here is how to diagnose it in about a minute:

  1. Open your contact page, right-click, choose Inspect, and click the Network tab
  2. Type feedback in the filter box and click Submit on the form
  3. Click the request that appears and read its Status
StatusWhat it meansWhat to do
200The request worked. Read the response for the reason.Look at the response text. The cause is mail, spam, or a field error (Fixes 1, 4, 6).
401 or 403Something refused the request: a security plugin, a firewall rule, or a "disable REST API" setting.Allow the contact-form-7/v1 route in your security plugin or firewall. Check Cloudflare, Wordfence, and host-level rules.
404The REST address does not exist on your site.Go to Settings → Permalinks and click Save. Check for redirects or a maintenance plugin.
500PHP crashed while handling the submission.Turn on debug.log, resubmit, and read the error (how).
429 or 503Rate limiting or a temporary block from a firewall or host.Check your security plugin or host dashboard for blocked requests.

You can also test the route directly by opening yourdomain.com/wp-json/contact-form-7/v1/contact-forms/ID/feedback/schema in a browser, replacing ID with your form’s post number. A working site shows a block of JSON. On our blocked test site that address returned:

{"code":"rest_not_logged_in","message":"You are not currently logged in.","data":{"status":401}}

If the Network tab shows no request at all, it is a script problem. Click the Console tab and look for red errors. The usual causes are a JavaScript error from another plugin, or an optimization setting (combine, minify, defer, or "delay JavaScript") that breaks the form’s scripts. Exclude Contact Form 7’s scripts from those features, then clear every cache and test again.

Fix 6: The form says it sent, or shows validation errors

"Thank you for your message. It has been sent." but no email. Open the form’s Additional Settings tab. If you see demo_mode: on or skip_mail: on, the form pretends to work without sending anything. Developers use these while testing, and they are easy to leave behind. We tested it: with demo_mode: on, our form showed the green success message while zero emails went out.

Contact Form 7 Additional Settings tab containing the line demo_mode: on
Remove demo_mode: on (and skip_mail: on) from Additional Settings. The form looks successful while nothing is sent. (Click to enlarge.)

"One or more fields have an error." Check that required fields (marked with an asterisk in the form code) are being filled in, that the field names in the Form tab match the mail tags in the Mail tab, and that your reCAPTCHA or Turnstile keys under Contact → Integration are current. If the page is cached, also make sure your caching plugin is not serving an old copy of the form with stale tokens, and exclude the contact page from page caching if it is.

Fix 7: "Error: Contact form not found."

This message appears on the page where the form should be. It means the shortcode refers to a form that Contact Form 7 cannot find. Current versions identify forms by a short code of letters and numbers, such as [contact-form-7 id="98634da" title="Contact form 1"], instead of a plain number. Contact Form 7 tries the code, then the form’s post number, then the title, and shows the error if none match.

WordPress page showing Error: Contact form not found in place of a contact form
A shortcode pointing at a form that no longer exists on the site. (Click to enlarge.)

It usually follows a migration or redesign, a deleted form, or a page copied from another site. Open Contact → Contact Forms, edit the form, click Toggle shortcode, copy the current shortcode, and paste it over the old one.

Fix 8: It broke right after an update

Work through the likely suspects in order:

  • Check the version requirements. Contact Form 7 6.2.2, current as of October 2026, requires WordPress 7.1 or newer and PHP 8.3 or newer. WordPress refuses to install a plugin update that needs a newer PHP version than your server runs, so an older host can leave you stuck on an outdated release that no longer gets fixes. If that is you, upgrade PHP and WordPress
  • Test for a plugin conflict. On a staging copy, deactivate other plugins one at a time and retest the form after each. Caching, security, optimization, and other form plugins are the usual culprits. WordPress.org’s Health Check & Troubleshooting plugin can disable plugins for just your login session, though it has not been updated since 2024, so confirm it works with your version first
  • Test with a default theme. Some themes remove or replace Contact Form 7’s scripts or styles. Temporarily switching to a default theme tells you quickly
  • If the update crashed the whole site, follow our critical error recovery guide instead

How to test it properly

  1. Submit the live form using an email address different from your To address
  2. Check your inbox and spam folder, and Flamingo
  3. Reply to the message to confirm the Reply-To address is the visitor’s
  4. Send one more from your phone on mobile data, so you are not testing from your own cached browser
  5. Repeat after every plugin, theme, or hosting change

Should you replace Contact Form 7?

Not as a troubleshooting step. If email delivery is the problem, a different form plugin will have the same problem, because the cause was never the form. When you delete Contact Form 7 you also lose every form, mail template, and rule you built. Switch only when you genuinely need something it does not offer, such as built-in payments or multi-step forms, and fix delivery first so the replacement works too.

When to get help

If you have worked through these checks and leads are still going missing, bring in someone who does this regularly. A diagnosis usually takes under an hour for a professional, which is far less time and risk than rebuilding every form in a new plugin. Our WordPress Plugin Fix service covers exactly this: we back up your site, find the root cause, and fix it or recommend a safe alternative, and a single Contact Form 7 problem is typically our $129 Plugin Fix Basic. If your whole site is down, use our emergency help instead.

Let us fix it for you

Sparks Motion diagnoses and fixes Contact Form 7 problems safely. We back up your site, find the root cause, and resolve it without breaking anything else.

Request a Plugin Fix →

Frequently asked questions

Why is Contact Form 7 not sending emails?

Almost always because WordPress hands the message to your web server's basic mail function, and the message is rejected, filtered, or never leaves. Fix it by routing mail through an authenticated SMTP service with a plugin such as WP Mail SMTP, using a From address on your own domain, and making sure your domain has SPF, DKIM, and DMARC records. Contact Form 7 itself is rarely the problem.

Why does my form say the message was sent, but no email arrives?

Check three things. First, demo_mode or skip_mail left switched on in the form's Additional Settings tab, which makes the form report success without sending anything. Second, the To address, which may be wrong or point at a mailbox you do not check. Third, spam filtering: the email may have been accepted by your server and then dropped or junked by the receiving mail provider, which is usually a From address, SPF, DKIM, or DMARC problem.

What does "There was an error trying to send your message. Please try again later." mean?

In Contact Form 7 that is the default text for two different outcomes: the email failed to send, and the submission was flagged as spam. The wording is identical on purpose, so you cannot tell them apart from the front end. Check Flamingo's Inbox and Spam tabs, turn on a mail failure log, or give the spam message its own text on the Messages tab while you troubleshoot.

Why does my Contact Form 7 form keep spinning and nothing happens?

Contact Form 7 sends submissions in the background to a REST API address on your site, and the spinner means the browser never got a usable answer. A security plugin, firewall, or "disable REST API" setting blocking that address, or a JavaScript error from another plugin or an optimization setting, are the usual causes. Open your browser's Network tab, submit the form, and look at the status code of the "feedback" request.

Does Contact Form 7 save form submissions?

Not by default. Out of the box it emails the message and keeps no copy, so a failed email means a lost lead. Flamingo, a free plugin from the same authors, saves submissions to your WordPress database so you can see them and spot spam. Because it stores personal information, mention it in your privacy policy.

Which SMTP plugin should I use for Contact Form 7?

We use WP Mail SMTP, which has a free version and supports Google, SendGrid, Brevo, Mailgun, Postmark, Resend, and any standard SMTP server. The better choice is the mail service behind it: use the SMTP details or API from your email provider (Google Workspace, Microsoft 365) or a transactional email service rather than a personal password.

Does Contact Form 7 work with the latest WordPress and PHP?

Version 6.2.2, current as of October 2026, requires WordPress 7.1 or newer and PHP 8.3 or newer. WordPress will refuse to install a plugin update that needs a newer PHP version than your server runs, which leaves you on an older Contact Form 7 that stops getting fixes. If that is you, plan an upgrade of PHP and WordPress.

How much does it cost to have someone fix Contact Form 7?

A single Contact Form 7 problem such as email delivery, a blocked submission, or a plugin conflict is typically our $129 Plugin Fix Basic. Multiple issues or deeper conflicts run higher, and we tell you the price before we start.

How we tested this. Every screenshot and error message in this guide was captured from a real WordPress 7.1.3 test site running Contact Form 7 6.2.2, Flamingo 2.6.4, and WP Mail SMTP 4.10.2, which we broke on purpose in each of the ways described: no working mail transport, a From address on another domain, a blocked REST API, and demo mode left on. Where we describe plugin behaviour (identical default messages for spam and failed mail, shortcode lookup order, demo mode, the disallowed words check), we read it in the plugin’s source code. The business in the screenshots is made up. Last reviewed Oct 12, 2026 on WordPress 7.1.3 and PHP 8.4.

← Back to All Posts