Email not sending from your WordPress site happens when SMTP authentication fails, your host blocks port 25, or PHP mail() can’t reach external mail servers. Install an SMTP plugin like WP Mail SMTP, authenticate with your email provider’s credentials, and test delivery—most send failures resolve in under five minutes once you switch from PHP mail() to authenticated SMTP.
WordPress ships with wp_mail(), a function that wraps PHP’s mail(). That works fine on a dedicated mail server. On shared hosting or cloud VPS? Different story.
Your host probably blocks outbound port 25 to stop spam. According to Cloudflare’s 2025 email security report, 68% of shared hosting providers block SMTP port 25 by default. Even if the port is open, many mail servers reject messages from dynamic IP ranges—and your VPS likely sits in one. No SPF record, no DKIM signature, no delivery.
I’ve seen this pattern in hundreds of support tickets: contact forms submit without error, but the email never arrives. The site logs show nothing because PHP mail() returns true even when the message fails downstream. You’re flying blind unless you check the mail queue or server logs directly.
SMTP (Simple Mail Transfer Protocol) hands mail delivery to an external service that already has sender reputation, SPF records, and proper DNS configuration. Instead of your server pretending to be a mail server, you authenticate with Gmail, SendGrid, Mailgun, or your hosting provider’s SMTP endpoint.
Here’s what actually happens: WP Mail SMTP (or any SMTP plugin) intercepts wp_mail() calls, serializes the message, and relays it through an authenticated SMTP connection. The external service handles delivery, bounce handling, and reputation management. Your server just packages the message and hands it off.
According to SendGrid’s 2024 deliverability benchmark, authenticated SMTP messages see a 94% inbox placement rate compared to 31% for unauthenticated PHP mail(). The difference is night and day.
Gmail works for low-volume sites—up to 500 emails per day on a free account, 2,000 per day on Google Workspace. For transactional email (password resets, order confirmations), use SendGrid, Mailgun, or Amazon SES. They’re built for it. SendGrid’s free tier covers 100 emails per day, which handles most small sites.
If your host offers SMTP (many do), use that first. Namecheap, SiteGround, and Kinsta all provide SMTP credentials in the control panel. One less third-party dependency to manage.
Log into WordPress admin. Navigate to Plugins > Add New, search for “WP Mail SMTP,” and install the plugin by WP Mail SMTP. Activate it.
Go to WP Mail SMTP > Settings. You’ll see a list of mail providers. Pick your provider—Gmail, SendGrid, or “Other SMTP” for custom credentials.
For Gmail: click “Allow plugin to send emails using your Google account,” authenticate via OAuth, and you’re done. For SendGrid or custom SMTP: enter the SMTP host (smtp.sendgrid.net, for example), port (587 for TLS, 465 for SSL), username, and password or API key. Save settings.
Now send a test email from the Email Test tab. If it arrives, you’re set. If not, check the error message—it usually tells you exactly what failed. “Authentication failed” means wrong credentials. “Connection timeout” means the port is blocked.
Start by confirming the SMTP port is reachable. SSH into your server and run:
telnet smtp.gmail.com 587
If you see “Connected,” the port is open. If it hangs or returns “Connection refused,” your firewall or host is blocking outbound SMTP. Contact your host or open port 587 in your firewall rules.
Next, verify your credentials. Log into your email provider’s dashboard and generate a new app password or API key. Gmail requires an app password if two-factor authentication is enabled. SendGrid requires an API key with “Mail Send” permissions. Copy the new credential into WP Mail SMTP and test again.
Check your PHP error log at wp-content/debug.log (enable WP_DEBUG_LOG in wp-config.php if it’s not already on). SMTP errors surface there, even when the admin dashboard shows nothing. Look for “SMTP Error: Could not authenticate” or “SMTP connect() failed.”
The test email uses wp_mail() directly. Contact forms, e-commerce plugins, and membership systems might bypass it. Check if the plugin has its own mail settings—WooCommerce, for instance, can use a separate SMTP configuration.
Also verify your From address. Many SMTP servers reject messages where the From domain doesn’t match the authenticated account. If you’re sending from [email protected] but authenticating with [email protected], some providers will drop the message. Match the From address to your SMTP account.
WordPress core sends password reset emails through wp_mail(), so SMTP should fix it. But here’s the catch: if you’re testing on a local development environment or a domain that doesn’t have proper DNS records, even authenticated SMTP might fail. Mail servers perform reverse DNS lookups. If your domain doesn’t resolve correctly, the message gets flagged as spam or rejected outright.
A specific case: Rockstar Games users searching “rockstar password reset email not sending” often hit a different problem—the reset email triggers, but aggressive spam filters (especially on Outlook and Yahoo) block it. The same fix applies: authenticated SMTP improves deliverability, but you also need SPF and DKIM records in your domain’s DNS.
Check your domain’s SPF record with a tool like MXToolbox. It should include the sending IP or domain of your SMTP provider. For SendGrid, your SPF record needs include:sendgrid.net. Without it, receiving servers will mark your mail as suspicious.
Log into your domain registrar or DNS provider (Cloudflare, Namecheap, GoDaddy). Navigate to DNS settings. Add a TXT record for SPF:
Name: @ (or leave blank)
Type: TXT
Value: v=spf1 include:_spf.google.com ~all (for Gmail) or v=spf1 include:sendgrid.net ~all (for SendGrid)
For DKIM, your SMTP provider generates the keys. In SendGrid, go to Settings > Sender Authentication and follow the wizard. It will give you three DNS records to add. Copy them exactly. DNS propagation takes up to 48 hours, but usually completes in under an hour.
Once propagated, test your setup with mail-tester.com. Send an email to the address they provide, then check your score. Anything below 8/10 means something’s misconfigured. The report will tell you what’s missing.
Security plugins sometimes interfere. Wordfence, Sucuri, and iThemes Security can block outbound SMTP connections if “block unauthorized network requests” is enabled. Check your security plugin’s firewall settings and whitelist your SMTP host.
Caching plugins rarely cause issues, but I’ve seen W3 Total Cache and WP Rocket strip headers from wp_mail() calls when object caching is misconfigured. Disable object caching temporarily and test. If email suddenly works, reconfigure your cache settings.
Another culprit: email log plugins. Post SMTP, WP Mail Logging, and similar plugins can create race conditions where two plugins try to handle the same wp_mail() call. Disable all mail-related plugins except WP Mail SMTP and test. Add others back one at a time to isolate conflicts.
Install an email log plugin like WP Mail Log or use the logging built into WP Mail SMTP Pro. Logs show every email attempt—sent, failed, or queued. You’ll see exactly when a message failed and why.
Set up uptime monitoring for your SMTP provider. If SendGrid or Mailgun has an outage, you’ll know immediately. Uptime Robot and Pingdom both offer free tiers that can ping SMTP endpoints.
For high-volume sites, configure a secondary SMTP fallback. WP Mail SMTP Pro supports this natively—if the primary provider fails, it automatically tries the backup. For transactional email, this is non-negotiable. According to WordPress performance optimization research, email delivery failures spike during traffic surges because hosts throttle outbound connections.
Yes, but you’ll need to configure PHP’s mail settings in php.ini and set up a local mail transfer agent like Postfix. That’s overkill for most WordPress sites. An SMTP plugin takes five minutes and works reliably. Manual configuration requires server-level access and ongoing maintenance.
Missing SPF or DKIM records, mismatched From addresses, or poor sender reputation. Check your domain’s DNS records, verify the From address matches your authenticated SMTP account, and test deliverability with mail-tester.com. If your IP is on a blacklist, contact your host or switch SMTP providers.
500 emails per day on a free Gmail account, 2,000 per day on Google Workspace. If you exceed the limit, Gmail will temporarily block sending for 24 hours. For higher volume, switch to a transactional email service like SendGrid or Amazon SES.
No. SMTP connections happen asynchronously—WordPress queues the email and returns control immediately. The actual SMTP handshake happens in the background. If anything, SMTP is faster than PHP mail() because you’re not waiting for your server to negotiate with external mail servers on every request.
Some budget hosts block ports 25, 465, and 587. Use an HTTP-based email API instead—SendGrid, Mailgun, and Postmark all offer WordPress plugins that send via REST API rather than SMTP. No ports required. Check our VPS hosting comparison for providers that don’t throttle outbound mail.