preloader

WordPress Not Sending Emails: How to Fix It

WordPress hands outgoing email to PHP’s mail() function. PHP passes it to the server’s mail agent. The mail agent tries to deliver it. Any of these three steps can fail – and when they do, WordPress reports nothing. No error, no bounce, just silence. The single most common cause: your host blocks PHP mail entirely to prevent spam. The fix is the same regardless of cause: bypass PHP mail with a proper SMTP connection. Here is how to diagnose which layer is failing before you fix anything.

Step 1: Confirm the Problem With a Test

Install the free Check & Log Email plugin (WP Mail SMTP also has a test feature). Send a test email to an address you control. Check three places for the result:

  • Your inbox
  • Your spam/junk folder
  • The plugin’s email log (if enabled)

If the log shows the email was sent but it never arrived, your server’s IP is blacklisted or the email is being filtered as spam. If the log shows an error on sending, the PHP mail() function is blocked or misconfigured. If no log entry exists at all, the plugin or hook that should trigger the email is not firing.

Step 2: Check If PHP Mail Is Blocked

Most managed WordPress hosts and many shared hosts block PHP’s mail() function to prevent spam. This is the single most common cause of WordPress emails not working. You can confirm by checking your hosting panel for SMTP or email settings, or by contacting support and asking if outbound PHP mail is allowed.

The fix is not to unblock PHP mail – it is to bypass it entirely with SMTP. PHP mail has no authentication, no deliverability tracking, and most modern email servers reject unauthenticated mail anyway.

Problem not solved? Describe the issue and get a free estimate.

Step 3: Configure SMTP

Install FluentSMTP (free) or WP Mail SMTP. These plugins replace PHP mail() with an authenticated SMTP connection to a real email provider. Choose a provider:

  • Gmail/Google Workspace – free, works for low volume (under 500 emails/day). Use OAuth connection, not a password.
  • Brevo (formerly Sendinblue) – free tier of 300 emails/day. No credit card needed. Good starting point.
  • Postmark – best deliverability for transactional email. $15/month for 10,000 emails. Use this for WooCommerce stores where order emails matter.
  • Amazon SES – cheapest at scale. Requires AWS account and initial setup. Worth it above 50,000 emails/month.

After configuring SMTP, send a test email from the plugin’s settings. Verify it arrives in your inbox, check the email headers to confirm it was sent via SMTP (not PHP mail), and then test specific email types: place a WooCommerce test order, submit a contact form, trigger a password reset.

Step 4: Configure SPF, DKIM, and DMARC

Even with SMTP configured, emails may land in spam if your domain lacks authentication records. These DNS records tell receiving servers your email is legitimate:

  • SPF – lists which servers can send email from your domain. Your SMTP provider’s documentation gives you the exact TXT record to add.
  • DKIM – a cryptographic signature proving the email came from your domain. Add the CNAME records your provider specifies.
  • DMARC – tells servers what to do with mail that fails SPF/DKIM. Start with: v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com

Add these in your domain’s DNS settings. After adding them, use mail-tester.com to score your email deliverability. A score of 9/10 or higher means your emails will reach the inbox reliably.

Step 5: Check the From Address

WordPress defaults to using wordpress@yourdomain.com as the from address. Many email servers reject mail from addresses that do not exist as actual mailboxes. In FluentSMTP or WP Mail SMTP, set the from address to a real email address at your domain – info@yourdomain.com, orders@yourdomain.com. This alone fixes deliverability problems for many sites.

For WooCommerce stores, set the from address in WooCommerce -> Settings -> Emails as well as in the SMTP plugin – both need to match.

Test the Full Email Path With WP-CLI

If you have WP-CLI access (available on most managed hosts), you can send a test email directly from the server without loading WordPress in a browser – useful when the admin is inaccessible or you want to isolate the sending layer:

wp eval 'wp_mail("test@yourdomain.com", "WP Mail Test", "Testing wp_mail from WP-CLI");'

If this succeeds but emails sent from the browser do not arrive, the problem is in a specific plugin hook or trigger, not in wp_mail itself. If this also fails, SMTP is not configured correctly or the server is blocking outbound connections on port 25/465/587.

Check which port your SMTP provider requires. Gmail uses 587 (TLS) or 465 (SSL). Postmark uses 587. Amazon SES uses 587 or 465. If your host blocks port 587, try 465, or ask the host to open the port for your SMTP provider’s server. Some hosts only allow outbound connections to whitelisted IP ranges.

Keep Reading

Previous Post WordPress Login Not Working: How to Regain Admin Access Next Post How to Fix “Allowed Memory Size Exhausted” in WordPress

Need Help With Your WordPress Site?

If you need help with WordPress fixes, plugin issues, theme customization, or development work, feel free to get in touch.

Get a Free Estimate