Why build your own email server? Have you heard that Hilary Clinton uses her private email server?
Building your own, private email server can help protect your privacy because only you, the server admin, have access to the emails stored on the server. On the other hand, building your own email server can be a pain in the butt because there’re so many things you need to learn.
So I’m creating a tutorial series on how to build your own email server to ease things a little bit and this article is part 1 of this tutorial series. In this article, I will show you how to set up a very basic Postfix SMTP server, also known as a MTA (message transport agent). Once you finish this article, you should be able to send and receive emails with your own email domain on your own email server. This tutorial is demonstrated on a Ubuntu 16.04 and Ubuntu 14.04 server.
Postfix is a state-of-the-art message transport agent (MTA), aka SMTP server. It’s responsible for transporting messages from a mail user agent (MUA or mail client) to a remote SMTP server. The Postfix application design is modular, with each module running at the lowest possible privilege level required to get the job done. Postfix was designed with security in mind. Postfix integrate tightly with Unix. In this tutorial, you will learn how to configure Postfix for a single domain.
Things To Do Before Installing Postfix
Postfix was built by Wietse Venema who is an Unix expert. Postfix does not provide functionalities that Unix already provides. So to make Postfix perform better and get the most out of Postfix, you need to properly setup your Ubuntu server.
Set A Correct Hostname for Ubuntu Server
By default, Postfix use your server’s hostname to identify itself when communicating with other MTAs. Hostname can have two forms: a single word and FQDN.
The single word form is used mostly on personal computers. Your Linux home computer may be named linux, debian, ubuntu etc. FQDN (Fully Qualified Domain Name) consists of two parts: a node name and a domain name. For example:
is a FQDN. mail is a nodename, linuxbabe.com is the domain name. FQDN is mostly used on Internet-facing servers and we should use FQDN on our mail servers. FQDN will appear in the smtpd banner. Some MTAs reject message if your Postfix does not provide FQDN in smtpd banner. Some MTAs even checks DNS to see if FQDN in the smtpd banner resolves to the IP of your mail server.
Enter the following command to see the FQDN form of your hostname.
If your ubuntu server doesn’t have a FQDN yet, you can use
hostnamectl to set one.
sudo hostnamectl set-hostname
A common FQDN for a mail server is
mail.yourdomain.com. Also note that FQDN can be overridden by Postfix with
myhostname parameter in Postfix configuration file. But Let’s not worry about this parameter right now.
Set System Time
When sending messages, Postfix checks system time and appends a timestamp in messages. This timestamp will also appear in Postfix logs. So it’s important that your set a correct system time on Ubuntu server.
date command to check the time zone settings and current system time on Ubuntu server
[email protected]:~$ date Thu Mar 31 06:37:19 BST 2016
The best way to keep an accurate time on your system is to sync with remote time server using NTP protocol. Check out this post for a detailed explanation.
Setup DNS Records for Your Mail Server
An MX record tells other MTAs that your mail server
mail.yourdomain.com is responsible for email delivery for your domain.
MX record @ mail.linuxbabe.com
A common name for a mail host is
mail.yourdomain.com. You can specify more than one MX record and set priority for your mail servers. A lower number means higher priority.
An A record maps a FQDN to an IP address.
A pointer record, or PTR record, maps an IP address to a FQDN. It’s the counterpart to the A record and is used for reverse DNS lookup.
Reverse resolution of A record with PTR record can help fight with spammers. Many MTAs accept email only if the server is really responsible for a certain domain. You should definitely configure a PTR record for your email server so your emails have a better chance of landing in recipient’s inbox instead of spam folder.
To check the PTR record for an IP address:
dig -x <IP> +short
Because you get IP address from your hosting provider, not from your domain registrar, so you must set PTR record for your IP in the control panel of your hosting provider.
If you use Digital Ocean’s SSD cloud server, then after you change the droplet name in control panel, your PTR record will be automatically set. Really nice feature!
After all of the above is done, let’s play with Postfix.
On your ubuntu server, run the following two commands.
sudo apt-get update sudo apt-get install postfix -y
You will be asked to select a type for mail configuration. Normally, you will want to select the second type: Internet Site.
- No configuration means no configuration.
- Internet Site means using Postfix for sending email to other MTAs and Receiving email from other MTAs.
- Internet with smarthost means using postfix to receive email from other MTAs, but using another smart host to relay emails to the recipient.
- Satellite system means using smart host for sending and receiving email.
- Local only means emails are transmitted only between local user account.
Next, enter your domain name for the system mail name, i.e. the domain name after @ symbol. For example, my email address is [email protected], so I entered linuxbabe.com for the system mail name. This domain name will be appended to addresses that doesn’t have domain name specified.
Once installed, Postfix will be automatically started and a
/etc/postfix/main.cf file will be generated. Now we can check Postfix version with this command:
[email protected]:~$ sudo postconf mail_version mail_version = 2.11.0
On Ubuntu 16.04, the Postfix version is 3.1.0.
The netstat utility tells us that the Postfix master process is listening on TCP port 25.
sudo netstat -lnpt
Before we send a test email, it’s a good idea to check if port 25 is blocked by firewall or your hosting provider. We can use
nmap to scan open ports on our server. Run the following command on your personal computer. (I assume you are reading this tutorial on a Linux computer.) Replace <your-server-ip> with actual IP.
sudo nmap <your-server-ip>
You can see that TCP port 25 is open on my server. Make sure
iptables firewall allows incoming and outgoing connections on port 25. If TCP port 25 is blocked by your hosting provider, ask them to open it for you.
nmap can be install on Linux with one of the following commands, depending on your Linux distro.
sudo apt install nmap sudo yum install nmap sudo zypper install nmap sudo pacman -S nmap
Send Test Email
As a matter of fact, we can now send and receive email from the command line. If your Ubuntu server has a user account called user1, then the email address for this user is [email protected] You can send an email to root user [email protected] You can also send emails to Gmail, yahoo mail or any other email service.
When installing Postfix, a sendmail binary is put at
/usr/sbin/sendmail. You can use Postfix’s sendmail binary to send a test email to your Gmail account like this:
echo "test email" | sendmail [email protected]
In this simple command, sendmail reads a message from standard input and make “test email” as the message body, then send this message to your Gmail account. You should be able to receive this test email in your Gmail inbox. You can see that although we didn’t specify the from address, Postfix automatically append a domain name for the from address. That’s because we added our domain name in system mail name when installing Postfix.
Also you can try to reply to this test email to see if Postfix can receive email messages. It’s likely that now emails sent from your domain will be labeled as spam. Don’t worry, we will tackle it in part 2 of this tutorial series.
The inbox for each user is located at
/var/mail/<username> file. If you are unsure where to look for the inbox, use this command.
The Postfix mail log is stored at
Using the mail program to Send and Read Email
Now let’s install a command line MUA (mail user agent).
sudo apt-get install mailutils
To send email, type
mail [email protected]
[email protected]:~$ mail [email protected] Cc: Subject: 2nd test email I'm sending this email using the mail program.
Enter subject line and the body text. To tell
Ctrl+D and mail will send this email message for you.
To read incoming emails, just type
Here’s how to use the
- To read the first email message, type
1. If only parts of the message is displayed, press
Enterto show the remaining part of the message.
- To display message headers starting from message 1, type
- To show the last screenful of messages, type
- To read the next email message, type
- To delete message 1, type
- To delete message 1, 2 and 3, type
d 1 2 3.
- To delete messages from 1 to 10, type
- To replay to message 1, type
- To exit out of mail, type
Messages that have been opened will be moved from
/home/<username>/mbox file. That means other mail clients can’t read those messages. To prevent this from happening, type
x instead of
q to exit out of mail.
Bonus Tip: Setting up Postfix as a Forward Only Mail Host
If you want your email server to forward every incoming email to another email service like Gmail. Then you can achieve that by creating a
.forward file in the user’s home directory.
and add an email address in the file.
Save and close the file. That’s all you have to do.
Congrats! Now you have a basic Postfix email server up and running. You can send plain text email and read incoming emails using the command line. This setup also enables a website to send email messages such as password reset email to users. In the next part of this tutorial series, we will see how to set up DKIM and SPF to ensure our emails are landed in recipient’s inbox instead of being labeled as spam. Stay tuned!