Skip to content
FormReceipt

WordPress

Contact Form 7 + SMTP plugin: the handoff nobody tests

CF7 handles the visitor. Your SMTP plugin handles mail. The fragile bit is the seam between them—and it fails without telling the user.

By Lars KoudalPublished:
WordPress admin with Contact Form 7 and mail plugin settings

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

  1. Submit with realistic field values—not test / test.
  2. Read the SMTP plugin’s log for that timestamp.
  3. Confirm the message in the recipient mailbox, not only the log.
  4. 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.

Want proof your forms deliver?

FormReceipt runs real test submissions and records verifiable proof that inquiries were received.

Get started

← Back to blog

Cookie choices

We use a required session cookie for login and optional analytics cookies for marketing pages. Read cookie policy