wp_mail(), which relies on unauthenticated PHP mail() that hosts block and inbox providers reject. Verify your Email Action is enabled under Emails & Actions, ensure your From address matches your domain, and route mail through an authenticated SMTP plugin or an external form backend.Point any HTML form at one endpoint. 500 free submissions — no card, no time limit — and unlimited forms.
Create free accountQuick checklist: diagnose Ninja Forms email issues in 2 minutes
Before reconfiguring your server, run through this 2-minute diagnostic checklist to identify where your notification chain broke:
- Check the database: In wp-admin, navigate to Ninja Forms → Submissions. If recent entries appear, the form and database work fine; only the email notification leg failed.
- Verify Email Actions: In the form builder, open Emails & Actions and confirm the toggle next to Email Notification is switched on (green).
- Check recipient TO address: Ensure the TO field has a valid email address or an active merge tag like
{wp:admin_email}that points to an inbox you actively monitor. - Check the FROM address: The sender address must use your website's domain (e.g.,
forms@yourdomain.com), not the submitter's email address. - Inspect spam folders: Check your email client's Spam/Junk folder and server-level quarantine logs for filtered notifications.
- Run an SMTP test: Send a test email using an SMTP plugin's diagnostic tool to confirm whether WordPress core
wp_mail()can send any outbound messages.
Check the Email Action is enabled and the To address and merge tags are correct
Ninja Forms uses modular actions under the Emails & Actions tab to handle everything after a form is submitted. If your email action is turned off or misconfigured, WordPress will never even attempt to send an email.
- Action Toggle Switch: Inside the form builder, click Emails & Actions. Make sure the toggle switch beside Email Notification is active and green. If it is gray, click it to enable it and save the form.
- Recipient "TO" Field: Click the gear icon to open the action settings. If you use the merge tag
{wp:admin_email}, check Settings → General in WordPress to verify the admin email address is correct and accessible. - Merge Tag Syntax: If sending a confirmation email to the user, ensure the TO field references the correct field merge tag, such as
{field:email}. If you replaced or re-added the email field, the merge tag ID may have changed. Click the merge tag icon to select the live field from the list. - Multiple Recipients: When sending notifications to multiple team members, separate email addresses with standard commas (e.g.,
admin@example.com, sales@example.com). Trailing commas, semicolons, or typos will break the mail header parser.
From address must match your domain (SPF, DKIM, and DMARC alignment)
One of the most frequent setup errors is placing the visitor's email address into the From Address field. When your web server sends an email claiming to come from a visitor's Gmail or Yahoo address, receiving servers immediately flag the message as spoofed and reject it under DMARC enforcement.
Major mailbox providers require three authentication protocols to accept incoming mail:
- SPF (Sender Policy Framework): Verifies whether the sending server's IP address is authorized in your domain's DNS records.
- DKIM (DomainKeys Identified Mail): Adds a cryptographic signature proving the message was not modified in transit.
- DMARC: Specifies how mailbox providers should treat unauthenticated emails claiming to come from your domain.
To configure your Ninja Forms Email Action correctly:
- Set the From Address to an address on your domain, such as
notifications@yourdomain.com. - Set the From Name to your website or brand name.
- Place the visitor's email merge tag (e.g.,
{field:email}) in the Reply-To field so clicking reply in your email client answers the submitter directly.
Test your domain authentication records with our free diagnostic tools: run our SPF checker, verify cryptographic signing with our DKIM checker, and inspect your DMARC alignment using our DMARC checker.
wp_mail() and hosts that block PHP mail: use an SMTP plugin
Ninja Forms does not have its own built-in mail server; it packages notification data and calls WordPress core's wp_mail() function. By default, wp_mail() uses your web server's local PHP mail() utility.
On modern hosting environments, PHP mail is notoriously unreliable:
- Disabled PHP mail: Most managed WordPress hosts (SiteGround, Kinsta, WP Engine, Hostinger, Bluehost) block PHP
mail()or close outbound TCP port 25 to protect against spam abuse. - Poor IP Reputation: Shared hosting servers share outbound IP addresses across hundreds of sites. If one site generates spam, the entire server IP is blacklisted by spam monitoring services.
- Silent Dropping: When PHP mail fails, it drops silently without reporting errors back to Ninja Forms, giving you a false sense that messages were sent.
The proven fix is to install a dedicated SMTP plugin, such as WP Mail SMTP or FluentSMTP. Connect it to an established transactional mail provider like SendGrid, Brevo, Mailgun, Amazon SES, or Google Workspace. This routes all Ninja Forms emails through an authenticated API or SMTP connection with verified sender reputation.
Emails landing in spam: how to fix inbox placement
If your notifications are being dispatched by the server but fail to reach your inbox, spam filters are capturing them. Review our guide on why contact form emails go to spam for a deep dive into email deliverability rules.
Key factors causing Ninja Forms emails to land in spam include:
- Generic Subject Lines: Subjects like "Ninja Forms Submission" or "New Form Entry" trigger spam heuristics. Change the subject in your Email Action to include unique lead identifiers, such as
Inquiry from {field:name} - {field:subject}. - Unauthenticated Mail: Messages sent without valid DKIM keys or matching SPF records are immediately routed to Junk by Outlook and Gmail.
- Spam-Laden Message Bodies: If spambots inject pharmaceutical keywords or suspicious URLs into your form fields, the outgoing email contains those spam flags. Adding honeypot fields or form backend spam filtering eliminates this issue.
Conditional logic or AJAX submit errors
Ninja Forms uses an asynchronous JavaScript architecture (Backbone.js and Marionette.js) and optional conditional logic that can prevent emails from triggering.
Conditional Logic Conflicts
If you use the Ninja Forms Conditional Logic extension, individual Email Actions may have rules attached. For example, if an action is set to trigger only when "Department equals Sales", submissions choosing other departments will skip the email action entirely. Open the Email Action, inspect the Conditional Logic tab, and verify no restrictive rule is suppressing the message.
AJAX Submission Failures
When a user clicks Submit, Ninja Forms sends an AJAX request to admin-ajax.php or the WordPress REST API. If a theme or plugin introduces a JavaScript conflict, the submission request stalls. Open your browser's Developer Tools (F12) to the Console tab to check for script errors, and inspect the Network tab to ensure the submit POST request returns an HTTP 200 response rather than a 403 Forbidden or 500 error.
Caching and security plugin conflicts
Aggressive caching plugins and web application firewalls (WAFs) frequently interfere with dynamic form submissions in WordPress:
- Expired Nonces: Ninja Forms uses WordPress nonces for CSRF security. If your page caching plugin (WP Rocket, LiteSpeed Cache, W3 Total Cache) caches the contact page HTML for more than 12 to 24 hours, visitors submit forms with expired security nonces. Ninja Forms rejects the submission without executing email actions. Exclude form pages from your caching plugin's cache list.
- Firewall False Positives: Security plugins like Wordfence, Sucuri, or Cloudflare WAF may block requests containing specific characters, code snippets, or lengthy text submitted in message fields. Check your firewall's blocked request logs to see if form submissions are triggering false alarms.
Check Submissions in the dashboard to see whether the form saved
Ninja Forms includes built-in database entry logging through its Record Submission action. This gives you an immediate way to isolate where the failure occurred.
To check your entries, open wp-admin and navigate to Ninja Forms → Submissions. Select your form from the dropdown list.
- If entries appear in the list: The form rendered properly, all user inputs passed validation, and the entry was saved to the database. The issue is strictly isolated to the email notification pipeline (inactive action, DMARC rejection, blocked PHP mail, or spam filtering).
- If entries do not appear: The submission failed before reaching completion. Check for JavaScript console errors, caching nonce expiration, firewall blocks on
admin-ajax.php, or an inactive Record Submission action under Emails & Actions.
When to use an external form backend instead
Self-hosted WordPress form plugins require constant maintenance: database tables grow, nonces expire with page caching, and SMTP credentials can fail during server migrations or password changes. If your contact form captures vital business leads, relying on local PHP mail is an unnecessary risk.
For a permanent, zero-maintenance solution, consider moving to a spam-free WordPress contact form powered by an external form backend.
With splitforms, you point any HTML form directly to https://splitforms.com/api/submit:
- Reliable Storage: Every submission is recorded in a secure dashboard before email delivery is attempted, meaning a temporary mail issue will never lose a lead.
- Built-In Authentication: Notification emails are dispatched through high-reputation transactional infrastructure with SPF, DKIM, and DMARC handled automatically.
- Automated Anti-Spam: Intelligent spam analysis and invisible honeypots stop bots without annoying CAPTCHA challenges.
- Faster Page Speeds: Remove heavy WordPress plugin scripts and styles from your landing pages, improving Core Web Vitals and user experience.
Other form problems and fixes
- Contact form not working
- HTML form not submitting
- Form submission canceled (form not connected)
- 405 Method Not Allowed
- 401 Unauthorized
- CORS error
- Form sends but no email arrives
- Emails land in spam
- Elementor form not sending
- Gravity Forms not sending
- WPForms not sending
- mailto: action not working
- Works in preview but not live
- Netlify form not working
- Webflow form not working
- Wix form not working
- Required attribute not working
- input type=number maxlength not working
- autocomplete="off" not working
- Form resubmission on refresh
- Duplicate form submissions
Still stuck? Test your endpoint with our free Form Action Tester or contact splitforms support.
Frequently asked questions
Why does Ninja Forms say email sent when nothing arrives?
Ninja Forms considers a notification sent as soon as it hands the payload to WordPress's wp_mail() function. But wp_mail() defaults to unauthenticated PHP mail on your server. Hosting firewalls drop unauthenticated mail, and mailbox providers like Gmail reject it before it ever reaches your inbox.
Are my form submissions lost if Ninja Forms emails fail?
No, as long as the Record Submission action is enabled under Emails & Actions. In your WordPress admin, go to Ninja Forms → Submissions and select your form. All submitted entries are safely stored in the WordPress database even when email delivery fails.
Do I need an SMTP plugin for Ninja Forms?
Yes. Ninja Forms does not send email directly—it relies on WordPress. Installing an SMTP plugin such as WP Mail SMTP or FluentSMTP connected to an authenticated provider (SendGrid, Brevo, Mailgun, Amazon SES) ensures emails pass SPF and DKIM authentication.
Why does the Ninja Forms submit button spin endlessly?
A spinning submit button points to a JavaScript error, an expired nonce caused by page caching, or a security plugin/WAF blocking the AJAX request to admin-ajax.php. Open browser Developer Tools (F12) to inspect the Console and Network response.
Can I use Ninja Forms without wp_mail or SMTP plugins?
Yes. You can bypass WordPress mail entirely by pointing forms to an external form backend like splitforms. Submissions POST directly to https://splitforms.com/api/submit, entries are stored in a cloud dashboard, and email alerts are sent with SPF and DKIM handled for you.
Need help troubleshooting other WordPress form builders? Read our step-by-step guides for WPForms not sending email, Gravity Forms not sending email, and Contact Form 7 not sending emails.