Tech
Why Contact Form 7 Emails Aren't Being Delivered (and How to Fix It) | Use Send Logs to Stop Missing Leads
With Contact Form 7 (CF7), the default WordPress form plugin, this guide explains the causes of "contact emails not arriving" and "submissions go through but no notification comes," starting with how to determine whether the email was sent at all. It covers SMTP, anti-spoofing measures, and saving send logs to a database — implementation steps to stop losing leads.
Contact Form 7 (CF7) is the de facto standard for WordPress forms, but the most common problem after launch is “contact emails aren’t arriving.” The form looks like it’s working fine, yet notifications never reach the site admin, or the auto-reply never reaches the sender. Leave this unaddressed and you’re missing inquiries — which means missing your entry point to sales.
The short answer: the cause is usually not a CF7 configuration mistake, but an issue with WordPress’s sending method (PHP mail) and email authentication. This article first walks through how to tell whether the email isn’t being sent or simply isn’t being delivered, then covers fixes for each cause, starting with the easiest.
Why Contact Form 7 Emails Don’t Arrive
CF7 sends email using WordPress’s standard wp_mail() function (which is really just PHP’s mail() under the hood). This approach is convenient, but by design it’s prone to non-delivery for the following reasons.
- Many shared hosting providers limit the volume or sender of PHP mail, or treat it as spam outright
- If the sender address doesn’t match the site’s domain, the receiving server flags it as spoofed
- Without email authentication such as SPF and DKIM configured, providers like Gmail will route the message straight to spam or discard it entirely
In other words, even when CF7 displays a “message sent” confirmation, the email very often disappears after leaving your server, or just before it reaches the recipient’s server.
Diagnosis: Is the Email Not Being Sent, or Not Being Delivered?
Before you attempt any fix, you need to determine exactly which stage the problem is occurring at. Skip this step and you risk going in circles — tweaking SMTP settings that were never the issue.
- The email is never sent at all — the form returns an error, or nothing happens when the submit button is clicked. Suspect CF7’s form settings, required fields, or reCAPTCHA integration errors.
- The email is sent but never arrives — the “Thank you for your message” confirmation appears, but no notification email shows up. Suspect server-side sending limits, spoofing detection, or spam filtering.
The fastest, most reliable way to make this diagnosis is to save your send logs to a database. If a record shows up in the log, you can immediately conclude that the message reached the sending process — meaning the problem lies on the email delivery side. If no record appears, the problem is on the form side instead. Beyond troubleshooting, keeping logs also acts as a safety net that preserves the inquiry itself if the email never arrives (see Solution 3 below).
Solution 1: Send via SMTP to Bypass Server Mail Limits
Implementation effort ★★☆
The single most effective fix is switching your sending method from PHP mail to SMTP. Because SMTP uses an authenticated, legitimate mail-sending route, it bypasses your server’s PHP mail restrictions and improves trust on the receiving end.
On WordPress, a plugin such as WP Mail SMTP lets you switch simply by entering SMTP credentials for Gmail, SendGrid, Amazon SES, your company mail server, or similar. If you want consistently reliable delivery, using a dedicated transactional email service like SendGrid or SES is the safest bet — even their free tiers comfortably cover the inquiry volume of a small or midsize site.
Solution 2: Set Up the Sender Address and Anti-Spoofing Measures (SPF/DKIM)
Implementation effort ★☆☆
Even after switching to SMTP, emails still won’t arrive if the sender address isn’t set up correctly. This is where most people get tripped up.
- Use the same domain as your site for the sender (From) address — match it to your site’s domain, e.g.
info@yourdomain.com. Using a free email provider such asgmail.comas the sender will get you flagged as spoofed. - Set up an SPF record — register the sending server (your SMTP service) in your DNS’s SPF record to prove it’s an authorized sender.
- Enable DKIM signing — this attaches a digital signature to outgoing mail, showing the recipient that the message hasn’t been tampered with.
SPF and DKIM involve editing DNS records, which makes them more difficult than adjusting form settings. A mistake here can risk breaking email delivery sitewide, so if you’re not confident, it’s safer to bring in a specialist, as described below. A very common mistake — one we see constantly in client work — is setting the sender to the actual submitter’s email address so they can be “replied to directly,” when that’s exactly what’s causing the non-delivery. The correct approach is to specify the reply address via Reply-To while keeping the From address fixed to your own domain.
Solution 3: Save Send Logs to the Database to Stop Missed Leads
Implementation effort ★★★
Alongside deliverability fixes, one thing you should always do is save submission content to a database. No matter how much you optimize email delivery, the possibility of non-delivery never reaches zero. Keep a log, and even if the notification email fails to arrive, the inquiry itself stays in your admin dashboard — eliminating missed leads entirely.
CF7 doesn’t save submission content by default. You can build your own solution using the wpcf7_before_send_mail hook to save to a custom table, but writing and maintaining that for every project isn’t efficient. With the free version of Frontierline Forms, you can save CF7 send logs to the database with just a configuration step, and view, search, and check the history from your admin dashboard (see How to save submission data to the database). That gives you both a way to confirm whether an email was actually sent and a safety net for non-delivery — without writing any code.
If you want to review spam prevention and conditional notification logic at the same time, see our other article, “Solving Contact Form 7’s Spam and Send-Log Problems Through Implementation”.
If It Still Doesn’t Arrive, or You’d Rather Not Touch DNS
Everything covered so far is technically something you can implement yourself. That said, SPF/DKIM DNS settings affect email for your entire site, and a mistake carries real risk — including breaking incoming mail. If you’ve already narrowed down the cause but want it fixed reliably, or you’d rather not touch DNS or server configuration yourself, handing it off to a professional ends up being the fastest and safest route.
WordPress Plugin & Custom Development
First, find out whether emails are actually being sent. If you can't fix it yourself, hand off the whole thing.
You can implement database logging of sent messages, a review screen, and multi-step forms right now with the free version of the CF7 extension plugin Frontierline Forms (available on the official WordPress.org repository — install with a single search from your admin dashboard). If you need conditional notification logic or Slack/Chatwork forwarding, the Pro version (from $39.99/year) adds those, and entering the launch discount code EARLYBIRD2026 at checkout gets you a discounted price. If you'd rather hand off SMTP and SPF/DKIM setup or form changes entirely, we also offer custom development to handle it all for you.
Summary
In most cases, the reason Contact Form 7 emails don’t arrive lies not in CF7 itself but in WordPress’s sending method and email authentication. The reliable path is to first use send logs to determine whether the message is being sent or simply not delivered, then switch to SMTP sending and set up the sender address along with SPF/DKIM. Saving send logs to a database at the same time means that even if delivery fails, the inquiry itself is preserved, preventing missed leads.
You can start saving send logs right now with the free version of Frontierline Forms. If you want a reliable fix that includes DNS and SMTP configuration, get help on WordPress.org.
Frequently Asked Questions
Q. Why aren’t Contact Form 7 emails being delivered?
In most cases, emails sent through WordPress’s wp_mail (PHP mail) are being blocked by server-side sending limits or rejected as spoofed by the receiving server. The cause is usually on the server and email authentication (SPF/DKIM) side rather than a CF7 configuration mistake. The fastest way to narrow things down is to check your send logs to see whether the message was actually sent.
Q. What should I do if the email is being sent but not delivered? Switching to SMTP for sending, matching the sender address to your site’s domain, and setting up SPF/DKIM are all effective fixes. Using a free email address (such as a gmail.com address) as the sender makes it much more likely to be flagged as spoofed.
Q. Is there a way to check whether I’m missing any inquiries? If you save submission content to a database, the inquiry itself remains in your admin dashboard even if the notification email never arrives. With the free version of Frontierline Forms, you can save CF7 send logs to the database and check afterward whether messages were delivered and confirm nothing was missed.