oreilly.comSafari Books Online.Conferences.


Building an Advanced Mail Server

by Joe Stump

All Linux distributions that I know of come with an MTA of some sort. The most popular is Sendmail. Other popular MTAs include Exim, postfix, and Qmail. This article discusses how to build an advanced mail server which sports all of the latest mail protocols, checks all incoming mail for spam, and scans all incoming and outgoing mail for viruses.

We will use the able Qmail MTA for SMTP and POP3. We will use vpopmail for virtual domains and Courier IMAP for our IMAP server. As our backend we will be using the trusty MySQL RDBMS to store all of our user information. Since this is a three part series, we will cover Squirrel Mail in the second part and SpamAssassin, procmail, QmailScanner, and ClamAV in the third part.

You are assumed to have a working knowledge of Linux, though the steps outlined should work on most UNIX variants with little effort. It is also assumed that you understand how email, in general, works. Finally, it is assumed that you have root access to the machine you wish to turn into an advanced mail server. Debian users are in luck; since this is the distribution I personally run I will include Debian-specific shortcuts whenever possible. If you're using another distribution, you may have to modify the provided installation notes slightly.


Installing MySQL

All of the distributions that I have worked with either supplied MySQL binaries on the CD or made them available somewhere on the web. For detailed instructions on how to set up MySQL please read MySQL's Installation instructions.

Note: Debian users can apt-get the packages mysql-client and mysql-server.

Creating the Database User

Log into your MySQL server as root and type the following commands to create the database for vpopmail.

mysql> CREATE DATBASE vpopmail;
mysql> GRANT ALL ON vpopmail.* 
    -> TO vpopmail@localhost IDENTIFIED BY 'password';

You can change the names of the database, user, and password, but make sure to keep track of them for later use. You also may wish to change the security preferences for your vpopmail user, but before you do read up on the MySQL GRANT statement.


This step is optional. If you wish to run your webmail via a secure connection or enable IMAP-SSL or POP3-SSL, you will need to install OpenSSL. Your distribution should come with OpenSSL packages. Be sure to install the development versions of those packages so that we can compile Courier and Qmail from source.

Note: Debian users can apt-get the package openssl.


Qmail was written by D. J. Bernstein (DJB) as a replacement for Sendmail. Qmail differs greatly from Sendmail so before you jump headlong into installing Qmail, you should download the source and read through the documentation. Furthermore, it may be in your best interest to read Life with qmail by Dave Sill.

Installing ucspi-tcp

ucspi-tcp is a simple TCP Server/Client created by DJB for "building TCP client-server applications" and is required to run Qmail. After you have downloaded and extracted the source, change into the directory and compile the code.

bash$ make
bash$ make setup check

You can read over DJB's installation instructions on his How to install ucspi-tcp page. Also, be sure to turn off any affected ports (25,110,143) in /etc/inetd.conf and restart your inetd server.

Note: Debian users can apt-get the package ucspi-tcp-src.

Installing daemontools

daemontools "is a collection of tools for managing UNIX services." This is the preferred way to run Qmail, but is not required to run Qmail. To install it, first make the /package directory it expects.

bash$ mkdir -p /package
bash$ chmod 1755 /package
bash$ cd /package

Download the daemontools package into the /package directory and untar it. Next, run the installer:

bash$ cd admin/daemontools-0.76
bash$ package/install

You can read over DJB's installation instructions on his How to install daemontools page.

Note: Debian users can apt-get daemontools-installer. Debian users may also wish to check out qmail-pop3-sv, qmail-smtp-sv and qmail-sv as well.

Patching Qmail

Version 1.03 is the latest version of Qmail. The default installation of Qmail is very vanilla and will require some minor patching to do what we wish to do. Particularily we will want to install:

  • Bill Guenter's famous Qmail QUEUE patch, which will allow us to run alternate programs as Qmail's queue.

  • Christopher K. Davis's oversized DNS packets patch, which enables Qmail to accept oversized DNS packets. (DJB recommends running djbdns as an alternate fix to this problem.)

  • Bill Shupp's maildir++ patch, which will fix vpopmail and Qmail quota issues.

  • Eric M. Johnston's SMTP-AUTH patch, which allows users outside of your network to send email after they have authenticated.

Installing Qmail

The installation process for Qmail is very hands on and requires you to be familiar with the command prompt. Before installing, please read INSTALL, INSTALL.ids, INSTALL.ctl and INSTALL.alias. You may wish to look over the other INSTALL.* files as well.

