WordPress Email Not Sending
What Is This Error?
When WordPress stops sending emails, everything that depends on mail delivery breaks quietly — password reset links never arrive, new user welcome messages vanish, contact form submissions go nowhere, and WooCommerce order confirmations disappear into the void. There’s no error page, no crash, just silence.
By default, WordPress sends mail using PHP’s built-in mail() function. The problem is that most modern web hosts either disable this function outright or throttle it heavily, because it’s a well-known entry point for spammers abusing shared servers.
This isn’t a WordPress bug — it’s a server configuration gap. The fix is to replace the unreliable PHP mail function with a proper authenticated SMTP connection, which is exactly what mail services like Gmail or SendGrid expect.
Get free WordPress & AI tips
Join 500+ readers. No spam, unsubscribe anytime.
Why Does This Happen?
- Host blocks PHP mail(): Shared hosting providers like GoDaddy, Bluehost, and SiteGround commonly restrict or disable
mail()to stop spammers from abusing server resources. - No SMTP authentication configured: WordPress ships with zero SMTP credentials out of the box, so outgoing mail has no identity proof and receiving servers reject or silently drop it.
- Sender address doesn’t match the domain: If WordPress sends from
noreply@yourdomain.combut the server isn’t authorized to use that address, spam filters treat it as forged mail. - Missing SPF or DKIM DNS records: Without these email authentication entries on your domain, receiving servers can’t verify your messages are legitimate and quietly bin them.
- Plugin or theme conflict: A poorly coded plugin can hook into
wp_mail()and silently intercept or corrupt the sending process with no visible warning in the dashboard.
How to Fix It — Step by Step
-
Install the WP Mail SMTP plugin. In your WordPress dashboard go to Plugins → Add New, search for WP Mail SMTP by WPForms, then install and activate it.
You should see: A new “WP Mail SMTP” entry in the left sidebar and a setup wizard prompt on activation.
-
Choose your mailer. Open WP Mail SMTP → Settings → Mailers. For a free setup, select Gmail (good for low-volume sites) or Brevo (300 free emails/day, no credit card needed). Avoid the “Other SMTP” option unless your host provides dedicated SMTP credentials.
You should see: A credentials form specific to the mailer you selected.
-
Generate a Gmail App Password (if using Gmail). Go to myaccount.google.com → Security → 2-Step Verification → App Passwords. Create a password labeled “WordPress” and copy the 16-character code — you won’t see it again.
You should see: A 16-character code in a yellow box on the Google account page.
-
Enter your SMTP credentials. Fill in the settings form. For Gmail, use these values:
SMTP Host: smtp.gmail.com Encryption: TLS SMTP Port: 587 Username: youraddress@gmail.com Password: [your 16-character App Password]Save the settings.
You should see: A green “Settings saved” banner at the top of the page.
-
Send a test email. Go to the Email Test tab inside WP Mail SMTP. Enter your own address and click Send Email.
You should see: A “Test email was sent successfully” notice, and the email arriving in your inbox within 60 seconds.
-
Test your real workflows. Submit a test entry through your contact form, trigger a WooCommerce test order, or use Users → Lost your password? to fire a real password reset.
You should see: Notification emails arriving in the expected inbox, not in spam.
-
Add SPF and DKIM records to your domain DNS. Log into your domain registrar (Cloudflare, Namecheap, GoDaddy, etc.) and add the TXT records your SMTP provider gives you. For Gmail, add this TXT record on your root domain:
Type: TXT Host: @ Value: v=spf1 include:_spf.google.com ~allYou should see: DNS propagation within 24–48 hours; emails stop landing in recipient spam folders.
Common Mistakes When Fixing This
- Using a regular Gmail password instead of an App Password → Google blocks standard passwords for SMTP logins entirely. You must enable 2-Step Verification first, then generate a dedicated App Password from your Google account security settings.
- Leaving the SMTP port set to 25 → Port 25 is blocked by virtually every shared host to prevent spam relay. Always use port 587 with TLS encryption, or port 465 with SSL — check which your mailer specifies.
- Skipping the DNS records after installing the plugin → The SMTP plugin fixes sending, but without SPF and DKIM records on your domain, emails still fail spam checks at the recipient’s end and land in junk folders.
- Only running the plugin’s test and calling it done → The test tool confirms the SMTP connection works, but your contact form or WooCommerce may have a hardcoded “From” address that doesn’t match your authenticated email. Always test the actual form or checkout flow end-to-end.
Frequently Asked Questions
Will switching to SMTP affect emails already in my inbox?
Not at all. This change only affects how WordPress sends outgoing messages going forward. Your existing inbox, sent history, and any received emails are completely untouched.
What’s the best free SMTP option for a small site?
Gmail with an App Password works well for personal or low-traffic sites (roughly up to 500 emails per day). If you want a more professional setup without tying it to a personal Gmail account, Brevo offers 300 free emails per day on a dedicated sending infrastructure with no credit card required.
The plugin test passes but my contact form still doesn’t send — why?
Your contact form plugin almost certainly has its own “From” email setting (check Contact Form 7 under Mail, or WPForms under Notifications). If that address doesn’t match the email you authenticated with your SMTP mailer, receiving servers may still reject it. Update the form’s “From” field to match your SMTP sender address.
Do I need to pay for any of these tools?
No. The free version of WP Mail SMTP supports Gmail, Brevo, Mailgun, and several other mailers at no cost. You’d only consider upgrading if you need features like email open tracking, a built-in delivery log, or priority support — none of which are required to fix the sending issue itself.
