You test the contact form on your own site, fill in a fake name, hit submit, and get the friendly "Your message has been sent" confirmation. Then you wait. Nothing shows up in your inbox — not even in spam. Password reset emails do the same disappearing act, and so does the "new order" notification WooCommerce is supposed to send you. The site isn't broken, exactly. It just can't seem to send a single email, and there's no error banner telling you why.
Symptom: Forms Submit Fine, But No Email Ever Arrives
This is different from an email landing in spam or getting flagged as suspicious — that at least means the message left the server. What you're dealing with here is usually one of these:
- Contact form plugins (Contact Form 7, WPForms, Gravity Forms) show a success message but the email never lands anywhere, spam folder included.
- Clicking "Lost your password?" produces no reset email at all.
- WooCommerce order confirmations, admin new-order alerts, or low-stock notices silently stop working.
- A plugin like WP Mail SMTP or Check Email, once installed, reports the test email failed with something vague like
Could not instantiate mail function.
If that last bullet sounds familiar, you're already halfway to the fix. If you haven't installed a mail-logging plugin yet, do that first — guessing at what's wrong with an invisible email is a waste of everyone's time.
Cause: wp_mail() Isn't a Real Mailbox
WordPress doesn't have its own email system. Every notification — from core, from plugins, from your theme — goes through a single function called wp_mail(). By default, that function hands the message to PHP's built-in mail() function, which in turn asks the server's local mail transfer agent (usually sendmail or exim) to deliver it.
That chain works, technically, but it's fragile:
- No authentication. Mail sent this way often has no SPF/DKIM signature tying it to your domain, so receiving servers either silently drop it or bounce it without telling WordPress anything went wrong.
- Shared IP reputation. On shared hosting, the server's outgoing IP is shared with other accounts. If even one of them gets flagged, mail from every account — including yours — can get quietly swallowed.
- PHP mail() failing silently. If
sendmailisn't configured correctly, or the server has outbound port 25 blocked (common on VPS instances, less common on managed cPanel hosting),wp_mail()returnsfalseand WordPress just moves on. There's no fatal error, no red banner — the form still says "message sent." - A security plugin or firewall rule blocking outbound mail as a side effect of hardening the server, especially after a migration or a fresh WordPress install where mail was never tested.
The fix is almost always the same: stop relying on the server's local mail() function and route WordPress through a real, authenticated SMTP connection instead.
Fix: Route WordPress Through Real SMTP
Here's the sequence we walk customers through, in order of how often it actually solves the problem.
1. Confirm it's really a sending problem
Install WP Mail SMTP (or Check & Log Email) from the plugin repository and go to its Tools → Test Email screen. Send a test to an address you control and check both inbox and spam. If it fails, the plugin usually tells you the SMTP response code, which narrows things down fast — a 550 or connection refused is very different from a silent timeout.
2. Set up an SMTP connection instead of PHP mail()
You have three practical options on SkyServer hosting:
| Option | Best for | Notes |
|---|---|---|
| cPanel email account (e.g. no-reply@yourdomain.com) | Most WordPress sites on shared/reseller hosting | Free, uses your own domain, server is mail.yourdomain.com, port 587 with TLS |
| SendGrid, Mailgun, or Brevo (free tier) | Sites sending password resets, receipts, or any transactional volume | Better deliverability at scale, needs an API key, easiest setup inside WP Mail SMTP |
| Gmail/Google Workspace SMTP | Small sites, personal blogs | Requires an app password, Google occasionally throttles bulk sending |
For most cPanel customers, the first option is the least fuss because you already have the mailbox. In WP Mail SMTP, choose Other SMTP, then fill in:
- SMTP Host:
mail.yourdomain.com - Encryption: TLS
- SMTP Port:
587 - Authentication: On, using the full email address and its mailbox password
Save, then re-run the test email. This alone fixes the vast majority of "forms work, email doesn't" tickets, because now WordPress is authenticating as a real mailbox with SPF/DKIM behind it instead of shouting into the void via sendmail.
3. If SMTP still fails, check the server side
On a VPS, run:
telnet mail.yourdomain.com 587
If that hangs instead of connecting, an outbound firewall rule (UFW, iptables, or a security group) is likely blocking the port. Open it with something like:
sudo ufw allow out 587/tcp
Also check /var/log/exim_mainlog or /var/log/maillog for the exact rejection reason if mail is going out but bouncing — it'll usually name the specific SPF or relay problem.
4. Rule out plugin conflicts
Occasionally a security plugin (Wordfence, iThemes) or an aggressive caching setup intercepts the wp_mail hook before SMTP plugins get a chance to run. Deactivate other mail-related plugins one at a time and re-test; two plugins both trying to hijack wp_mail() is a classic silent-failure cause.
Prevention
- Set up SMTP the same day you launch a site, not after the first support ticket about a missing password-reset email.
- Keep a mail-logging plugin active permanently — it costs nothing and turns "email just vanished" into a five-second diagnosis next time.
- Use a dedicated sending address (like
no-reply@yourdomain.com) rather than a personal inbox, so you're not fighting inbox rules or forwarding loops. - If you're on a VPS, confirm outbound port 587 (and 465 if you need it) is open before you need it, not during an incident.
- Test the password-reset flow yourself right after any migration, PHP version change, or security plugin update — these are the three events most likely to break outbound mail silently.
Frequently Asked Questions
Why does the contact form say "message sent" if the email never arrives?
Because wp_mail() only reports whether the message was handed off to the mail transport, not whether it was actually delivered. If sendmail accepts it locally and then fails further down the chain, WordPress has no way to know and shows success regardless.
Do I need a paid SMTP service, or will my cPanel email work?
A regular cPanel mailbox on your own domain is enough for most small to medium sites. Move to a dedicated transactional service like SendGrid or Mailgun once you're sending in bulk — password resets and receipts for a few hundred users a day, or if deliverability to Gmail/Outlook becomes inconsistent.
I set up WP Mail SMTP and the test email still fails. Now what?
Check the exact error the plugin returns. A connection timeout usually means a blocked port; an authentication error means the mailbox password or username is wrong; a "relay denied" message usually means the SMTP host doesn't match the domain you're authenticating with.
Could my hosting provider be blocking outbound email entirely?
It's uncommon on managed shared/cPanel hosting, but some VPS providers block port 25 by default to prevent spam abuse. Port 587 with authentication is almost always open even when 25 is blocked, which is exactly why SMTP plugins default to it.
Will switching to SMTP fix emails that are landing in spam, not just missing entirely?
It helps, since authenticated mail carries proper SPF/DKIM alignment, but spam placement also depends on sending reputation and content. If mail is arriving but going to spam rather than vanishing outright, that's a deliverability problem rather than a sending problem, and needs its own checklist.