bash$ mkdir /var/qmail
bash$ groupadd nofiles
bash$ useradd -g nofiles -d /var/qmail/alias alias
bash$ useradd -g nofiles -d /var/qmail qmaild
bash$ useradd -g nofiles -d /var/qmail qmaill
bash$ useradd -g nofiles -d /var/qmail qmailp
bash$ groupadd qmail
bash$ useradd -g qmail -d /var/qmail qmailq
bash$ useradd -g qmail -d /var/qmail qmailr
bash$ useradd -g qmail -d /var/qmail qmails
bash$ make setup check
bash$ ./config-fast
bash$ (cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon .qmail-root)
bash$ chmod 644 ~alias/.qmail*

Make sure to change to the actual hostname of your mail server.

Note: Debian users can apt-get qmail-src, however, the package does not include the SMTP-AUTH or maildir++ patches. Alternatively, you could try Garrit Pape's Debian packages.

Once you have Qmail installed, make sure it starts up during your boot sequence. There are a several init scripts available on the web, one of which can be found here. The script says it is for Red Hat, but it should work for any distro with a little modification.

bash$ cp qmailctl.txt /etc/init.d/qmail

Before you start Qmail, you need to set up daemontools' Qmail scripts which control how Qmail responds to various requests.

bash$ mkdir -p /var/qmail/supervise/qmail-send/log
bash$ mkdir -p /var/qmail/supervise/qmail-smtpd/log
bash$ mkdir -p /var/qmail/supervise/qmail-pop3d/log

After you are done setting up the directories you will need to create all of the controlling scripts.

  • /var/qmail/supervise/qmail-send/run
    exec env - PATH="/var/qmail/bin:$PATH" qmail-start ./Maildir/
  • /var/qmail/supervise/qmail-send/log/run
    exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \
    	s10000000 n30 /var/log/qmail/send
  • /var/qmail/supervise/qmail-smtpd/run
    QMAILDUID=`id -u qmaild`
    NOFILESGID=`id -g qmaild`
    exec /usr/local/bin/softlimit -m 2000000 \
    /usr/local/bin/tcpserver \
      -H -l \
      -v -x /etc/tcp.smtp.cdb \
      -c 20 -R -u "$QMAILDUID" -g "$NOFILESGID" 0 smtp \
      /var/qmail/bin/qmail-smtpd \
      	/var/lib/vpopmail/bin/vchkpw /bin/true 2>&1
  • /var/qmail/supervise/qmail-smtpd/log/run
    exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t s10000000 \
    	n30 /var/log/qmail/smtpd
  • /var/qmail/supervise/qmail-pop3d/run
    exec /usr/local/bin/softlimit -m 3000000 \
    /usr/local/bin/tcpserver \
      -H -l \
      -v -x /etc/tcp.pop3.cdb -c 30 -R 0 pop3 \
    /var/qmail/bin/qmail-popup \
    /var/lib/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir 2>&1
  • /var/qmail/supervise/qmail-pop3d/log/run
    exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t s10000000 \
    	n30 /var/log/qmail/pop3d

After you have taken care of all of the scripts, the last steps are to chmod the scripts, make the log directories and make daemontools aware of the new service.

bash$ chmod 755 /var/qmail/supervise/qmail-send/run
bash$ chmod 755 /var/qmail/supervise/qmail-send/log/run
bash$ chmod 755 /var/qmail/supervise/qmail-smtpd/run
bash$ chmod 755 /var/qmail/supervise/qmail-smtpd/log/run
bash$ chmod 755 /var/qmail/supervise/qmail-pop3d/run
bash$ chmod 755 /var/qmail/supervise/qmail-pop3d/log/run
bash$ mkdir /var/log/qmail
bash$ mkdir /var/log/qmail/smtpd
bash$ mkdir /var/log/qmail/send
bash$ mkdir /var/log/qmail/pop3d
bash$ chown -R qmaill /var/log/qmail
bash$ ln -s /var/qmail/supervise/qmail-send /service
bash$ ln -s /var/qmail/supervise/qmail-smtpd /service
bash$ ln -s /var/qmail/supervise/qmail-pop3d /service
bash$ /etc/init.d/qmail start

Pages: 1, 2

Next Pagearrow

Linux Online Certification

Linux/Unix System Administration Certificate Series
Linux/Unix System Administration Certificate Series — This course series targets both beginning and intermediate Linux/Unix users who want to acquire advanced system administration skills, and to back those skills up with a Certificate from the University of Illinois Office of Continuing Education.

Enroll today!

Linux Resources
  • Linux Online
  • The Linux FAQ
  • Linux Kernel Archives
  • Kernel Traffic

  • Sponsored by: