Contact Form 7 Not Sending Email? Here's the Real Fix
A customer fills out your Contact Form 7 form, sees the green "Thank you, your message has been sent" bar, and closes the tab feeling good about it. Three days later they email you asking why nobody replied. You check your inbox. There's nothing there. CF7 thinks it worked — and that's exactly the problem.
Symptom: CF7 says "sent," but nothing arrives
This ticket looks the same almost every time:
- The form submits, the success message shows, no red error text anywhere
- Your inbox (and spam folder) has nothing from that submission
- It worked fine a few weeks ago, or works for some fields and not others
- You changed a field name, added a new field, or installed a security plugin recently
- Test submissions from your own email work, but real customer submissions don't — or vice versa
Contact Form 7 has no idea whether the email actually reached anyone. Its "sent" message just means PHP accepted the mail for delivery, not that it arrived. That gap is where almost every one of these tickets lives.
Cause: five places this quietly breaks
1. Mail tags don't match your form fields
CF7 splits form building and mail configuration into two separate tabs, and it's easy for them to drift apart. If you rename a field from [text* your-name] to [text* full-name] in the Form tab but forget to update [your-name] to [full-name] in the Mail tab, that tag doesn't get replaced — it just gets sent as literal text, or in older CF7 versions can quietly block the send. Check the Mail tab's "Message body" and header fields against the exact tag names in the Form tab, character for character.
2. "Additional Headers" set a bad Reply-To or From
A common customization is adding Reply-To: [your-email] in Additional Headers so replies go straight to the customer. If the visitor's typed email is malformed, or the field isn't actually required, that header can end up empty or invalid — and some mail transfer agents reject the whole message rather than send it with a broken header.
3. The From address doesn't match your domain
By default, CF7 sends From: WordPress <wordpress@yourdomain.com>. If a theme or another plugin changes that to something like noreply@gmail.com or an address that doesn't belong to your domain, your mail server (or receiving servers checking SPF) can silently drop or spam-bin the message because it fails alignment. This is the same underlying mechanism covered in our SPF/DKIM/DMARC guide — if your CF7 mail is landing in spam rather than vanishing entirely, that's the post to check next.
4. PHP mail() is failing without telling anyone
Same root cause as most WordPress mail issues: CF7 hands the message to PHP's mail() function, which hands it to Exim or Sendmail, which may reject it locally for a dozen reasons (sender domain mismatch, hourly send limit hit, spam signature) — and none of that comes back to CF7 as an error. Our WordPress SMTP setup guide covers replacing this with authenticated SMTP; if you haven't done that yet, it's the highest-leverage fix for CF7 specifically.
5. Anti-spam or caching plugins interfere before the mail even fires
Aggressive security plugins (Wordfence, All In One WP Security) sometimes block outbound connections or quarantine forms flagged as suspicious. Full-page caching plugins can occasionally serve a stale cached form that posts to an outdated nonce, which CF7 rejects as invalid before it ever tries to mail anything — that shows up as "There was an error trying to send your message" instead of a silent failure.
Fix: work through it in this order
Step 1 — install Flamingo and confirm CF7 actually tried to send
Flamingo is a free companion plugin by the same author as Contact Form 7. It logs every submission CF7 processes, whether or not the mail delivered. Install it, submit a test message, and check Contact → Flamingo → Inbound Messages.
- Message is logged in Flamingo: CF7 processed the submission correctly — the problem is downstream, in mail delivery. Skip to Step 3.
- Nothing logged at all: the form isn't even reaching CF7's mail step — check for a JavaScript/nonce error in your browser console, or a caching plugin serving a stale form.
Step 2 — line up every mail tag against the Form tab
Open the form's Form tab and copy each field's tag name exactly. Open the Mail tab and confirm every tag used in the "To," "From," "Subject," and "Message body" fields matches one of those names precisely — including hyphens and case. A single mismatched tag anywhere in the mail template is the single most common cause of this ticket.
Step 3 — sanity-check Additional Headers
In the Mail tab, expand Additional Headers. If you have a line like Reply-To: [your-email], make sure your-email is a required field of type email* in the Form tab, not plain text. An invalid or empty Reply-To value is a common reason a message that "looks fine" never leaves the server.
Step 4 — fix the From address
Under Mail tab → From, use an address on your own domain — ideally the same domain WordPress is installed on, e.g. wordpress@yourdomain.com. Avoid using the visitor's own email address as the From (use it as Reply-To instead); many receiving mail servers reject messages where the From domain doesn't match the sending server, since it looks like spoofing.
Step 5 — install WP Mail Logging and get the actual server response
Flamingo tells you CF7 tried to send. WP Mail Logging tells you what wp_mail() did with it and, once SMTP is configured, the real error text (auth failure, rejected recipient, connection timeout) instead of a generic "sent" message. This is the fastest way to stop guessing.
Step 6 — move off PHP mail() if you haven't already
If Steps 1–5 all check out and mail still isn't arriving, the underlying transport is the problem. Install WP Mail SMTP (or similar) and connect it to a real SMTP account — a cPanel email account, Google Workspace, or a transactional service like SendGrid or Amazon SES. Full walkthrough, including which port and auth method to pick, is in the SMTP setup guide.
| What you see | Likely cause | Where to look |
|---|---|---|
| "Sent" but nothing in Flamingo | Form never reached CF7's mail step | Browser console, caching plugin, nonce errors |
| Logged in Flamingo, nothing in inbox | Mail tag mismatch or bad header | Mail tab tags vs. Form tab field names |
| "There was an error trying to send your message" | Server-side mail() rejection | WP Mail Logging error text, SMTP setup |
| Arrives, but always in spam | SPF/DKIM alignment failure | From address matches your domain; check SPF/DKIM/DMARC |
| Worked before, stopped after a plugin update | Security/caching plugin blocking outbound mail or forms | Deactivate plugins one at a time to isolate |
Prevention: stop this from coming back
- Set up authenticated SMTP once, properly, instead of relying on PHP mail() — it turns silent failures into visible error messages
- Keep Flamingo active permanently as a submission log, even after mail is working — it's the fastest way to prove "the form worked, the email didn't" to a customer
- Whenever you rename or add a form field, immediately re-check the Mail tab tags in the same sitting
- Use a dedicated From address on your domain and the visitor's email only as Reply-To
- Test the live form after every CF7 or security-plugin update, not just after form edits
Most CF7 delivery problems come down to one of two things: a mail tag that got out of sync with the form, or a mail server that rejected the message and never told anyone. Flamingo and WP Mail Logging turn both of those from a guessing game into a two-minute check.
Frequently asked questions
Why does Contact Form 7 say "message sent" if the email never arrives?
CF7 only confirms that PHP accepted the message for delivery, not that it reached an inbox. Delivery happens after CF7 hands off, so failures there never make it back to the plugin's success message.
Do I need Flamingo to fix this?
You don't strictly need it, but it's the fastest way to tell whether CF7 processed the submission at all. If a message is missing from Flamingo, the problem is on the form side; if it's logged there but never arrives, the problem is in mail delivery.
Is this the same fix as the general "WordPress not sending emails" issue?
It overlaps at the SMTP layer, but CF7 has its own failure points — mismatched mail tags and Additional Headers — that a generic SMTP fix won't catch. Check the CF7-specific causes first, then apply SMTP if mail still isn't going out.
Why do only some of my CF7 forms fail to send?
This usually points to a per-form configuration issue rather than a server-wide one — most often a mail tag typo or an Additional Headers line on that specific form's Mail tab, not the site's mail transport.
Could a security plugin be blocking Contact Form 7 emails?
Yes. Some security and firewall plugins block outbound connections or quarantine submissions flagged as suspicious. If mail stopped right after installing or updating one, deactivate it temporarily to confirm before changing anything else.