跳转到主要内容

于 2025年04月22日 摘录自 Postfix PostgreSQL Howto

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() 处理更加健壮