PPoossttffiixx PPoossttggrreeSSQQLL HHoowwttoo

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

IInnttrroodduuccttiioonn

The Postfix pgsql map type allows you to hook up Postfix to a PostgreSQL
database. This implementation allows for multiple pgsql 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 pgsql maps will generate lots of concurrent pgsql
clients, so the pgsql server(s) should be run with this fact in mind. You can
reduce the number of concurrent pgsql clients by using the Postfix proxymap(8)
service.

BBuuiillddiinngg PPoossttffiixx wwiitthh PPoossttggrreeSSQQLL ssuuppppoorrtt

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 pgsql with Debian GNU/Linux's Postfix, all you need to do is to
install the postfix-pgsql package and you're done. There is no need to
recompile Postfix.

In order to build Postfix with pgsql map support, you specify -DHAS_PGSQL, the
directory with the PostgreSQL header files, and the location of the libpq
library file.

For example:

    % make tidy
    % make -f Makefile.init makefiles \
            "CCARGS=-DHAS_PGSQL -I/usr/local/include/pgsql" \
            "AUXLIBS_PGSQL=-L/usr/local/lib -lpq"

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

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

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

Then just run 'make'.

CCoonnffiigguurriinngg PPoossttggrreeSSQQLL llooookkuupp ttaabblleess

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

    /etc/postfix/main.cf:
        alias_maps = pgsql:/etc/postfix/pgsql-aliases.cf

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

EExxaammppllee:: llooccaall aalliiaasseess

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

#
# The hosts that Postfix will try to connect to
hosts = host1.some.domain host2.some.domain

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

# The database name on the servers.
dbname = customer_database

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

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

UUssiinngg mmiirrrroorreedd ddaattaabbaasseess

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.

For this reason we've included the ability to have Postfix reference multiple
hosts for access to a single pgsql map. This will work if sites set up mirrored
pgsql 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 pgsql server hosts are reachable, then mail will
be deferred until at least one of those hosts is reachable.

CCrreeddiittss

  * This code is based upon the Postfix mysql map by Scott Cotton and Joshua
    Marcus, IC Group, Inc.
  * The PostgreSQL changes were done by Aaron Sethman.
  * Updates for Postfix 1.1.x and PostgreSQL 7.1+ and support for calling
    stored procedures were added by Philip Warner.
  * LaMont Jones was the initial Postfix pgsql maintainer.
  * Liviu Daia revised the configuration interface and added the main.cf
    configuration feature.
  * 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 PosgreSQL.
  * Leandro Santi updated the PostgreSQL client after the PostgreSQL developers
    made major database API changes in response to SQL injection problems, and
    made PQexec() handling more robust.

