splitforms.com
← Back to the journal

WPForms Not Sending Email? 6 Fixes That Work (2026)

WPForms notifications not arriving? Find the wp_mail cause in 2 minutes, then fix it with six ranked steps, from SMTP setup to a plugin-free form.

Start free — 500 submissionsSee pricing →No card, no time limit. Pro is $5 per month.
Short answer
WPForms almost certainly records the entry — the email leg fails. Notifications go through WordPress's wp_mail(), which uses your host's unauthenticated PHP mail(). Confirm the notification is on under WPForms → Settings → Notifications, then fix delivery with an SMTP plugin (quick) or a plugin-free form endpoint that owns SPF/DKIM and stores every entry (permanent).
Try it on your own form

Point any HTML form at one endpoint. 500 free submissions — no card, no time limit — and unlimited forms.

Create free account

The root cause: wp_mail() and unauthenticated PHP mail

When a visitor submits a WPForms form, the plugin validates the fields, creates the entry, and then asks WordPress to send each active notification. WordPress routes that through wp_mail(), which by default calls the server's PHP mail() function. That last hop is where WPForms emails die:

  • Many shared hosts disable or throttle outbound PHP mail to fight spam abuse.
  • The message is sent unauthenticated — no SPF/DKIM alignment — from an IP shared with other sites, so Gmail and Outlook spam-folder it by default.
  • Failures are silent: WPForms logs the notification as sent because wp_mail() accepted it, but no bounce or error reaches wp-admin.

This is the same plumbing behind every "form works but no email arrives" report — the Elementor version and the Gravity Forms version fail identically, just in a different plugin. The entry itself is almost always saved, so the lead is not gone; only the notification email is.

The 2-minute check: WPForms → Settings → Notifications

  1. Open WPForms → Settings → Notifications for the form in question. Confirm the Notifications toggle is on, the Send To Email Address is correct, and the default {admin_email} smart tag points at the inbox you actually read. Check any conditional logic on the notification — a rule that doesn't match the submission means the notification simply never fires.
  2. Open WPForms → Tools → Email Logs (only available once an SMTP plugin is installed) and read the send record: recipient, provider and status tell you where the message stopped.
  3. Send a test email with an SMTP plugin's built-in test tool (WP Mail SMTP and FluentSMTP both have one). If that test also never arrives, the failure is WordPress-level mail, not your WPForms configuration.
  4. Check spam/junk folders on the receiving address, including any "From" domain mailbox that differs from the recipient.

Six fixes, ranked

1. Set the From Email to your own domain — and put the visitor in Reply-To

