WordPress not sending email is nearly always caused by the built-in PHP mail() function, which many hosts block or which mailbox providers reject for lacking authentication. The reliable fix is to install an SMTP plugin, send through an authenticated mailbox, use a From address on your own domain, and add SPF and DKIM records.
mail(), which hosts often disable or rate-limit and which fails authentication checks.A visitor fills in your contact form and you never get the message. A customer resets their password and the email never lands. A WooCommerce order goes through but no receipt shows up. From the outside your site looks fine, yet the emails it is supposed to send quietly vanish. This is the problem people describe as WordPress not sending email, and it is frustrating precisely because nothing on screen tells you an email failed.
Take a breath: this is one of the most common WordPress issues and it is almost always fixable in under an hour. This guide is for site owners on shared or managed WordPress hosting who use contact forms, membership logins, or an online store. If you are new to how mail actually works on a domain, our guide to email hosting is the wider picture this page fits inside.
Before you change anything, narrow the cause with two quick questions. The answers point you straight at the fix and stop you from chasing the wrong plugin.
Are all emails affected, or just one plugin? If nothing arrives — contact forms, password resets, and WooCommerce receipts all fail — the problem is site-wide and sits with how WordPress sends mail (almost always PHP mail()). If only one plugin's emails fail while others arrive, the fault is more likely that single plugin's own email settings or a form misconfiguration.
Is it truly not sending, or is it landing in spam? These look identical from the dashboard but need different fixes. Send a test email to an address you control (ideally at Gmail and Outlook both), then check the inbox and the spam folder. Nothing anywhere means mail is not being delivered at all. A message sitting in spam means delivery works but your mail lacks trust signals like SPF and DKIM. An email-logging plugin makes this crystal clear by recording every send attempt.
mail() being disabled, rate-limited, or having outgoing ports blocked. The your side is the From address and plugin configuration. Switching to authenticated SMTP bypasses PHP mail() (the host issue) and lets you set a proper From address (your issue) in one move — so you rarely need to work out which side was truly at fault.Out of the box, WordPress sends every email through PHP mail() — a basic function built into the language WordPress runs on. It hands your message to whatever mail program the server happens to run, with no login and no verification of who you are. That simplicity is exactly the problem. Many hosts disable or rate-limit mail() to curb spam, so your messages never leave the server. Even when they do leave, mailbox providers like Gmail and Outlook increasingly reject or spam-filter unauthenticated mail because it looks like it could be forged.
The missing piece is authentication — proof that your domain really sent the message. That proof comes from two DNS records: SPF (Sender Policy Framework), which lists the servers allowed to send mail for your domain, and DKIM (DomainKeys Identified Mail), which cryptographically signs each message. PHP mail() supplies neither, so your mail arrives unsigned and untrusted. Beyond that core cause, a few other things commonly break WordPress email:
| Cause | What goes wrong |
|---|---|
PHP mail() disabled or limited | The host blocks or throttles the function, so messages never send or send only sometimes. |
| Mismatched From address | WordPress sends "from" a Gmail or Yahoo address on your domain, which fails authentication and gets rejected or spammed. |
| Missing SPF / DKIM | Without these records your mail has no trust signals, so providers filter it to spam or drop it. |
| Blocked outgoing ports | The host firewalls the SMTP ports mail needs, so even a correct setup cannot connect. |
| Plugin misconfiguration | A contact form or notification plugin has the wrong recipient or sender set, or conflicts with another plugin. |
The through-line is trust. Modern email delivery rewards messages that prove where they came from and punishes those that cannot. That is why the fix below centres on SMTP (Simple Mail Transfer Protocol) — the standard, authenticated way to send mail with a real login.
There is really one dependable path and a couple of choices along it. You install an SMTP plugin, then point it at somewhere that will send your mail with a proper login. That "somewhere" is either your own email host's mailbox or a dedicated transactional email service. Here is the order of attack, from confirming the fault to locking in reliable delivery:
mail().mail(), which is the single change that fixes most cases. Activate the plugin and open its setup wizard.587 with STARTTLS or 465 with SSL — your username, and your password or API key. Our guide to SMTP and IMAP ports explains exactly which port and encryption to choose.noreply@yourdomain.com — never a Gmail or Yahoo address. Mail claiming to be "from" a free provider on your domain fails authentication instantly. Enable any "force From" option so plugins cannot override it.587 and 465 are open, or use the transactional service's API mode instead of raw SMTP. Also deactivate other email-related plugins briefly to rule out a conflict. For wider server-side symptoms, our server errors guide covers what else to check.Once mail is landing reliably, keep the logging plugin active for a while so you can spot any future failures early rather than discovering them from a missed order.
mail() and hope for the best, and never set a free-provider address (like a Gmail or Yahoo address) as the From address on your own domain. Both cause silent delivery failures — the emails simply never arrive, with no error to warn you, so you find out only when a customer complains.The mistakes that keep WordPress email broken are almost always these:
mail(). It is the default, but it is unauthenticated and often blocked. Authenticated SMTP is the fix, full stop.The prevention rule is simple: always send WordPress mail through authenticated SMTP, with SPF and DKIM in place. Set this up when you build a site, not after the first missed email. Keep your SMTP plugin and its connected mailbox or service configured, and leave a From address on your own domain locked in.
Beyond that, add a DMARC record once SPF and DKIM are working, since it strengthens trust and gives you reports on how your mail is being handled. Keep an email-logging plugin active so failures surface immediately, and review your logs occasionally — especially after changing hosts, mailboxes, or DNS. A little monitoring turns email from a recurring surprise into something you can rely on.
Because WordPress sends mail by default through the PHP mail() function, which many hosts disable or rate-limit and which mailbox providers reject for lacking authentication. Other causes include a From address that does not match your domain, blocked outgoing ports, or a misconfigured contact-form plugin. The reliable fix is to install an SMTP plugin, send through an authenticated mailbox, and add SPF and DKIM records so your mail is trusted.
An SMTP plugin makes WordPress send email through SMTP (Simple Mail Transfer Protocol) — an authenticated connection with a real username and password — instead of the unauthenticated PHP mail() function. You need one because SMTP proves who is sending the message, which is exactly what hosts and mailbox providers require. Popular choices include WP Mail SMTP, FluentSMTP, and Post SMTP, and installing one fixes the majority of "not sending" problems.
Usually because your mail lacks authentication records. Without SPF and DKIM in your DNS, mailbox providers cannot confirm your domain really sent the message, so they filter it to spam. A mismatched From address (such as a Gmail address on your own domain) has the same effect. Add SPF and DKIM records from your mailbox or sending service, set a From address on your domain, and delivery to the inbox improves quickly.
Not always, but it helps for volume and reliability. Your own email host's SMTP mailbox is fine for a low-traffic contact form. If you run a store or send many password resets and receipts, a transactional service such as SendGrid, Brevo, Mailgun, or Amazon SES is built for bulk sending, keeps your reputation clean, and provides delivery logs. Either way, you still connect it through an SMTP plugin and set up SPF and DKIM.
Partly, but the fix is on your side either way. Hosts often disable or rate-limit PHP mail() and may block outgoing SMTP ports, which is a host-side limitation. The From address and plugin configuration are yours to set. Switching to authenticated SMTP bypasses the host's mail() restrictions and lets you fix the sender settings in one move, so you rarely need to decide who was to blame.
Use an email-logging or testing plugin such as WP Mail SMTP's email test or the Check & Log Email plugin, then send a test message to an address you control. Check both the inbox and the spam folder. Nothing anywhere means mail is not being delivered; a message in spam means delivery works but authentication is missing. The log also records every future send so you can confirm your fix keeps working.
Always an address on your own domain, such as noreply@yourdomain.com or hello@yourdomain.com. Never use a free-provider address like a Gmail or Yahoo address in the From field, because mail claiming to come from a free provider on your domain fails authentication and gets rejected or spammed. Set this in your SMTP plugin and enable any "force From" option so other plugins cannot override it.
WordPress not sending email looks mysterious but has a predictable cause: the default PHP mail() function is unauthenticated, so hosts block it and mailbox providers distrust it. The fix is equally predictable — install an SMTP plugin, send through an authenticated mailbox or transactional service, set a From address on your own domain, and add SPF and DKIM so your mail is trusted, testing after each step. To get the ports and encryption right the first time, read our guide to SMTP and IMAP ports next. If you want to zoom out to how mail works across your whole domain, the email hosting guide is the hub for this category.
wp_mail() and the default PHP mail() transport.The editorial team behind the Bitrich777 Hosting Help Center — practical, tested guides on web hosting, WordPress, servers, DNS, SSL, email, security and migration. Every walkthrough is reproduced on a live host before it is published.
View all guides by the Hosting Team Spotted an error? Tell us