Postfix MySQL Howto

-------------------------------------------------------------------------------

Introduction

The Postfix mysql map type allows you to hook up Postfix to a MySQL database.
This implementation allows for multiple mysql databases: you can use one for a
virtual(5) table, one for an access(5) table, and one for an aliases(5) table
if you want. You can specify multiple servers for the same database, so that
Postfix can switch to a good database server if one goes bad.

Busy mail servers using mysql maps will generate lots of concurrent mysql
clients, so the mysql server(s) should be run with this fact in mind. You can
reduce the number of concurrent mysql clients by using the Postfix proxymap(8)
service.

Building Postfix with MySQL support

These instructions assume that you build Postfix from source code as described
in the INSTALL document. Some modification may be required if you build Postfix
from a vendor-specific source package.

Note: to use mysql with Debian GNU/Linux's Postfix, all you need is to install
the postfix-mysql package and you're done. There is no need to recompile
Postfix.

The Postfix MySQL client utilizes the mysql client library, which can be
obtained from:

    http://www.mysql.com/downloads/

In order to build Postfix with mysql map support, you will need to add -
DHAS_MYSQL and -I for the directory containing the mysql headers, and the
mysqlclient library (and libm) to AUXLIBS_MYSQL, for example:

    make -f Makefile.init makefiles \
        'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include' \
        'AUXLIBS_MYSQL=-L/usr/local/mysql/lib -lmysqlclient -lz -lm'

If your MySQL shared library is in a directory that the RUN-TIME linker does
not know about, add a "-Wl,-R,/path/to/directory" option after "-lmysqlclient".

Postfix versions before 3.0 use AUXLIBS instead of AUXLIBS_MYSQL. With Postfix
3.0 and later, the old AUXLIBS variable still supports building a statically-
loaded MySQL database client, but only the new AUXLIBS_MYSQL variable supports
building a dynamically-loaded or statically-loaded MySQL database client.

    Failure to use the AUXLIBS_MYSQL variable will defeat the purpose of
    dynamic database client loading. Every Postfix executable file will have
    MYSQL database library dependencies. And that was exactly what dynamic
    database client loading was meant to avoid.

On Solaris, use this instead:

    make -f Makefile.init makefiles \
        'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include' \
        'AUXLIBS_MYSQL=-L/usr/local/mysql/lib -R/usr/local/mysql/lib \
            -lmysqlclient -lz -lm'

Then, just run 'make'. This requires libz, the compression library. Older mysql
implementations build without libz.

Using MySQL tables

Once Postfix is built with mysql support, you can specify a map type in main.cf
like this:

    alias_maps = mysql:/etc/postfix/mysql-aliases.cf

The file /etc/postfix/mysql-aliases.cf specifies lots of information telling
Postfix how to reference the mysql database. For a complete description, see
the mysql_table(5) manual page.

Example: local aliases

#
# mysql config file for local(8) aliases(5) lookups
#

# The user name and password to log into the mysql server.
user = someone
password = some_password

# The database name on the servers.
dbname = customer_database

# For Postfix 2.2 and later The SQL query template.
# See mysql_table(5) for details.
query = SELECT forw_addr FROM mxaliases WHERE alias='%s' AND status='paid'

# For Postfix releases prior to 2.2. See mysql_table(5) for details.
select_field = forw_addr
table = mxaliases
where_field = alias
# Don't forget the leading "AND"!
additional_conditions = AND status = 'paid'

# This is necessary to make UTF8 queries work for Postfix 2.11 .. 3.1,
# and is the default setting as of Postfix 3.2.
option_group = client

Additional notes

Postfix 3.2 and later read [client] option group settings by default. To
disable this, specify no option_file and specify "option_group =" (i.e. an
empty value).

Postfix 3.1 and earlier don't read [client] option group settings unless a non-
empty option_file or option_group value are specified. To enable this, specify,
for example "option_group = client".

The MySQL configuration interface setup allows for multiple mysql databases:
you can use one for a virtual table, one for an access table, and one for an
aliases table if you want.

Since sites that have a need for multiple mail exchangers may enjoy the
convenience of using a networked mailer database, but do not want to introduce
a single point of failure to their system, we've included the ability to have
Postfix reference multiple hosts for access to a single mysql map. This will
work if sites set up mirrored mysql databases on two or more hosts. Whenever
queries fail with an error at one host, the rest of the hosts will be tried in
random order. If no mysql server hosts are reachable, then mail will be
deferred until at least one of those hosts is reachable.

Credits

  * The initial version was contributed by Scott Cotton and Joshua Marcus, IC
    Group, Inc.
  * Liviu Daia revised the configuration interface and added the main.cf
    configuration feature.
  * Liviu Daia with further refinements from Jose Luis Tallon and Victor
    Duchovni developed the common query, result_format, domain and
    expansion_limit interface for LDAP, MySQL and PostgreSQL.

