Two plugins, one pipeline
Contact Form 7 is still everywhere on WordPress—and for simple sites, fair enough. It collects input, runs validation, and calls wp_mail(). That is the entire contract.
Almost every serious site adds a second plugin: WP Mail SMTP, FluentSMTP, Post SMTP, or similar. That plugin replaces or wraps PHP mail() with authenticated SMTP.
Visitors see one form. Under the hood there are two vendors and zero integration tests.
How the handoff fails in the wild
Wrong From address. CF7 sends as wordpress@yourdomain.com while the SMTP plugin is authorized only for notifications@. Some relays rewrite it; others reject silently or dump mail in spam.
HTML vs plain mismatch. CF7 mail templates with unclosed tags confuse picky parsers. The SMTP log shows “sent.” The inbox shows nothing useful.
Duplicate mail plugins. I have seen sites with two SMTP plugins active after a migration. Both claim success. Neither delivers reliably.
Caching and AJAX submits. Full-page caches serving stale nonces cause intermittent failures that are hell to reproduce manually. “It worked when I tried” is true and useless.
What I check on CF7 sites
- Submit with realistic field values—not
test/test. - Read the SMTP plugin’s log for that timestamp.
- Confirm the message in the recipient mailbox, not only the log.
- If the log is empty, CF7 never reached the handoff—check PHP error logs and CF7’s own debug when enabled.
I keep CF7’s mail tab screenshot in the client folder. When someone edits “additional headers” without telling me, I have a baseline.
Opinionated take
CF7 is not the problem. Untested handoffs are the problem. You can run the same stack for years until one DNS change or one plugin update moves the seam.
That is why I automate submissions on CF7 sites the same way I do on custom React forms. The plugin names change; the question does not: did the inquiry arrive where sales expects it?
If you are debugging a stubborn CF7 site today, start at the SMTP log, then the inbox, then the DNS. In that order. Skipping the inbox is how teams lose weeks.
