Contact Form 7 not sending email: finding where it stops
Contact Form 7 hands the message to WordPress' wp_mail() and reports whatever comes back. A red “There was an error trying to send your message” means your server refused it; a green “Thank you” that never arrives means the mail left your server and was dropped or filtered later. Either way, CF7 keeps no copy — so the enquiry is gone unless you find it in a spam folder.
First, which of the two failures is it?
Send the form yourself and watch the message under the button. They point in different directions:
- A red error after pressing Send —
wp_mail()returned false. PHP's mail function isn't available, the host blocks it, or an SMTP plugin's login failed. Nothing left the server. - A success message, but no email — your server accepted the message and passed it on. It was rejected or filed as spam by the receiving mailbox, almost always because the From address doesn't match the server that sent it.
The usual causes, in the order worth checking
- The From field in CF7's Mail tab uses the visitor's address, such as
[your-name] <[your-email]>. Your website isn't allowed to send as gmail.com, so receivers distrust it. Put an address on your own domain in From and the visitor inReply-To: [your-email]under Additional headers. CF7's own configuration check warns about this. - The host has PHP mail switched off. Many hosts do, to stop spam. The fix is an SMTP plugin that sends through a real mailbox or a transactional mail service.
- SPF and DKIM don't cover your web server. The domain's DNS says which servers may send for it; a shared host usually isn't on that list.
- The recipient is on the same domain and the mailbox is hosted elsewhere — the web server tries to deliver locally and never reaches your real inbox.
What CF7 can't show you
CF7 stores nothing. When a message fails, the only record is the error the visitor saw — and visitors rarely tell you. The add-on Flamingo stores submissions, but it doesn't record whether each email was accepted.
What Mailbag does differently
Mailbag Contact Form saves each entry in WordPress before it sends a thing, then marks it Sent to your mail server, Failed with the exact error, or Not sent. A failed notification can be resent from the entry, and Send test email under Mailbag's settings shows your server's answer word for word. Its importer brings your CF7 forms across, so you don't rebuild them — see switching from Contact Form 7.
Mailbag Contact Form is a free contact form that saves every entry before it sends anything, and shows you what happened to each email.
See what it does