If visitors fill out your contact form but you never receive the message, the most common cause isn't your inbox or your spam filter: it's how your website is trying to send the email in the first place. Many websites, especially custom-built or older PHP sites, use a basic built-in function to send mail instead of a properly authenticated connection. Shared hosting servers increasingly block or deprioritize that method to stop spam, so your form can submit successfully on the visitor's side while the email never arrives on yours.
If your site runs on WordPress, see How to Fix WordPress Not Sending Emails for WordPress-specific steps. This article covers the underlying cause and the fix for any website, including custom-built sites.
Common Reasons a Contact Form Fails to Send
- The site uses PHP's built-in mail() function, which sends without logging in to a real mailbox and is easy for spam filters to reject.
- The form's From address is a placeholder (like [email protected]) that doesn't match any real, authenticated mailbox.
- Your domain is missing SPF or DKIM records, so receiving mail servers can't confirm the message is genuinely from your domain.
- The destination mailbox is full, suspended, or the address was typed incorrectly in the form's code.
- A security plugin or firewall on the receiving end is quarantining the message before it reaches the inbox.
How to Check What's Actually Happening
- Submit a test message through the form yourself and note the exact time.
- Check the Spam or Junk folder of the destination mailbox, not just the inbox.
- Look at your server's mail delivery log to see whether the message was sent, deferred, or rejected, and why.
In cPanel
Go to Email and open Email Deliverability (older accounts may show this as Track Delivery). Search for the time you sent your test message to see its delivery status and any error returned by the receiving server.
In DirectAdmin
Go to the Email section and open the Message Log or Mail Queue. Look for your test message around the time you sent it to see whether it left the server and what response, if any, came back.
If the log shows nothing at all for your test message, the problem is in the website's code, not mail delivery: the form likely isn't calling a mail function correctly, or is failing silently before it even attempts to send.
How to Fix It
- Switch the form from PHP's mail() function to authenticated SMTP. For a CMS, install a dedicated SMTP plugin and configure it with your real email account's host, port, username, and password. For custom PHP code, use a library such as PHPMailer configured the same way, rather than calling mail() directly.
- Use a real mailbox you control as the From address, ideally one on the same domain as your website, instead of a made-up placeholder address.
- Make sure your domain has valid SPF and DKIM records so receiving servers trust mail sent from it. See How to Set Up SPF and DKIM Records for the steps.
- Confirm the recipient address in the form's settings or code is spelled correctly and that the mailbox isn't full or suspended.
- If none of the above resolves it, contact support: the mail() function may be disabled at the server level for your account, and support can confirm whether SMTP is the required path going forward.
Avoid using a free webmail address (like one ending in a well-known free email provider's domain) as the From address on your form. Receiving servers treat an unauthenticated message claiming to be from another provider's domain as likely spoofed. This is one of the quieter reasons forms that seem to send still never arrive.