You built a contact form, tested it, and the success message appeared. But the email never landed in your inbox. Contact Form 7 says “sent,” yet nothing shows up. This is one of the most common WordPress problems, and the cause is almost never the form itself.
The Quick Answer
Contact Form 7 hands your message to WordPress, and WordPress tries to send it with the server’s built-in PHP mail() function. Most modern hosts and inbox providers now block or silently discard mail sent this way because it fails spam authentication (SPF, DKIM, DMARC). The fix is to route your mail through a proper SMTP connection instead of PHP mail(). Once you do that, delivery jumps to nearly 100 percent. You can set this up for free with a plugin like ReadyGo SMTP in about five minutes.
Why Contact Form 7 Emails Disappear
When Contact Form 7 shows the green “Thank you for your message” bar, all it is confirming is that WordPress accepted the message for sending. It has no way of knowing whether the mail server actually delivered it. That gap is where messages vanish.
The default PHP mail() path sends email straight from your web server with no authentication. To Gmail, Outlook, and Yahoo, an unauthenticated message that claims to come from your domain looks exactly like a spoofed spam email, so they drop it or bury it in spam. Some hosts disable PHP mail() entirely to protect their IP reputation, which means the message is never even attempted.
Step 1: Confirm It Is a Delivery Problem, Not a Form Problem
Before changing anything, rule out a form configuration mistake:
- Open your form in Contact Form 7 and check the Mail tab. The To field should be a real inbox you can check, and the From field should use an address at your own domain (for example
[email protected]), not the visitor’s Gmail address. - Check the spam and junk folders of the destination inbox.
- Send a test and note whether you get any error at all on the front end.
If the form submits cleanly but no mail arrives even in spam, you have a delivery problem, and SMTP is the answer.
The Real Fix: Send Through SMTP
SMTP (Simple Mail Transfer Protocol) sends your email through a real, authenticated mailbox instead of the anonymous server function. Because the message is signed and authenticated, inbox providers trust it and deliver it. Setting it up means installing a free SMTP plugin and pointing it at a mailbox.
With ReadyGo SMTP the flow is:
- Install and activate the plugin (it is free, with no send limits added by the plugin itself).
- Enter the SMTP host, port, username, and password for the mailbox you want to send from.
- Send the built-in test email and confirm it arrives.
From that point on, every email WordPress sends, including Contact Form 7 messages, WooCommerce receipts, and password resets, goes out over that authenticated connection.
Host-by-Host Notes
The SMTP details you enter depend on where the mailbox lives. Here are the common setups:
- Bluehost / HostGator / GoDaddy shared hosting: Create an email account in cPanel (for example
[email protected]), then usemail.yourdomain.comas the host, port 465 with SSL, and the full address and password as the login. - SiteGround: Create the mailbox in Site Tools, then use the SMTP host it shows you (usually your domain), port 465 SSL. SiteGround blocks
PHP mail(), so SMTP is required, not optional. - Cloudways / Kinsta / other managed hosts: These do not run a local mail server at all. Use an external provider such as Gmail, Google Workspace, or a transactional service, and enter that provider’s SMTP settings.
- Hostinger: Create the email in hPanel, then use
smtp.hostinger.com, port 465 SSL, with the mailbox address and password.
Using Gmail or Google Workspace
Gmail is a reliable free option, but you cannot use your normal Gmail password. Turn on two-step verification on the Google account, then generate a 16-character App Password and use that as the SMTP password. The settings are host smtp.gmail.com, port 465 with SSL, username your full Gmail address, and the App Password as the password. Free Gmail allows roughly 500 sends per day, which is plenty for a contact form.
Still Not Working? Quick Checklist
- Wrong port or encryption: Use 465 with SSL, or 587 with TLS. Mixing 465 with TLS is the most common mistake.
- Firewall blocking the port: Some hosts block outbound port 465 or 587. If the test fails to connect, ask support which outbound SMTP ports are open.
- From address mismatch: The From address in Contact Form 7 should match the mailbox you authenticated with, or delivery trust drops again.
- Caching plugin interfering: Rare, but clear your cache after changing mail settings.
Why This Also Fixes Everything Else
Once SMTP is handling your mail, you are not just fixing Contact Form 7. Order confirmations, new-user notifications, comment alerts, and password-reset links all start arriving reliably too, because they all use the same underlying WordPress mail function you just upgraded.
Frequently Asked Questions
Do I need a paid service to fix this? No. A free mailbox from your host or a free Gmail App Password plus a free SMTP plugin solves it for the vast majority of small sites.
Will SMTP slow my site down? No. Mail is sent in the background; visitors never wait on it.
Is Contact Form 7 broken? No. The plugin is doing its job by handing the message to WordPress. The delivery failure happens after that, at the server level, which is exactly what SMTP corrects.
Wrapping Up
If Contact Form 7 says a message was sent but nothing arrives, stop editing the form. The problem is that WordPress is sending mail without authentication, and modern inboxes reject it. Route your mail through SMTP with a free plugin like ReadyGo SMTP, match the host settings above, send the test email, and your contact forms will start landing in the inbox where they belong.
