Postfix is a free and open-source mail transfer agent that routes and delivers electronic mail. It is estimated that around 25% of public mail servers on the internet run Postfix.
In this guide, we will learn how to install and configure Postfix on an Ubuntu 20.04 server. We will use s-nail
(a Mail User Agent – MUA) to test that Postfix is able to correctly route mail.
We will be able to get the Postfix up and running with some bare bone email functionality. You won’t have a full featured email server by the end of this guide, but you will have some of the foundational components of such a setup to help you get started.
Prerequisites
To follow this guide to install and configure Postfix, then you must first have the following:
- An Ubuntu 20.04 server to function as a Postfix server
- A Fully Qualified Domain Name pointed at your Ubuntu 20.04 server.
Note that this tutorial assumes that you are configuring a host that has the FQDN of mail.citizix.com
. Wherever necessary, be sure to change citizix.com
or mail.citizix.com
to reflect your own FQDN.
Step 1: Ensure that your server is up to date
Before proceeding, ensure that the server has updated packages. Use this command to achieve that:
sudo apt update
sudo apt -y upgrade
Step 2: Installing Postfix
Postfix is included in the default Ubuntu repositories as postfix
. We can install it with APT.
Note that here we pass the DEBIAN_PRIORITY=low
environmental variable into this installation command. This will cause the installation process to prompt you to configure some additional options:
sudo DEBIAN_PRIORITY=low apt install postfix
This installation process will open a series of interactive prompts. Use the following information to fill in your prompts:
- General type of mail configuration?: For this, choose Internet Site since this matches our infrastructure needs.
- System mail name: This is the base domain used to construct a valid email address when only the account portion of the address is given. For instance, let’s say the hostname of your server is
mail.<mark>citizix.com</mark>
. You will likely want to set the system mail name to<mark>citizix.com</mark>
so that, given the usernameuser1
, Postfix will use the addressuser1@<mark>citizix.com</mark>
. - Root and postmaster mail recipient: This is the Linux account that will be forwarded mail addressed to
root@
andpostmaster@
. Use your primary account for this. In this example case, admin. - Other destinations to accept mail for: This defines the mail destinations that this Postfix instance will accept. If you need to add any other domains that this server will be responsible for receiving, add those here. Otherwise, the default will be sufficient.
- Force synchronous updates on mail queue?: Since you are likely using a journaled filesystem, accept No here.
- Local networks: This is a list of the networks for which your mail server is configured to relay messages. The default will work for most scenarios. If you choose to modify it, though, make sure to be very restrictive in regards to the network range.
- Mailbox size limit: This can be used to limit the size of messages. Setting it to `` disables any size restriction.
- Local address extension character: This is the character that can be used to separate the regular portion of the address from an extension (used to create dynamic aliases). The default,
+
will work for this tutorial. - Internet protocols to use: Choose whether to restrict the IP version that Postfix supports. For the purposes of this tutorial, pick all.
Note: If you need to ever return to change these settings, you can do so by typing:
sudo dpkg-reconfigure postfix
The prompts will be pre-populated with your previous responses.
When the installation process finishes, you’re ready to make a few updates to your Postfix configuration.
Step 3: Changing the Postfix Configuration
Postfix’s configuration settings are defined in the /etc/postfix/main.cf
file. You can use Postfix’s postconf
command to query or set configuration settings rather than editing the file directly.
To begin, set the location for your non-root Ubuntu user’s mailbox. In this guide, we’ll use the Maildir format, which separates messages into individual files that are then moved between directories based on user action. The alternative option that isn’t covered in this guide is the mbox format, which stores all messages within a single file.
Set the home_mailbox
variable to Maildir/
. Later, you will create a directory structure under that name within your user’s home directory. Configure home_mailbox
by typing:
sudo postconf -e 'home_mailbox= Maildir/'
Next, set the location of the virtual_alias_maps
table, which maps arbitrary email accounts to Linux system accounts. Run the following command, which maps the table location to a hash database file named /etc/postfix/virtual
:
sudo postconf -e 'virtual_alias_maps= hash:/etc/postfix/virtual'
Now that you’ve defined the location of the virtual maps file in your main.cf
file, you can create the file itself and begin mapping email accounts to user accounts on your Linux system. Create the file with your preferred text editor; in this example, we’ll use vim
:
sudo vim /etc/postfix/virtual
List any addresses that you wish to accept email for, followed by a whitespace and the Linux user you’d like that mail delivered to.
For example, if you would like to accept email at contact@citizix.com
andadmin@citizix.com
and would like to have those emails delivered to the admin Linux user, you could set up your file like this: /etc/postfix/virtual
contact@citizix.com admin
admin@citizix.com admin
After you’ve mapped all of the addresses to the appropriate server accounts, save and close the file.
Apply the mapping by typing:
sudo postmap /etc/postfix/virtual
Restart the Postfix process to be sure that all of your changes have been applied:
sudo systemctl restart postfix
If you have ufw firewall installed and enabled, you can allow connections to the service by typing:
sudo ufw allow Postfix
Step 3 — Installing the Mail Client and Initializing the Maildir Structure
In order to interact with the mail being delivered, this step will walk you through the process of installing the s-nail
package. This is a feature-rich variant of the BSD xmail
client which can handle the Maildir format correctly.
Before installing the client, though, it would be prudent to make sure your MAIL
environment variable is set correctly. s-nail
will look for this variable to figure out where to find mail for your user.
To ensure that the MAIL
variable is set regardless of how you access your account — whether through ssh
, su
, su -
, or sudo
, for example — you’ll need to set the variable in the /etc/bash.bashrc
file and add it to a file within /etc/profile.d
to make sure it is set for all users by default.
To add the variable to these files, type:
echo 'export MAIL=~/Maildir' | sudo tee -a /etc/bash.bashrc | sudo tee -a /etc/profile.d/mail.sh
To read the variable into your current session, source the /etc/profile.d/mail.sh
file:
source /etc/profile.d/mail.sh
With that complete, install the s-nail
email client with APT:
sudo apt install s-nail
Before running the client, there are a few settings you need to adjust. Open the /etc/s-nail.rc
file in your editor:
sudo vim /etc/s-nail.rc
At the bottom of the file, add the following options: /etc/s-nail.rc
. . .
set emptystart
set folder=Maildir
set record=+sent
Here’s what these lines do:
set emptystart
: allows the client to open even with an empty inboxset folder=Maildir
: sets theMaildir
directory to the internalfolder
variableset record=+sent
creates asent
mbox file for storing sent mail within whichever directory is set as thefolder
variable, in this caseMaildir
Save and close the file when you are finished. You’re now ready to initialize your system’s Maildir structure.
A quick way to create the Maildir structure within your home directory is to send yourself an email with the s-nail
command. Because the sent
file will only be available once the Maildir is created, you should disable writing to it for this initial email. Do this by passing the -Snorecord
option.
Send the email by piping a string to the s-nail
command. Adjust the command to mark your Linux user as the recipient:
echo 'init' | s-nail -s 'init' -Snorecord admin
You can can check to make sure the directory was created by looking for your ~/Maildir
directory:
ls -R ~/Maildir
You will see the directory structure has been created and that a new message file is in the ~/Maildir/new
directory:
$ ls -R ~/Maildir
/home/ubuntu/Maildir:
cur new tmp
/home/ubuntu/Maildir/cur:
/home/ubuntu/Maildir/new:
1643972360.V10301Ifbca3M171366.dev-ubuntusrv.inv.re 1643972375.V10301Ifbca5M242683.dev-ubuntusrv.inv.re
/home/ubuntu/Maildir/tmp:
Now that the directory structure has been created, you’re ready to test out the s-nail
client by viewing the init
message you sent and sending a message to an external email address.
Step 4 — Testing the Client
To open the client, run the s-nail
command:
s-nail
In your console, you’ll see a rudimentary inbox with the init
message waiting:
$ s-nail
s-nail version v14.9.15. Type `?' for help
/home/admin/Maildir: 1 messages 1 new
▸N 1 Ubuntu 2022-02-04 10:59 14/432 init
?
Press ENTER
to display the message:
[-- Message 1 -- 14 lines, 432 bytes --]:
From admin@mail.citizix.com Fri Feb 4 10:59:35 2022
Date: Fri, 04 Feb 2022 10:59:35 +0000
To: admin@mail.citizix.com
Subject: init
Message-Id: <20220204105935.3A7B2232D7F@dev-ubuntusrv.inv.re>
From: Ubuntu <ubuntu@mail.citizix.com>
init
You can get back to the message list by typing h
, and then ENTER
:
h
▸R 1 Ubuntu 2022-02-04 10:59 14/432 init
Notice that the message now has a state of R
, indicating that it’s been read.
Since this message isn’t very useful, you can delete it by pressing d
, and then ENTER
:
d
To get back to the terminal, type q
and then ENTER
:
q
As a final test, check whether s-nail
is able to correctly send email messages. To do this, you can pipe the contents of a text file into the s-nail
process, like you did with the init
message you sent in the previous step.
Begin by writing a test message in a text editor:
vim ~/test_message
Inside, enter some text you’d like to send:
Hello,
This is a test. Please confirm receipt!
Save and close the file after writing your message.
Then, use the cat
command to pipe the message to the s-nail
process. You can do so with the following example, which uses these options:
-s
: This defines the subject line of the email message-r
: An optional change to the “From:” field of the email. By default, the Linux user you are logged in as will be used to populate this field. The-r
option allows you to override this with a valid address, such as one of those you defined in the/etc/postfix/virtual
file. To illustrate, the following command usescontact@citizix.com
Also, be sure to change<mark>user@email.com</mark>
to a valid email address which you have access to:
cat ~/test_message | s-nail -s 'Test email subject line' -r contact@citizix.com citizix.com@gmail.com
Then, navigate to the inbox for the email address to which you sent the message. You will see your message waiting there almost immediately.
Note: If the message isn’t in your inbox, it may have been delivered to your Spam folder.
You can view your sent messages within your s-nail
client. Start the interactive client again:
s-nail
From the email client, view your sent messages by typing:
file +sent
Copy
You’ll see output like this:
$ s-nail
s-nail version v14.9.15. Type `?' for help
/home/admin/Maildir: 0 messages
No more mail.
? file +sent
+[/home/admin/Maildir/]sent: 1 message 1 new
▸N 1 contact@citizix.co 2022-02-04 11:07 12/291 Test email subject line
?
You can manage sent mail using the same commands you use for incoming mail.
Conclusion
You now have Postfix configured on your Ubuntu 20.04 server. Managing email servers can be a tough task for new system administrators, but with this configuration, you should have enough MTA email functionality to get yourself started.