PostgreSQL 映射支持
Postfix 的 pgsql 映射类型允许您将 Postfix 连接到 PostgreSQL 数据库。此实现支持多个 pgsql 数据库:您可以使用一个用于 virtual(5) 表,一个用于 access(5) 表,以及一个用于 aliases(5) 表(如果需要)。您可以为同一数据库指定多个服务器,以便 Postfix 在其中一个服务器出现故障时可以切换到正常的数据库服务器。
使用 pgsql 映射的繁忙邮件服务器会产生大量并发 pgsql 客户端,因此运行 pgsql 服务器时应考虑到这一点。您可以通过使用 Postfix 的 proxymap(8) 服务来减少并发 pgsql 客户端的数量。
构建支持 PostgreSQL 的 Postfix
这些说明假设您已按照 INSTALL 文档从源代码构建 Postfix。如果您从供应商特定的源代码包构建 Postfix,可能需要进行一些修改。
注意:要在 Debian GNU/Linux 的 Postfix 中使用 pgsql,只需安装 postfix-pgsql 包即可。无需重新编译 Postfix。
要为 Postfix 添加 PostgreSQL 映射支持,您需要指定 -DHAS_PGSQL、PostgreSQL 头文件目录以及 libpq 库文件的位置。
例如:
% make tidy
% make -f Makefile.init makefiles \
"CCARGS=-DHAS_PGSQL -I/usr/local/include/pgsql" \
"AUXLIBS_PGSQL=-L/usr/local/lib -lpq"如果您的 PostgreSQL 共享库位于运行时链接器未知的目录中,请在 "-lpq" 后添加 "-Wl,-R,/path/to/directory" 选项。
Postfix 3.0 之前的版本使用 AUXLIBS 而不是 AUXLIBS_PGSQL。从 Postfix 3.0 开始,旧的 AUXLIBS 变量仍支持构建静态加载的 PostgreSQL 数据库客户端,但只有新的 AUXLIBS_PGSQL 变量支持构建动态加载或静态加载的 PostgreSQL 数据库客户端。
未使用 AUXLIBS_PGSQL 变量将无法实现动态数据库客户端加载的目的。每个 Postfix 可执行文件都将包含 PostgreSQL 数据库库依赖项。而这正是动态数据库客户端加载旨在避免的情况。
然后只需运行 'make'。
配置 PostgreSQL 查找表
一旦 Postfix 构建了 pgsql 支持,您可以在 main.cf 中指定映射类型,如下所示:
/etc/postfix/main.cf: alias_maps = pgsql:/etc/postfix/pgsql-aliases.cf
文件 /etc/postfix/pgsql-aliases.cf 指定了大量信息,告诉 postfix 如何引用 pgsql 数据库。完整描述请参阅 pgsql_table(5) 手册页。
示例:本地别名
# # pgsql 配置文件用于 local(8) aliases(5) 查找 # # # Postfix 将尝试连接的主机 hosts = host1.some.domain host2.some.domain # 登录 pgsql 服务器的用户名和密码 user = someone password = some_password # 服务器上的数据库名称 dbname = customer_database # Postfix 2.2 及更高版本的 SQL 查询模板。参见 pgsql_table(5) query = SELECT forw_addr FROM mxaliases WHERE alias='%s' AND status='paid' # Postfix 2.2 之前的版本。详情请参阅 pgsql_table(5) select_field = forw_addr table = mxaliases where_field = alias # 不要忘记开头的 "AND"! additional_conditions = AND status = 'paid'
使用镜像数据库
需要多个邮件交换器的站点可能希望使用网络邮件数据库的便利性,但又不希望在系统中引入单点故障。
出于这个原因,我们包含了让 Postfix 引用多个主机来访问单个 pgsql 映射的功能。如果站点在两个或多个主机上设置镜像 pgsql 数据库,这将起作用。
当一个主机上的查询因错误而失败时,其余主机将以随机顺序尝试。如果没有 pgsql 服务器主机可访问,则邮件将被延迟,直到至少其中一个主机可访问。
致谢
- 此代码基于 IC Group, Inc. 的 Scott Cotton 和 Joshua Marcus 开发的 Postfix mysql 映射
- PostgreSQL 修改由 Aaron Sethman 完成
- Philip Warner 添加了对 Postfix 1.1.x 和 PostgreSQL 7.1+ 的更新以及调用存储过程的支持
- LaMont Jones 是最初的 Postfix pgsql 维护者
- Liviu Daia 修改了配置界面并添加了 main.cf 配置功能
- Liviu Daia 与 Jose Luis Tallon 和 Victor Duchovni 一起进一步改进,为 LDAP、MySQL 和 PostgreSQL 开发了通用查询、result_format、domain 和 expansion_limit 接口
- Leandro Santi 在 PostgreSQL 开发人员针对 SQL 注入问题对数据库 API 进行重大更改后更新了 PostgreSQL 客户端,并使 PQexec() 处理更加健壮