Postfix MySQL Howto
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
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:
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, for example:
make -f Makefile.init makefiles \ 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include' \ 'AUXLIBS=-L/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:/usr/local/etc/postfix/mysql-aliases.cf
The file /usr/local/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 # The table name. table = mxaliases # Query components, see below. select_field = forw_addr where_field = alias # You may specify additional_conditions or leave this empty. additional_conditions = and status = 'paid' # The above variables will result in a query of the form: # # select forw_addr from mxaliases where alias = '$lookup' and status = 'paid' # # ($lookup is escaped so if it contains single quotes or other odd # characters, it will not cause trouble).
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.