In the notification settings (and in WPForms' global email settings), set From Email to an address on a domain you control — e.g. forms@yourdomain.com — instead of the default wordpress@yourdomain.com, which often fails DMARC because your DNS does not authorize the host to send for that domain. Then put the visitor's email address in the Reply-To field using the {field_id} smart tag for the email field, so replies still go to the person who filled in the form. Necessary, but rarely sufficient on shared hosting by itself.

2. Install an SMTP plugin and connect a real mail provider (the standard fix)

Install WP Mail SMTP or FluentSMTP and connect Gmail/Google Workspace, Brevo, Mailgun, or Amazon SES. Now wp_mail() — and therefore every WPForms notification — sends through an authenticated account with proper SPF/DKIM instead of the host's PHP mail, and notifications start landing in the inbox. Use the plugin's test-email tool afterwards to confirm. Cost: a plugin to maintain plus SMTP credentials to secure.

3. Publish SPF, DKIM and DMARC records for your domain

Even authenticated mail can spam-folder if your DNS doesn't say your sender is allowed to send for your domain. Add an SPF record covering your provider, enable DKIM signing at the provider and publish the keys in DNS, and add a DMARC policy (start with p=none and monitor). Check each record with the free SPF checker, DKIM checker, and DMARC checker.

4. Rule out caching or security plugins blocking the submission

If the form sometimes submits and sometimes doesn't — or the entry is created but the notification never fires — a caching plugin serving stale HTML or a security plugin blocking the AJAX request can be the cause. Temporarily disable page caching and security/anti-spam plugins, resubmit the form, and confirm the notification fires. If it does, re-enable them one at a time and allowlist the form's AJAX endpoint.

5. Re-check multiple notifications and conditional logic

If emails arrive for some entries and not others, the notification's conditional logic is the culprit: WPForms can hold several notifications on one form, each with its own on/off toggle and conditional rules. Edit the notifications under WPForms → Settings → Notifications and verify each rule matches real submissions, that the "Send To Email Address" field contains the right address (watch for a stray comma creating a bad recipient), and that no smart-tag typo broke the routing.

6. Go plugin-free: point a plain HTML form at a form endpoint (the permanent fix)

If you would rather not depend on wp_mail at all, drop WPForms for the form and point a plain HTML form at a hosted endpoint. With splitforms, the form POSTs to https://splitforms.com/api/submit with a hidden access key: every accepted entry is stored in a searchable dashboard (so a mail failure can never lose a lead), spam is filtered by automatic spam scoring plus a honeypot, and owner notifications are sent from deliverability-managed infrastructure with SPF, DKIM and DMARC handled for you. Free for 500 submissions total. See adding a contact form to WordPress without a plugin and the free contact form page for the snippet.

Make "email failed" mean "nothing lost"

The uncomfortable truth about email-only notifications: email is a delivery channel, not a database. Any form stack that keeps the only copy of a submission inside an email will lose leads — to spam folders, throttled hosts, full mailboxes, and expired SMTP passwords. Whatever fix you choose, make sure entries are also stored somewhere queryable: WPForms' own Entries screen already does this, and a form backend dashboard does it with notifications on top. Then a bad mail day costs you nothing.

Other form problems and fixes

Still stuck? Test your endpoint with our free Form Action Tester or contact splitforms support.

FAQ

Why does WPForms say the notification was sent but nothing arrives?

WPForms marks a notification as sent once it hands the message to WordPress's wp_mail() function — that only means the request was accepted, not that the email was delivered. wp_mail() by default uses your host's PHP mail(), which is unauthenticated and often blocked, throttled, or spam-foldered by receiving mail servers. Check WPForms → Settings → Notifications to confirm the notification is on and routed to the right address, review the email logs if an SMTP plugin is installed, and send a test email from your SMTP plugin's test tool to see whether WordPress-level mail is the failing leg.

Does WPForms need an SMTP plugin?

Not strictly, but on most shared hosts it is the reliable fix. WPForms sends through wp_mail(), so installing an SMTP plugin such as WP Mail SMTP or FluentSMTP and connecting a real mail provider (Google Workspace, Brevo, Mailgun, Amazon SES) gives the notifications proper SPF/DKIM authentication instead of the server's unauthenticated PHP mail. You then own the SMTP credentials and the provider's deliverability settings.

Why do WPForms emails go to spam?

Because they leave your web server through PHP mail() with no SPF/DKIM alignment, often from an IP shared with many other sites, and often with a From address like wordpress@yourdomain.com that fails DMARC. Mailbox providers treat that unauthenticated, shared-IP mail as suspicious by default. Send through an authenticated provider (an SMTP plugin), set the From Email to an address on your own domain, and publish SPF, DKIM and DMARC records for that domain.

Can I use WPForms without wp_mail?

Yes — bypass WordPress mail entirely and point a plain HTML form at an external form endpoint. With splitforms, the form POSTs to https://splitforms.com/api/submit, every accepted entry is stored in a searchable dashboard before the owner notification email is attempted, spam is filtered by automatic spam scoring plus a honeypot, and delivery runs on managed infrastructure with SPF, DKIM and DMARC handled for you. Delivery time and inbox placement depend on provider and recipient settings, and the saved dashboard record remains available if email fails. See the plugin-free WordPress guide and the free contact form page.

Stop depending on wp_mail — point your form at https://splitforms.com/api/submit and every lead is stored, filtered, and emailed. Get a free access key.

Related: Elementor form not sending email, Gravity Forms not sending email, contact form works but no email, and the free contact form.

Related articles

More practical guidance from guides.

Browse the journal →
Guides

Ninja Forms Not Sending Email? 8 Fixes for WordPress

Ninja Forms notifications not arriving? Learn why wp_mail fails, how to check email actions…

7 min readRead →
Guides

Netlify Form Not Working? 7 Fixes for Missing Submissions

Netlify form not showing submissions or returning 404? Check the 7 causes, from missing data…

7 min readRead →
Guides

Webflow Form Not Working? 8 Fixes That Actually Work

Webflow form not submitting or no email arriving? Work through 8 checks, from publishing and…

8 min readRead →

Building forms with ChatGPT, Claude, Cursor, or v0? Connect the native MCP server and give your agent a production form backend.

Explore the MCP server →

Give your form a production backend.

One endpoint adds delivery, spam filtering, storage, and integrations. Start with 500 free submissions — no card, no time limit.

Create free accountRead the docs →
Secure checkoutSSL encryptionPrivacyProtected
VISAAMERICANEXPRESSstripe