Postfix is an MTA (Mail Transfer Agent), an application used to send and receive email. In this tutorial, we will install and configure Postfix so that it can be used to send emails by local applications only – that is, those installed on the same server that Postfix is installed on.
Why would you want to do that?
If you’re already using a third-party email provider for sending and receiving emails, you, of course, do not need to run your own mail server. However, if you manage a cloud server on which you have installed applications that need to send email notifications, running a local, send-only SMTP server is a good alternative to using a 3rd party email service provider or running a full-blown SMTP server.
An example of an application that sends email notifications is OSSEC, which will send email alerts to any configured email address (see How To Install and Configure OSSEC Security Notifications on Ubuntu 14.04). Though OSSEC or any other application of its kind can use a third-party email provider’s SMTP server to send email alerts, it can also use a local (send-only) SMTP server.
That’s what you’ll learn how to do in this tutorial: how to install and configure Postfix as a send-only SMTP server.
Note: If your use case is to receive notifications from your server at a single address, emails being marked as spam is not a significant issue, since you can whitelist them.
If your use case is to send emails to potential site users, such as confirmation emails for message board sign-ups, you should definitely do Step 5 so your server’s emails are more likely to be seen as legitimate. If you’re still having problems with your server’s emails being marked as spam, you will need to do further troubleshooting on your own.
Note: As of June 22, 2022, DigitalOcean is blocking SMTP for all new accounts. As a part of this new policy, we have partnered with SendGrid so our customers can still send emails with ease. You can learn more about this partnership and get started using SendGrid by checking out our DigitalOcean’s SendGrid Marketplace App.
Please complete the following prerequisites.
sudo
privilegeshostname
at the command prompt. The output should match the name you gave the Droplet when it was being created, such as example.comIf all the prerequisites have been met, you’re now ready for the first step of this tutorial.
In this step, you’ll learn how to install Postfix. The most efficient way to install Postfix and other programs needed for testing email is to install the mailutils
package by typing:
sudo apt-get install mailutils
Installing mailtuils will also cause Postfix to be installed, as well as a few other programs needed for Postfix to function. After typing that command, you will be presented with output that reads something like:
The following NEW packages will be installed:
guile-2.0-libs libgsasl7 libkyotocabinet16 libltdl7 liblzo2-2 libmailutils4 libmysqlclient18 libntlm0 libunistring0 mailutils mailutils-common mysql-common postfix ssl-cert
0 upgraded, 14 newly installed, 0 to remove and 3 not upgraded.
Need to get 5,481 kB of archives.
After this operation, 26.9 MB of additional disk space will be used.
Do you want to continue? [Y/n]
Press ENTER to install them. Near the end of the installation process, you will be presented with a window that looks exactly like the one in the image below. The default option is Internet Site. That’s the recommended option for this tutorial, so press TAB, then ENTER.
After that, you’ll get another window just like the one in this next image. The System mail name should be the same as the name you assigned to the Droplet when you were creating it. If it shows a subdomain like mars.example.com, change it to just example.com. When you’re done, Press TAB, then ENTER.
After installation has completed successfully, proceed to Step 2.
In this step, you’ll read how to configure Postfix to process requests to send emails only from the server on which it is running, that is, from localhost. For that to happen, Postfix needs to be configured to listen only on the loopback interface, the virtual network interface that the server uses to communicate internally. To make the change, open the main Postfix configuration file using the nano editor.
sudo nano /etc/postfix/main.cf
With the file open, scroll down until you see the entries shown in this code block.
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
Change the line that reads inet_interfaces = all
to inet_interfaces = loopback-only
. When you’re done, that same section of the file should now read:
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = loopback-only
In place of loopback-only
you may also use localhost
, so that the modified section may also read:
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = localhost
When you’re done editing the file, save and close it (press CTRL+X, followed by pressing Y, then ENTER). After that, restart Postfix by typing:
sudo service postfix restart
In this step, you’ll read how to test whether Postfix can send emails to any external email account. You’ll be using the mail
command, which is part of the mailutils
package that was installed in Step 1.
To send a test email, type:
echo "This is the body of the email" | mail -s "This is the subject line" user@example.com
In performing your own test(s), you may use the body and subject line text as-is, or change them to your liking. However, in place of user@example.com, use a valid email address, where the domain part can be gmail.com, fastmail.com, yahoo.com, or any other email service provider that you use.
Now check the email address where you sent the test message.
You should see the message in your inbox. If not, check your spam folder.
Note: With this configuration, the address in the From field for the test emails you send will be sammy@example.com, where sammy is your Linux username and the domain part is the server’s hostname. If you change your username, the From address will also change.
The last thing we want to set up is forwarding, so that you’ll get emails sent to root on the system at your personal, external email address.
To configure Postfix so that system-generated emails will be sent to your email address, you need to edit the /etc/aliases
file.
sudo nano /etc/aliases
The full content of the file on a default installation of Ubuntu 14.04 is shown in this code block:
# See man 5 aliases for format
postmaster: root
With that setting, system generated emails are sent to the root user. What you want to do is edit it so that those emails are rerouted to your email address. To accomplish that, edit the file so that it reads:
# See man 5 aliases for format
postmaster: root
root: sammy@example.com
Replace sammy@example.com with your personal email address. When done, save and close the file. For the change to take effect, run the following command:
sudo newaliases
You may now test that it works by sending an email to the root account using:
echo "This is the body of the email" | mail -s "This is the subject line" root
You should receive the email at your email address. If not, check your spam folder.
In this step, you’ll be given links to articles to help you protect your domain from being used for spamming. This is an optional but highly recommended step, because if configured correctly, this makes it difficult to send spam with an address that appears to originate from your domain.
Doing these additional configuration steps will also make it more likely for common mail providers to see emails from your server as legitimate, rather than marking them as spam.
Though the second article was written for Debian Wheezy, the same steps apply for Ubuntu 14.04.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
I created a Droplet with LAMP Application and I follow this instructions but php mail() function doesn’t work. Can you help me?
I solved my problem opening ticket with support for opening SMTP port
Can someone provide me with a tutorial for a complete Postfix mail server setup with OpenDkim?
Nevermind, I found the thing that I needed. For anyone out there that needs the same as me, this is the tutorial that works for me.
I’ve followed these directions, and the send-only server works as expected when sending email to any@externaldomains.com, however it won’t send out to email addresses for our actual domain.
To clarify, our email is hosted by Google Apps, not on our server. So when Postfix is instructed to send mail to any@ourhostname.com, that email needs to go out to Google, not just try to route to a local user on the server.
I hope that is clear enough.
OK. So I edited
/etc/postfix/main.cf
and removed my domain name from the list ofmydestinations
which seems to have worked for me. Now my line appears as suchmydestination = localhost.com, , localhost
If this is not safe, or not the best way to accomplish, please comment.I had the same problem: Following the instructions on this page, email could be sent to other domains, but not to the domain of this server.
It appears that the
mydestinations
line has a strange configuration by default. Changing to the postfix default also does not work:mydestination = $myhostname localhost.$mydomain localhost
Changing the line to
mydestination = localhost
works for me. Note: I am not a sysadmin. There may be dyer consequences to this, but now I can send mail from my server (e.g., via command line or php).Thanks to @cliffkujala for the tip!
Found this thread: https://serverfault.com/questions/445349/postfix-bouncing-when-destination-is-my-domain
@cliffkujala, is this a case of Postfix not sending to your Google Apps-hosted domain or your SMTP server marking the emails as Spam. Seems likely to be the latter, since you can receive at other 3rd party SMTP server.
When you send a test email to your domain, check the mail log. It will tell you whether the emails are actually being sent or not. Also, check your Spam folder at your email service provider.
@cliffkujala, the default is:
where
$myhostname
is the machines FQDN (the output ofhostname -f
) and$mydomain
is e.g. example.comThough your configuration may work, it doesn’t seem right. Is localhost.com your server’s hostname?
$myhostname
should be the FQDN, so please make sure/etc/postfix/main.cf
is correct.Did you fix this? I am wondering if a lot of issues derive from the confusion between the difference of hostname and domain name. Because I had previously been setting up my droplets with a hostname of mydomain.com but I could not get my mail to go to my Google app for name@mydomai.com.
When I created the droplet using test as a hostname everything worked the way I wanted it to.
I’m a newbie so don’t take my word for anything. I’m waiting on a response to my question here before I move forward.
This comment has been deleted
@isahappyperson I think I did fix it back in the day, but have since stopped running an outgoing mailserver. Now I have setup my websites to use www.mandrillapp.com. This provides other features such as email delivery track-ability.
Can I use Postfix and Mailservice like Google at the same time?
Yes, if your intended usage of Postfix will be as given in this tutorial. However, if you intend to use Postfix as a full-blown SMTP server, there’s no need to a 3rd party mail service provider like Google.
This comment has been deleted
I’m having the same issue as cliffkujala
In the 4th step if I put root: xxxx@mydomain.com it does not work but if I put root: xxxx@gmail.com it works.
I am also using google apps for business to send and receive emails for xxxx@mydomain.com
Also: how does this work if you are running several domains on one droplet? I currently have two domains hosting wordpress and need notifications sent to xxxx@mydomain1.com and xxxx@mydomain2.com from the wordpress app for email notification and contact forms and such.
Does setting root: xxxx@gmail.com just send notifications from the droplet server or does it sent notifications from the wordpress app?
I fought this issue for a whole day and then some before I finally found a solution. I created my email at myname@mydomain.com through the Google app for business and I could get email through the mail app from any other mail app but could not get it from a form on my site. I searched and searched then I finally destroyed the droplet and started from scratch.
I created a new droplet with a hostname that had nothing to do with my site.
Then I did the initial server setup for Ubuntu 14.04 here https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04
Then set up Apache virtual host from this tuturial https://www.digitalocean.com/community/tutorials/how-to-set-up-apache-virtual-hosts-on-ubuntu-14-04-lts
Then finally followed this tutorial.
It seems like the key is not having a host name that is the same as your domain.com name. When using the form on the website the form information will now to go my myname@mydomain.com address in my Google app rather than the local deliver system at /var/mail/user
So my question is: What do I do differently to set up for two separate domain.com’s on one droplet?
Is it going to be as simple as setting up a different user for the 2nd domain? Such as adding user1: user1@domain1.com
then user2: user2@domain2.com
in the /etc/aliases file?
More specifically I use admin@domain1.com and admin@domain2.com. I had been creating both sites with the same user name either user or wp-user as suggested in the tutorial for secure installs and updates for WordPress.
Eventually I would like to setup and use my own mail server but I still have far too much to learn first so for now letting Google App handle it works fine for me.
I have been fighting the exact same problem, only for more than just a single day. From extensive “Googling” and a great many hours reading all kinds of threads across the internet, I’ve come to the same conclusion as you. If your droplet is the same FQDN as your website address, which is exactly how we have been advised to set things up when following all of these great tutorials here at DO, then you can’t use any of your own domain name email addresses when using as a send only smtp server. It’s not a major problem for me, since my inbound/outbound email needs are taken care of elsewhere, so this only affects me as far as receiving emails from my server root account to my external email @mydomainname.com.
There are other options if you’re desperate for workarounds, such as using Gmail’s smtp server as a relay. I’ve tested lots of different configurations over the past few days while troubleshooting the hostname/domain name issue and using Gmail’s smtp server as a relay was actually by far the cleanest in terms of a spam test. Using Gmail’s smtp server as a relay with Postfix actually yielded a perfect 10/10 score with spam-tester.com’s Newsletters Spam Test.
None the less, I still feel that there seems to be a huge white elephant in the room across the internet, with regards to the root issue.
thanks for the tutorial can you use that configuration for bulk mailing ? and what size should u use in that configuration??
At step 1, I don’t get to see that screen like the image is showing. And why would I name it like my droplet? what if I host more than one website on my droplet?
you can reinstall postfix and you will get that screen. apt-get purge postfix apt-get install postfix
I followed this tutorial and tried step 4 to send an email to my gmail and it doesn’t work.
same here, everything was ok until Step 4 :/
same, does what do you run after echo?
really niceeee