Set up Postfix for incoming email
This document will take you through the steps of setting up a basic Postfix mail server with IMAP authentication on Ubuntu, to be used with incoming email.
The instructions make the assumption that you will be using the email address incoming@gitlab.example.com, that is, username incoming on host gitlab.example.com. Don't forget to change it to your actual host when executing the example code snippets.
Configure your server firewall
- Open up port 25 on your server so that people can send email into the server over SMTP.
- If the mail server is different from the server running GitLab, open up port 143 on your server so that GitLab can read email from the server over IMAP.
Install packages
-
Install the
postfixpackage if it is not installed already:sudo apt-get install postfixWhen asked about the environment, select 'Internet Site'. When asked to confirm the hostname, make sure it matches
gitlab.example.com. -
Install the
mailutilspackage.sudo apt-get install mailutils
Create user
-
Create a user for incoming email.
sudo useradd -m -s /bin/bash incoming -
Set a password for this user.
sudo passwd incomingBe sure not to forget this, you'll need it later.
Test the out-of-the-box setup
-
Connect to the local SMTP server:
telnet localhost 25You should see a prompt like this:
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 gitlab.example.com ESMTP Postfix (Ubuntu)If you get a
Connection refusederror instead, verify thatpostfixis running:sudo postfix statusIf it is not, start it:
sudo postfix start -
Send the new
incominguser a dummy email to test SMTP, by entering the following into the SMTP prompt:ehlo localhost mail from: root@localhost rcpt to: incoming@localhost data Subject: Re: Some issue Sounds good! . quitNote: The
.is a literal period on its own line.Note: If you receive an error after entering
rcpt to: incoming@localhostthen your Postfixmy_networkconfiguration is not correct. The error will say 'Temporary lookup failure'. See Configure Postfix to receive email from the Internet. -
Check if the
incominguser received the email:su - incoming mailYou should see output like this:
"/var/mail/incoming": 1 message 1 unread >U 1 root@localhost 59/2842 Re: Some issueQuit the mail app:
q -
Log out of the
incomingaccount and go back to beingroot:logout
Configure Postfix to use Maildir-style mailboxes
Courier, which we will install later to add IMAP authentication, requires mailboxes to have the Maildir format, rather than mbox.
-
Configure Postfix to use Maildir-style mailboxes:
sudo postconf -e "home_mailbox = Maildir/" -
Restart Postfix:
sudo /etc/init.d/postfix restart -
Test the new setup:
- Follow steps 1 and 2 of Test the out-of-the-box setup.
-
Check if the
incominguser received the email:su - incoming MAIL=/home/incoming/Maildir mailYou should see output like this:
"/home/incoming/Maildir": 1 message 1 unread >U 1 root@localhost 59/2842 Re: Some issueQuit the mail app:
q
Note: If
mailreturns an errorMaildir: Is a directorythen your version ofmaildoesn't support Maildir style mailboxes. Installheirloom-mailxby runningsudo apt-get install heirloom-mailx. Then, try the above steps again, substitutingheirloom-mailxfor themailcommand. -
Log out of the
incomingaccount and go back to beingroot:logout
Install the Courier IMAP server
-
Install the
courier-imappackage:sudo apt-get install courier-imapAnd start
imapd:imapd start -
The courier-authdaemon isn't started after installation. Without it, imap authentication will fail:
sudo service courier-authdaemon startYou can also configure courier-authdaemon to start on boot:
sudo systemctl enable courier-authdaemon
Configure Postfix to receive email from the internet
-
Let Postfix know about the domains that it should consider local:
sudo postconf -e "mydestination = gitlab.example.com, localhost.localdomain, localhost" -
Let Postfix know about the IPs that it should consider part of the LAN:
We'll assume
192.168.1.0/24is your local LAN. You can safely skip this step if you don't have other machines in the same local network.sudo postconf -e "mynetworks = 127.0.0.0/8, 192.168.1.0/24" -
Configure Postfix to receive mail on all interfaces, which includes the internet:
sudo postconf -e "inet_interfaces = all" -
Configure Postfix to use the
+delimiter for sub-addressing:sudo postconf -e "recipient_delimiter = +" -
Restart Postfix:
sudo service postfix restart
Test the final setup
-
Test SMTP under the new setup:
-
Connect to the SMTP server:
telnet gitlab.example.com 25You should see a prompt like this:
Trying 123.123.123.123... Connected to gitlab.example.com. Escape character is '^]'. 220 gitlab.example.com ESMTP Postfix (Ubuntu)If you get a
Connection refusederror instead, make sure your firewall is setup to allow inbound traffic on port 25. -
Send the
incominguser a dummy email to test SMTP, by entering the following into the SMTP prompt:ehlo gitlab.example.com mail from: root@gitlab.example.com rcpt to: incoming@gitlab.example.com data Subject: Re: Some issue Sounds good! . quit(Note: The
.is a literal period on its own line) -
Check if the
incominguser received the email:su - incoming MAIL=/home/incoming/Maildir mailYou should see output like this:
"/home/incoming/Maildir": 1 message 1 unread >U 1 root@gitlab.example.com 59/2842 Re: Some issueQuit the mail app:
q -
Log out of the
incomingaccount and go back to beingroot:logout
-
-
Test IMAP under the new setup:
-
Connect to the IMAP server:
telnet gitlab.example.com 143You should see a prompt like this:
Trying 123.123.123.123... Connected to mail.example.gitlab.com. Escape character is '^]'. - OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE ACL ACL2=UNION] Courier-IMAP ready. Copyright 1998-2011 Double Precision, Inc. See COPYING for distribution information. -
Sign in as the
incominguser to test IMAP, by entering the following into the IMAP prompt:a login incoming PASSWORDReplace PASSWORD with the password you set on the
incominguser earlier.You should see output like this:
a OK LOGIN Ok. -
Disconnect from the IMAP server:
a logout
-
Done!
If all the tests were successful, Postfix is all set up and ready to receive email! Continue with the incoming email guide to configure GitLab.
This document was adapted from https://help.ubuntu.com/community/PostfixBasicSetupHowto, by contributors to the Ubuntu documentation wiki.