How to Fix WordPress Emails Not Sending: A Practical SMTP Guide
Your site is live. Orders come in. Contact forms get submitted. But none of the confirmation emails reach anyone.
This is one of the most common WordPress problems, and it has a clear cause. WordPress sends email through your web server's PHP mail function by default. That function sends messages without any authentication. Most modern email providers — Gmail, Outlook, Yahoo — reject unauthenticated email or route it straight to spam.
The fix is to switch WordPress to use SMTP (authenticated email) instead. This guide walks through that fix, plus the specific steps for contact form emails, WooCommerce order emails, DNS authentication records, and email logging so you can catch failures before customers notice.
Before You Start
| Item | Notes |
|---|---|
| Admin access | You need WordPress admin access to install plugins and change settings. |
| Domain-based email | You need an email address at your own domain (e.g., [email protected]). Free addresses like @gmail.com or @yahoo.com will not work as a From address. |
| DNS access | To set up SPF, DKIM, and DMARC you need access to your domain's DNS settings, usually through your registrar or hosting control panel. |
| Backup recommended | The SMTP plugin and DNS steps do not touch your database or files. However, plugin conflict testing (Step 8) requires deactivating plugins on a live site, which can affect customers. Create a full backup before doing conflict tests on a production store or booking site. The FS Code roundup of best WordPress backup plugins covers reliable free and paid options. |
| Estimated time | 20 to 40 minutes depending on whether you need DNS changes. DNS propagation can take up to 24 hours after you make changes. |
Quick Fix Summary
- Check spam/junk folder and confirm WordPress admin email is domain-based.
- Send a test email using a free plugin to confirm the sending problem.
- Install an SMTP plugin (WP Mail SMTP or FluentSMTP).
- Connect the SMTP plugin to a transactional email provider.
- Force a consistent From email address through the SMTP plugin.
- Verify SPF, DKIM, and DMARC DNS records for your domain.
- If emails from a specific form or plugin are still missing, fix the From address in that plugin's settings.
- For WooCommerce: check email notification toggles and order status.
- For booking/appointment plugins: verify notification is enabled, use a domain From address, and run a test booking.
Step 1: Check the Basics First
Before changing anything, confirm what is actually happening.
Check the spam/junk folder. Most email clients have a separate spam folder. Ask the recipient to check there. If you find the email in spam, that confirms delivery is working but authentication is failing. Mark it as Not Spam and continue to fix the root cause.
Check your WordPress admin email. Go to Settings > General and look at the "Administration Email Address" field. It should be an address at your own domain, not a free email address like Gmail or Yahoo. If it is a free address, that alone causes delivery failures. Since February 2024, Google and Yahoo reject email claiming to originate from their domains unless the message passes their own authentication (DMARC p=reject). Your server cannot pass that check because it is not their server.
Send a test email. Install the free Check Email plugin from WordPress.org. Go to Tools > Check Email, enter a recipient address, and send. Check both inbox and spam folder.
If the test email does not arrive at all (not even in spam), the problem is at the server level. PHP mail() is either blocked or silently failing. Continue to Step 2.
Step 2: Understand Why WordPress Email Fails
WordPress uses a function called wp_mail() to send all email. Under the hood, wp_mail() uses a library called PHPMailer. By default, PHPMailer sends messages through your hosting server's PHP mail() function.
That is the problem. PHP mail() sends email without authentication. Receiving servers have no way to verify that the message legitimately came from your domain. The result is rejection or the spam folder.
There are three common server-level blocks:
- Port 25 is blocked. Most managed hosts (including Kinsta and WP Engine) block outbound port 25 to stop spam. PHP mail() defaults to port 25, so messages never leave the server.
- Shared IP on a spam blacklist. On shared hosting, your server's IP is shared with other customers. If any of them sent spam, the IP may be blacklisted. Any PHP mail() sent from that IP is flagged before your domain or content is even read.
- No authentication headers. Without SPF, DKIM, or DMARC alignment, major email providers treat the message as potentially spoofed and reject it.
The fix for all three is the same: route WordPress email through an authenticated SMTP connection rather than PHP mail(). An SMTP plugin handles this by hooking into wp_mail() and redirecting all outgoing email through a proper email service.
Step 3: Install an SMTP Plugin
Two free plugins cover this well.
WP Mail SMTP — 4+ million active installs, 4.8/5 rating on WordPress.org. The free version supports 15+ mailer integrations, a setup wizard, force From email, and a test email tool. Email logging requires the paid version.
FluentSMTP — 600,000+ active installs, 4.8/5 rating. Completely free and open source with no paid tier. Includes full email logging and resend capability in the free version, plus failure alerts via Slack, Telegram, or Discord.
Install either one from the WordPress.org plugin directory. Go to Plugins > Add New and search by name.
After activation, each plugin runs a setup wizard. You can use the wizard or configure settings manually. The next step covers which provider to connect.
Step 4: Connect to an SMTP or Transactional Email Provider
Once the SMTP plugin is installed, connect it to an email service. The plugin replaces PHP mail() with an authenticated connection to that service. All WordPress email — from WooCommerce, contact forms, booking plugins, password resets — then routes through it.
Free provider options:
| Provider | Free limit | Notes |
|---|---|---|
| Brevo (formerly Sendinblue) | 300 emails/day | Generous free tier. Supports sending from any address on your authenticated domain. Easy setup with WP Mail SMTP. |
| Mailgun | 1,000 emails/month for 3 months, then paid | Developer-friendly. Requires domain verification with DNS records. |
| SendGrid | 100 emails/day on free | Reliable. Requires sender verification. |
| Gmail / Google Workspace | Free with Google account | Works well for low-volume sites. Requires OAuth setup or an App Password if using 2FA. Not ideal for high-volume or WooCommerce stores. |
Port settings if configuring generic SMTP:
| Port | Encryption | Status |
|---|---|---|
| 25 | None | Blocked on most managed hosts — do not use |
| 587 | STARTTLS | Recommended for authenticated outgoing mail |
| 465 | SSL/TLS | Supported by most providers |
| 2525 | STARTTLS | Fallback when 587 and 465 are blocked |
Use port 587 with STARTTLS unless your provider specifies otherwise.
After connecting, use the test email tool inside the SMTP plugin to confirm delivery. Check inbox and spam folder for the test message.
Step 5: Set a Consistent From Email Address
Even with SMTP configured, emails can still fail if the From address does not match your authenticated domain.
Both WP Mail SMTP and FluentSMTP include a "Force From Email" setting. Enable it and set the From address to an address at your domain (for example, [email protected] or [email protected]).
"Force From Email" overrides whatever From address individual plugins try to use. Without it, a contact form plugin might send from the visitor's submitted email address. A booking plugin might use a different admin address. The inconsistency causes authentication failures.
Set it once and every plugin on your site benefits.
Also set a "From Name" that is recognizable, such as your business name. This is what recipients see in their email client before they open the message.
Step 6: Check SPF, DKIM, and DMARC Records
SMTP handles authentication at the sending level. DNS records handle authentication at the domain level. You need both.
What each record does
SPF (Sender Policy Framework) is a DNS TXT record that lists which servers are allowed to send email from your domain. When Gmail receives an email claiming to be from yourdomain.com, it checks your SPF record to see if the sending server is authorized. If not, the email fails the SPF check.
DKIM (DomainKeys Identified Mail) adds a cryptographic signature to outgoing email. The signature is generated using a private key held by your email provider and verified against a public key stored in your DNS. This confirms the message was not tampered with in transit.
DMARC (Domain-based Message Authentication, Reporting and Conformance) ties SPF and DKIM together. It tells receiving servers what to do when email from your domain fails both checks: monitor only (p=none), send to spam (p=quarantine), or reject (p=reject). It also sends daily reports to an address you specify, showing authentication results across all email sent from your domain.
Why they matter in 2026
Since February 2024, Google and Yahoo have required authenticated email from bulk senders. These requirements remain in effect. Without valid SPF, DKIM, and DMARC, emails to Gmail and Yahoo inboxes are increasingly rejected or spam-folded regardless of your SMTP setup.
How to set them up
Your SMTP provider generates the required DNS records when you authenticate your domain. The exact records vary by provider. Log into your provider's dashboard, find the domain authentication section, and follow their setup guide. They will give you the TXT records to add to your DNS.
Add the TXT records in your domain registrar or hosting control panel. DNS changes take anywhere from a few minutes to 24 hours to propagate.
To verify your records are working:
- Send a test email to a Gmail address. In Gmail, click the three-dot menu next to the reply button and select "Show original." Check for
spf=pass,dkim=pass, anddmarc=passnear the top. - Or use mail-tester.com — it gives you a unique test address, sends a score out of 10, and shows exactly which authentication checks passed or failed.
- Or use MXToolbox to inspect your SPF and DKIM records directly without sending an email.
Step 7: Fix Contact Form Emails
Contact form emails have a specific problem that SMTP alone does not fully solve: the From address.
By default, many contact form plugins set the From address to the email the visitor typed into the form. That means your server tries to send email "from" someone else's Gmail or Yahoo address. Those providers run strict DMARC policies. Your server cannot authenticate on their behalf, so the email is rejected before it ever arrives.
The fix: In your contact form plugin's mail settings, change the From address to a domain address you control (e.g., [email protected]). Put the visitor's email in the Reply-To field instead. This way, clicking Reply in your email client still goes to the person who submitted the form.
Contact Form 7 specifically:
In CF7, go to your form, click the Mail tab, and look at the "From" field. Change it to something like:
Your Business Name <[email protected]>
Set the "Reply-To" field to [your-email] (the form field that captures the visitor's email).
Note: CF7 version 6.1.5 (released February 2026) tightened sanitization of the Additional headers field as a security fix against email header injection. If you added custom headers in a loose format, the new validation may silently drop them. Each header must be on its own line in exact Header-Name: value format. If emails stopped sending after a CF7 update, check your Additional headers field for any malformed Reply-To, Cc, or Bcc lines.
WPForms, Gravity Forms, Formidable, and other builders all have similar From address fields in their notification settings. Apply the same fix: use a domain-based From address, visitor email in Reply-To.
For more on evaluating form plugins, see the FS Code roundup of WordPress contact form plugins.
Step 8: Fix WooCommerce Emails Not Sending
WooCommerce sends all its transactional email through wp_mail(), the same function used by everything else. Once SMTP is configured via Step 3 and 4, most WooCommerce email problems resolve automatically.
If WooCommerce emails are still missing after SMTP is set up, check these specific causes:
1. Email notifications are disabled
Go to WooCommerce > Settings > Emails. Each email type has an "Enable this email notification" checkbox. Verify the relevant ones are ticked:
- New Order (sent to admin)
- Processing Order (sent to customer after payment)
- Completed Order (sent to customer when order is marked complete)
- Customer Invoice
- Failed Order
It is easy to accidentally disable one of these during a plugin update or settings reset.
2. Order is stuck in Pending Payment
WooCommerce does not send a customer email for "Pending Payment" orders. The processing email triggers only when the order status moves to "Processing" (typically after successful payment). If a customer abandoned the payment page or if a payment gateway returned an ambiguous response, the order may stay pending and never trigger an email.
Check the order status in WooCommerce > Orders. If an order should have triggered an email, open it and manually change the status to "Processing" or "Completed" as appropriate. You can also resend the email from the order detail page using the Order actions dropdown.
3. Check the WooCommerce email log
WooCommerce logs email delivery in WooCommerce > Status > Logs. Select the "transactional-emails" log from the dropdown. Each line shows:
- INFO — email was sent
- WARNING — email failed (with an error message)
- NOTICE — email was disabled or skipped (often because the notification checkbox is off or the recipient field was empty)
The log is the fastest way to see if WooCommerce is even attempting to send the email, or if something upstream is blocking it.
4. Plugin or theme conflict
Before doing conflict testing on a live store, take a full backup and consider running the test during a low-traffic window or on a staging copy. Deactivating plugins briefly on a live WooCommerce site can affect the checkout experience for active customers.
Once you are ready: deactivate all plugins except WooCommerce and your SMTP plugin. Test by placing a new order. If email arrives, reactivate your remaining plugins one at a time and retest after each to identify the conflicting plugin.
5. Custom email template errors
If you have a customized WooCommerce email template in your theme's woocommerce/emails/ folder, a PHP error in the template can silently stop email sending. To test this, rename the woocommerce/emails/ folder in your theme temporarily. WooCommerce will fall back to its default templates. If email starts working, the issue is in your custom template.
For more on configuring WooCommerce, see the FS Code guide to setting up a WooCommerce store.
Step 9: Fix Booking and Appointment Plugin Emails
Booking plugins (such as appointment schedulers and service-booking tools) send confirmation and reminder emails through wp_mail(), just like WooCommerce and contact forms. Once SMTP is configured globally via Step 3 and 4, those emails route through it automatically. If they are still missing, work through these checks.
1. Verify the notification is enabled
Open your booking plugin's settings and find its email or notification section. Each email type — booking confirmation, cancellation, reminder — usually has its own enable/disable toggle. Confirm the relevant ones are switched on.
2. Check the From address
The From address in your booking plugin's email settings must be a domain-based address, not a free email provider. If it is set to @gmail.com or @yahoo.com, change it to [email protected] or your admin address. Put the customer's email in the Reply-To field if the plugin supports it.
3. Run a test booking
Submit a test booking yourself using a real email address you can check. Use a different email address than the From address. Check both inbox and spam folder.
4. Check the email log
After the test booking, open your SMTP plugin's email log (FluentSMTP > Email Logs, or the log in WP Mail SMTP Pro). Look for the booking confirmation email. If it appears with a sent status, the problem is at the receiving end. If it is missing from the log entirely, the booking plugin may not be triggering wp_mail() correctly — check whether the plugin has its own SMTP settings that override the global configuration.
5. Contact plugin support if needed
Some booking plugins have their own email queue or trigger logic that is separate from standard WordPress email hooks. If your SMTP plugin's log shows no activity after a test booking, contact the booking plugin's support team with that information. They can confirm whether their plugin uses wp_mail() or a custom mail path.
Step 10: Enable Email Logging
Email logging lets you confirm whether WordPress actually sent a message, catch failures before customers report them, and resend specific emails without asking customers to reorder or resubmit forms.
FluentSMTP (free): Logging is enabled in the plugin's settings. Go to FluentSMTP > Email Logs. You can see each sent email with timestamp, recipient, subject, and status. Failed emails are flagged and can be resent from the log.
WP Mail SMTP Pro: Logs are available in the paid version with full delivery status, open/click tracking, and weekly summaries.
WP Mail Logging (free, separate plugin): Available on WordPress.org. It logs the content, recipient, and headers of every wp_mail() call. Lightweight and useful if you are already using FluentSMTP's free tier but want a second layer of visibility.
If email logging shows messages as sent but they are still not arriving, the problem is at the receiving end (spam filtering, blocklists, or recipient email configuration). Use mail-tester.com to score your authentication setup.
If This Does Not Work
SMTP is configured but test emails still fail
Check that the From email address in your SMTP plugin matches the domain you authenticated with your provider. A mismatch between the From address domain and the SMTP provider's authenticated domain causes immediate rejection. For example, if your SMTP connection is authenticated for yourbusiness.com but the From address is set to @gmail.com, the send will fail.
Email arrives in spam even after SPF and DKIM are set
Check whether your domain is on a spam blacklist using MXToolbox Blacklist Check. If your IP is listed, contact your hosting provider. They can request delisting on your behalf or reassign you to a different IP. Using a dedicated transactional email provider (Brevo, SendGrid, Mailgun) avoids this problem because your mail goes out through their trusted IPs, not your hosting server's IP.
WooCommerce emails missing for specific order types only
Check the notification settings for that specific email type in WooCommerce > Settings > Emails. Also verify the recipient field is filled in. Some notifications (like "New Order") go to the admin email; others go to the customer. If the customer email was not captured correctly at checkout, the notification has no destination and is silently skipped.
Contact form emails are arriving but going to the wrong address
Check the "To" field in your contact form plugin's mail tab. It should be your admin email address. Some plugins allow multiple recipients separated by commas. Confirm the address is correct and not a placeholder like [email protected] from an imported demo.
Emails work from a staging site but not production
This is often a domain mismatch. The staging site may be sending from a staging subdomain that is not in your production SPF record. Confirm the From address and SMTP credentials match the production domain, and that the production domain has the correct DNS records.
Common Mistakes to Avoid
- Using a free email address as the From address. Setting
@gmail.comor@yahoo.comas your WordPress From email is the single most common cause of rejected email. Always use an address at your own domain. - Skipping DNS records. Installing an SMTP plugin and configuring a provider is not enough if your SPF, DKIM, and DMARC records are missing or misconfigured. Authentication happens at the DNS level; SMTP configuration alone does not set this up.
- Checking only the inbox, not spam. Always check the spam or junk folder before concluding an email was not sent. Finding it in spam tells you delivery works but authentication needs fixing — which is a completely different problem than no delivery at all.
- Testing with the same email domain as the From address. Sending a test from
[email protected]to[email protected]can give a false positive. Test with an external address (Gmail, Outlook) to simulate a real recipient. - Forgetting WooCommerce email notification toggles. Each email type in WooCommerce > Settings > Emails has its own enable/disable switch. A settings migration or plugin update can silently uncheck these.
- Leaving PHP mail() active alongside SMTP. Some plugins bypass
wp_mail()entirely and use PHP mail() directly. If a plugin does this, the SMTP plugin cannot intercept it. Check the sending plugin's own SMTP settings if its emails still fail after SMTP is configured globally. - Not testing after DNS changes. DNS propagation takes time. Test 24 hours after making SPF, DKIM, and DMARC changes rather than immediately. Early tests may show stale records and give a false failure reading.
When to Ask for Help
Contact your hosting provider when:
- Your server's IP is on multiple spam blacklists and you need a different outbound IP.
- PHP mail() is completely blocked and the host has not documented an alternative port.
- Email was working and stopped after a server-side change you did not make.
Contact your SMTP provider's support when:
- Authentication is configured but the provider's dashboard shows no sending activity, suggesting the connection is not reaching them.
- Your domain fails DKIM verification after 48 hours and you have confirmed the DNS records are entered correctly.
- Sending limits on the free tier are causing delivery delays during high-volume periods (WooCommerce sales, booking confirmations).
Contact a WordPress developer or plugin support when:
- A specific plugin is bypassing
wp_mail()and you cannot find its own SMTP settings. - WooCommerce email templates in your theme contain PHP errors you cannot identify.
- Email failures only appear in production, not staging, and you have ruled out domain and credential mismatches.
Final Checklist
Before closing the issue:
- WordPress admin email is a domain-based address, not a free email provider
- SMTP plugin is installed and connected to an email provider
- "Force From Email" is enabled with a domain-based From address
- Test email confirmed delivered (check both inbox and spam)
- SPF record is set in DNS and verified as passing
- DKIM record is set in DNS and verified as passing
- DMARC record is set in DNS
- Contact form From addresses changed to domain-based (visitor email in Reply-To)
- WooCommerce email notification toggles checked (if applicable)
- WooCommerce order status confirmed (not stuck in Pending Payment)
- Email logging enabled so future failures are caught early
- Final test email confirmed as
spf=pass dkim=pass dmarc=passin Gmail headers or via mail-tester.com
If your site regularly sends booking confirmations or appointment reminders, check that those notifications are also routing through your SMTP plugin by reviewing the email log after a test booking. The FS Code WordPress maintenance checklist includes email testing as a monthly task — a quick test email and log review once a month catches delivery problems before customers do.