In theory, sending email with PHP’s mail() function should be a piece of cake. There are only 3 pieces to ‘mail()’: a recipient, subject, and message, and the email is delivered with just one line of code. 

But, like many things that seem so simple, PHP’s mail() function doesn’t always work so seamlessly, and it can be challenging to pinpoint why. It could be, for example, because you’re missing necessary parameters, have typos in your recipient’s email address, or need to set up an SMTP relay

Out of all the possible options as to why your PHP mail() isn’t sending email, we found that most issues stem from Postfix being configured incorrectly. We’ll go into more detail on Postfix, how to set it up correctly, and test it to make sure your mail is sending. 

What is Postfix?

Postfix is a free, open-source mail transfer agent that routes and delivers emails. It follows the SMTP protocol and runs on Unix-like operating systems, including macOS.

Postfix is used widely, so much so, that it comes pre-installed on most non-Windows computers. While it’s handy to have Postfix pre-installed, it can mean that it hasn’t been configured correctly causing your PHP mail() to malfunction.

How do you configure Postfix?

Before we test whether or not Postfix has been configured correctly, let’s first test to see it has been installed.

In your terminal, run the following command:

Any errors outputted during this time may provide some insight into what’s not working. But, if you get a response that shows it has been installed, feel free to move on to the next section. 

If it hasn’t been installed, check out the Postfix documentation or contact your host for installation instructions.

Postfix has a few requirements that must be met before emails will send correctly. 

First, modify your local Postfix configuration. You can load an editor directly from your terminal by running the following command:

Once open, check to make sure that the following 4 variables are defined as follows:

And voila! Save the changes and restart Postfix using `sudo postfix reload`.

We’ve found that the most important of these variables is `myhostname`. If you don’t define this variable, your local environment is unable to assign a default location to send the email from. Use a real domain or something arbitrary (like in the example above) to fulfill this value.

How to test Postfix and PHP mail()

To test that Postfix is working and subsequently PHP `mail()`, we’ll create a simple script to run. In your favorite text editor or integrated development environment (IDE), create a file called `mail.php` and include the following code:

Be sure to replace the `$to` variable with your actual email address. In your terminal, run the program using the following command and check your email:

Wrapping up

Sending email with PHP mail() is pretty simple, which makes it even more frustrating when it isn’t functioning correctly. Keep your Postfix configuration in mind when you run into errors while sending.

Ask yourself:

  1. Is Postfix installed on your computer?
  2. Do you have the 4 variables defined, in particular ‘myhostname’?
  3. Did you add your email address (and spell it correctly) when testing?

If you’re still having issues with PHP mail() not sending email, check out this response on StackOverflow for additional troubleshooting ideas. 



SendGrid Team
Expert advice and insight about all things email including best practices tips, examples, and advice for marketers, developers, and everyone in between.