WooCommerce sends emails for almost everything – order confirmations, shipping notifications, account registration, password resets, refund notices. When these stop working, customers do not know their orders were received, new account confirmation emails never arrive, and you start getting support tickets asking what happened.
The problem is almost never WooCommerce itself. WooCommerce hands the email to WordPress, WordPress hands it to PHP, and PHP tries to send it using whatever mail configuration the server has. The failure happens at one of those handoff points – usually the PHP mail function, the hosting server’s mail configuration, or a spam filter rejecting the message before it reaches the inbox.
This guide covers every common cause and how to fix each one.
Why WooCommerce emails fail
PHP mail function limitations
By default, WordPress and WooCommerce use PHP’s built-in
mail()
function to send emails. On most shared hosting servers,
mail()
sends email directly from the server using the local mail transfer agent.
This works in theory but fails in practice for several reasons:
Spam filters reject it. Emails sent via
mail()
often have no proper authentication – no SPF record alignment, no DKIM signature. Modern spam filters treat unauthenticated email from shared hosting IP addresses with deep suspicion. Gmail, Outlook, and Yahoo routinely reject or junk these messages.
Shared IP reputation. On shared hosting, you share an IP address with hundreds of other sites. If any of them send spam, the entire IP’s reputation suffers. Your legitimate order confirmation emails get rejected because another site on the same server was flagged for spam.
Missing or misconfigured mail server. Some hosting servers are not configured to send outbound email at all. The
mail()
function returns true (meaning it accepted the message) but the message never gets delivered because there is no working mail transfer agent.
The fix for all of these is to use SMTP instead of
mail()
.
SMTP authentication not configured
SMTP (Simple Mail Transfer Protocol) sends email through a dedicated mail server that handles authentication, signing, and delivery. When you configure WooCommerce to use SMTP, emails are sent through a real email service – Gmail, Outlook, SendGrid, Mailgun, Amazon SES – rather than the server’s local mail function.
SMTP-sent emails:
- Are authenticated with the sending domain’s SPF and DKIM records
- Come from a reputable mail server IP rather than a shared hosting IP
- Have much higher deliverability than
mail()messages
Most WooCommerce email problems are solved by switching from
mail()
to SMTP.
Spam folder
Before troubleshooting further, check the spam or junk folder. Gmail, Outlook, and other providers aggressively filter email from unrecognized sources. A customer reporting they never received an order confirmation has often received it – in spam.
Ask the customer to check their spam folder and mark your email as not spam. Going forward, switching to SMTP with proper authentication prevents this.
Plugin conflicts
Security plugins, caching plugins, and some optimization plugins can interfere with WordPress’s email sending. Wordfence, for example, has email-related settings that can block outgoing mail. WP Rocket and similar caching plugins occasionally conflict with WooCommerce’s email triggers.
If emails stopped working after installing or updating a plugin, deactivate plugins one by one to identify the conflict.
WooCommerce email settings misconfigured
WooCommerce has its own email settings that control which emails are sent and to whom. It is worth checking that the emails are actually enabled and going to the right address.
Go to WooCommerce > Settings > Emails. Verify:
- Each email type is enabled (the toggle next to each email)
- The “From” name and “From” address are set correctly
- Admin notification emails are going to the right email address
A common issue: the admin email address in WordPress Settings > General differs from the WooCommerce admin email, causing notifications to go to the wrong place.
Hosting server blocking outbound email
Some hosting providers block outbound SMTP connections on port 25 to prevent spam. This affects email sent via
mail()
and via direct SMTP on port 25. The solution is to use an authenticated SMTP service on port 587 (STARTTLS) or port 465 (SSL).
How to test if WooCommerce emails are working
Before fixing anything, confirm whether the problem is that emails are not being sent at all, or that they are being sent but not delivered.
WooCommerce email preview
In WooCommerce > Settings > Emails, click the eye icon next to any email to preview it. This confirms the email template is rendering correctly, but does not test actual delivery.
WooCommerce email log
WooCommerce does not have a built-in email log, but plugins like WC Email Test or WooCommerce Email Log record every email WooCommerce attempts to send. Install one and check whether emails are being triggered and handed to WordPress.
If the log shows emails being triggered but not delivered, the problem is in WordPress’s email sending. If no emails appear in the log, the problem is in WooCommerce’s triggers.
Check PHP mail function
You can test whether
mail()
is working at the server level. Create a test PHP file (delete it immediately after testing):
php
<?php
$to = 'your-email@example.com';
$subject = 'Test email';
$message = 'This is a test.';
$headers = 'From: test@yourdomain.com';
if (mail($to, $subject, $message, $headers)) {
echo 'Mail sent successfully';
} else {
echo 'Mail function failed';
}
?>
If this returns “Mail function failed”,
mail()
is disabled or broken on the server. If it succeeds but you never receive the email, the server is accepting the message but it is being rejected or junked downstream.
Send a test email via SMTP plugin
Most SMTP plugins have a built-in test email feature. After configuring SMTP, use it to send a test email to yourself. This is the most reliable way to confirm delivery is working end to end.
Fixing WooCommerce emails with SMTP
Step 1: Choose an SMTP service
You need an email service to send through. Options:
For low volume (under 300 emails/day): Gmail or Outlook work and are free. Gmail requires an App Password if you have 2FA enabled.
For medium volume: SendGrid (100 emails/day free), Mailgun (1,000 emails/month free), Amazon SES (very cheap at scale).
For transactional email specifically: SendGrid, Postmark, and Mailgun are designed for transactional email like order confirmations and have excellent deliverability.
For a WooCommerce store, a dedicated transactional email service is the best choice. Gmail works for low-volume stores but has rate limits and requires more configuration.
Step 2: Install WP Mail SMTP
WP Mail SMTP is the most widely used plugin for this. It replaces WordPress’s default
mail()
function with SMTP.
- Go to Plugins > Add New
- Search for “WP Mail SMTP”
- Install and activate
Step 3: Configure WP Mail SMTP
Go to WP Mail SMTP > Settings.
From Email: The email address your messages come from. Use an address at your own domain (orders@yourdomain.com) rather than a generic Gmail address. This looks more professional and helps with deliverability.
From Name: Your store name.
Mailer: Select your SMTP service. WP Mail SMTP has built-in support for Gmail, Outlook, SendGrid, Mailgun, Amazon SES, and generic SMTP.
For generic SMTP (most flexible):
- SMTP Host: your provider’s SMTP server (e.g., smtp.sendgrid.net)
- Encryption: TLS
- Port: 587
- Authentication: On
- Username and Password: from your SMTP provider
For a detailed walkthrough of WordPress SMTP configuration with specific providers, see Mastering WordPress SMTP Plugins.
Step 4: Send a test email
WP Mail SMTP > Tools > Email Test. Enter your email address and click Send Test. Check your inbox (and spam folder). If it arrives, SMTP is working.
If the test fails, WP Mail SMTP shows the exact SMTP error, which tells you what to fix – wrong credentials, wrong port, authentication failure, etc.
Step 5: Verify WooCommerce emails
After SMTP is configured, place a test order using a test payment gateway or WooCommerce’s built-in order creation in the admin. Confirm the order confirmation email arrives in your inbox.
Also trigger a new account email by creating a test customer account and confirming the “confirm new account” email arrives.
Setting up SPF and DKIM records
Even with SMTP configured, emails can end up in spam if your domain’s DNS records do not authorize your SMTP provider to send on your behalf.
SPF (Sender Policy Framework) is a DNS TXT record that lists which mail servers are allowed to send email for your domain. If you are using SendGrid, for example, you add SendGrid’s SPF record to your domain’s DNS.
DKIM (DomainKeys Identified Mail) adds a cryptographic signature to every email that receiving servers can verify against a public key in your DNS. Your SMTP provider gives you a CNAME or TXT record to add to your DNS.
Both records tell spam filters that the email actually came from an authorized source for your domain. Without them, even SMTP-sent email can end up in spam.
Your SMTP provider’s documentation includes the specific DNS records to add. After adding them, verify they are correctly published using SiteProbe’s DMARC checker which also validates SPF and DKIM alongside DMARC.
WooCommerce new account confirmation emails not sending
The “confirm new account” email is a specific common issue. It is controlled by WooCommerce > Settings > Emails > Customer New Account.
Check that:
- The email is enabled
- “Send new account emails” is enabled under WooCommerce > Settings > Accounts & Privacy
- The email template is not corrupted (preview it to check)
A common cause of missing new account emails is a caching plugin that caches the registration page response before WooCommerce can trigger the email. If you use a caching plugin, add the registration and account pages to the cache exclusion list.
Another cause is a security plugin blocking account registrations or flagging them as spam attempts. Check your security plugin’s logs if new account emails stop working after installing one.
Checking server-level email logs
If you have SSH access to your server, the mail logs show what happened to each email at the server level. On most Linux servers:
bash
# On Ubuntu/Debian
sudo tail -f /var/log/mail.log
# On RHEL/Rocky Linux
sudo tail -f /var/log/maillog
Look for entries related to your domain. A successful delivery shows the message ID and “sent” status. A rejection shows the reason – “relay access denied”, “user unknown”, “connection refused”, etc.
On Hostney, outbound mail is handled exclusively through SMTP – the server does not relay email directly. This means the SMTP plugin’s own debug log is your best tool for investigating delivery failures. Enable logging in WP Mail SMTP under Settings > Debug Events, reproduce the issue, and check the log for the exact error. Access, error, and PHP logs are available in the control panel under Logs & Statistics if you need to investigate broader server-side issues alongside the SMTP debug output.
Summary
WooCommerce email failures are almost always caused by using PHP’s
mail()
function instead of authenticated SMTP. The fix is to install WP Mail SMTP, configure it with a dedicated email service like SendGrid or Mailgun, and add the required SPF and DKIM DNS records for your domain. After switching to SMTP, use the plugin’s test tool to confirm delivery before relying on it for real orders. For new account confirmation emails specifically, check that the email is enabled in WooCommerce settings and that caching or security plugins are not interfering with the registration flow.