Virtual Users And Domains With Postfix, Courier, MySQL And SquirrelMail (Mandriva 2010.0 x86_64)

Version 1.0
Author: Falko Timme
Follow me on Twitter

This tutorial is Copyright (c) 2010 by Falko Timme. It is derived from a tutorial from Christoph Haas which you can find at You are free to use this tutorial under the Creative Commons license 2.5 or any later version.

This document describes how to install a Postfix mail server that is based on virtual users and domains, i.e. users and domains that are in a MySQL database. I'll also demonstrate the installation and configuration of Courier (Courier-POP3, Courier-IMAP), so that Courier can authenticate against the same MySQL database Postfix uses.

The resulting Postfix server is capable of SMTP-AUTH and TLS and quota (quota is not built into Postfix by default, I'll show how to patch your Postfix appropriately). Passwords are stored in encrypted form in the database (most documents I found were dealing with plain text passwords which is a security risk). In addition to that, this tutorial covers the installation of Amavisd, SpamAssassin and ClamAV so that emails will be scanned for spam and viruses. I will also show how to install SquirrelMail as a webmail interface so that users can read and send emails and change their passwords.

The advantage of such a "virtual" setup (virtual users and domains in a MySQL database) is that it is far more performant than a setup that is based on "real" system users. With this virtual setup your mail server can handle thousands of domains and users. Besides, it is easier to administrate because you only have to deal with the MySQL database when you add new users/domains or edit existing ones. No more postmap commands to create db files, no more reloading of Postfix, etc. For the administration of the MySQL database you can use web based tools like phpMyAdmin which will also be installed in this howto. The third advantage is that users have an email address as user name (instead of a user name + an email address) which is easier to understand and keep in mind.

This tutorial is based on Mandriva 2010.0 (x86_64). You should already have set up a basic Mandriva system, as described in the chapters 1 to 7 of this tutorial: Please leave out chapter 6.1 Creating An Auto-Update Script, because if there's a Postfix update, it will replace our custom-built Postfix that we will build in chapter 3!

This howto is meant as a practical guide; it does not cover the theoretical backgrounds. They are treated in a lot of other documents in the web.

This document comes without warranty of any kind! I want to say that this is not the only way of setting up such a system. There are many ways of achieving this goal but this is the way I take. I do not issue any guarantee that this will work for you!


Preliminary Note

The system should have a static IP address. I use as my IP address in this tutorial and as the hostname.


1 Install Apache, MySQL, phpMyAdmin

First we update our package database:

urpmi.update -a

We can install the packages with one single command:

urpmi MySQL MySQL-client lib64mysql-devel phpmyadmin db4-devel html2text lib64sasl-devel openssl-devel openldap-devel pcre-devel postgresql8.4-devel rpm-build


2 Install Courier And Saslauthd

To install Courier and saslauthd, we simply run:

urpmi courier-authlib courier-authlib-mysql courier-imap courier-pop cyrus-sasl lib64sasl2 lib64sasl2-devel lib64sasl2-plug-plain lib64sasl2-plug-anonymous lib64sasl2-plug-crammd5 lib64sasl2-plug-digestmd5 lib64sasl2-plug-gssapi lib64sasl2-plug-login


3 Apply Quota Patch To Postfix

We have to get the Postfix source rpm, patch it with the quota patch, build a new Postfix rpm package and install it.

cd /usr/src
rpm -ivh postfix-2.6.5-2mdv2010.0.src.rpm

The last command will show some warnings that you can ignore:

warning: user mandrake does not exist - using root
warning: group mandrake does not exist - using root

Now we patch the Postfix sources with the postfix-2.6.5-vda-ng patch (from

cd /root/rpmbuild/SOURCES
tar xvfz postfix-2.6.5.tar.gz
gunzip postfix-2.6.5-vda-ng.patch.gz
cd postfix-2.6.5
patch -p1 < ../postfix-2.6.5-vda-ng.patch
cd ..
mv postfix-2.6.5.tar.gz postfix-2.6.5.tar.gz_orig
tar -pczf postfix-2.6.5.tar.gz postfix-2.6.5/
rm -fr postfix-2.6.5/
gzip postfix-2.6.5-vda-ng.patch

Then we build our new Postfix rpm package with quota and MySQL support:

cd /root/rpmbuild/SPECS/
rpmbuild -ba postfix.spec

Our Postfix rpm package is created in /root/rpmbuild/RPMS/x86_64, so we go there:

cd /root/rpmbuild/RPMS/x86_64

The command

ls -l

shows you the available packages:

[root@server1 x86_64]# ls -l
total 3388
-rw-r--r-- 1 root root  230449 2010-03-08 17:29 lib64postfix1-2.6.5-2mdv2010.0.x86_64.rpm
-rw-r--r-- 1 root root 1351340 2010-03-08 17:29 postfix-2.6.5-2mdv2010.0.x86_64.rpm
-rw-r--r-- 1 root root 1763590 2010-03-08 17:29 postfix-debug-2.6.5-2mdv2010.0.x86_64.rpm
-rw-r--r-- 1 root root   30266 2010-03-08 17:29 postfix-ldap-2.6.5-2mdv2010.0.x86_64.rpm
-rw-r--r-- 1 root root   25460 2010-03-08 17:29 postfix-mysql-2.6.5-2mdv2010.0.x86_64.rpm
-rw-r--r-- 1 root root   25617 2010-03-08 17:29 postfix-pcre-2.6.5-2mdv2010.0.x86_64.rpm
-rw-r--r-- 1 root root   25476 2010-03-08 17:29 postfix-pgsql-2.6.5-2mdv2010.0.x86_64.rpm
[root@server1 x86_64]#

First uninstall your current Postfix package...

urpme postfix

...then pick the postfix and the postfix-mysql packages and install them like this:

rpm -ivh postfix-2.6.5-2mdv2010.0.x86_64.rpm postfix-mysql-2.6.5-2mdv2010.0.x86_64.rpm


4 Set MySQL Passwords And Configure phpMyAdmin

By default, networking is not enabled in Mandriva 2010.0's MySQL package, but networking is required by ISPConfig. We can change this by commenting out the line skip-networking in /etc/my.cnf:

vi /etc/my.cnf
# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!

Afterwards, we create the system startup links for Apache and MySQL...

chkconfig mysqld on
chkconfig httpd on

... and start both services:

/etc/init.d/mysqld start
/etc/init.d/httpd start

Now check that networking is enabled. Run

netstat -tap | grep mysql

The output should look like this:

[root@server1 x86_64]# netstat -tap | grep mysql
tcp        0      0 *:mysql-im                  *:*                         LISTEN      14395/mysqlmanager
tcp        0      0 *:mysql                     *:*                         LISTEN      14403/mysqld
[root@server1 x86_64]#

Next, run

mysqladmin -u root password yourrootsqlpassword
mysqladmin -h -u root password yourrootsqlpassword

to set a password for the user root (otherwise anybody can access your MySQL database!).

Now you can direct your browser to or and log in with the user name root and your new root MySQL password.

Share this page:

1 Comment(s)