How to Avoid Spam Filters with PHP mail() Emails

Just about everyone who uses PHP has encountered the popular PHPmail() function which enables email to be sent from a server. This function is preferred to other methods of sending email, such as sending mail with SMTP Authentication, because its implementation is quick and easy. Unfortunately, when using the mail() function, your emails are more likely to be marked as spam. So how can we fix this?

A Simple Implementation Example

Many users of the mail() function often have simple implementations as shown in the code sample below:

mail("", "Message", "A simple message.", "From: The Sender <>");

While this implementation will successfully send an email, the email will probably get caught in the recipient’s spam filter. Fortunately, there are some simple fixes that can help you avoid spam filters.

4 Ways To Make Your PHP mail() Emails Less Spammy

1. Use Headers

In the simple example above, the from name and email address was added as the fourth parameter. Instead, consider using headers to set your From and Reply-To email addresses.

$headers .= "Reply-To: The Sender <>\r\n";
$headers .= "Return-Path: The Sender <>\r\n";
$headers .= "From: The Sender <>\r\n";

But headers  are good for more than just setting details about the sender. They are also important for setting the content type, the email priority, and more. Here are how some additional headers look.

$headers .= "Organization: Sender Organization\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=iso-8859-1\r\n";
$headers .= "X-Priority: 3\r\n";
$headers .= "X-Mailer: PHP". phpversion() ."\r\n"

Be sure to replace the fourth parameter with the $headers variable as shown below.

mail("", "Message", "A simple message.", $headers);

2. The Message Sender Domain and Server Domain Should Match

Spammers are notorious for sending emails from one server and trying to make the recipient believe that it came from somewhere else. So if you are sending an email from, it is a good idea the the script reside on

3. Be Sure to Properly Use the Content-type Attribute

The Content-type attribute enables a message sender to say whether or not an email is plain text  or html, or whether it has attachments. Obviously, the easiest to use content type is text/plain. You just add your text as shown in the simple example, and you are done. But when you use the other content types, additional pieces might be expected. For example, with the text/html content type, an html body tag is expected. Not having this tag could result in your email being marked as spam.

4. Verify That Your Server Is Not Blacklisted

When a server is blacklisted, it means that that server has identified as one that has been sending a lot of spam. This results in recipient mail servers rejecting or filtering any mail that is received from that server.

So if your mail is not being received it is a good idea to verify that your server has not been blacklisted. This goes for both shared and dedicated servers. In a shared environment, it is common for other users on the server to be sending out spam. And in a dedicated environment, spammers may have found a way to exploit a vulnerability in a server or contact form to send out spam. So it is easy for either type of server to be blacklisted.

Alright, now that you have the basics on avoiding spam filters, reconstruct your scripts and happy emailing!