跳转到主要内容

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

简介

Postfix 的 MySQL 映射类型允许您将 Postfix 连接到 MySQL 数据库。此实现支持多个 MySQL 数据库:您可以使用一个用于 virtual(5) 表,一个用于 access(5) 表,另一个用于 aliases(5) 表。您可以为同一数据库指定多个服务器,以便 Postfix 在其中一个服务器出现故障时切换到另一个可用服务器。

使用 MySQL 映射的繁忙邮件服务器会生成大量并发 MySQL 客户端,因此 MySQL 服务器应在此情况下运行。您可以通过使用 Postfix 的 proxymap(8) 服务来减少并发 MySQL 客户端的数量。

构建支持 MySQL 的 Postfix

这些说明假设您已按照 INSTALL 文档从源代码构建 Postfix。如果您从供应商特定的源代码包构建 Postfix,可能需要进行一些修改。

注意:要在 Debian GNU/Linux 的 Postfix 中使用 MySQL,只需安装 postfix-mysql 包即可。无需重新编译 Postfix。

Postfix MySQL 客户端使用 mysql 客户端库,可从以下位置获取:

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

要构建支持 MySQL 映射的 Postfix,您需要在编译时添加 -DHAS_MYSQL 选项,并将包含 MySQL 头文件的目录以及 mysqlclient 库(和 libm)添加到 AUXLIBS_MYSQL 中,例如:

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

如果 MySQL 共享库位于运行时链接器未知目录中,请在 "-lmysqlclient" 之后添加 "-Wl,-R,/path/to/directory" 选项。

Postfix 3.0 之前的版本使用 AUXLIBS 而不是 AUXLIBS_MYSQL。在 Postfix 3.0 及更高版本中,旧的 AUXLIBS 变量仍支持构建静态加载的 MySQL 数据库客户端,但只有新的 AUXLIBS_MYSQL 变量支持构建动态加载或静态加载的 MySQL 数据库客户端。

未使用 AUXLIBS_MYSQL 变量将导致动态数据库客户端加载失效。每个 Postfix 可执行文件都将包含 MySQL 数据库库依赖项。而这正是动态数据库客户端加载旨在避免的情况。

在 Solaris 系统上,请使用以下命令:

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"

然后,只需运行 'make'。这需要 libz,即压缩库。较旧的 MySQL 实现可以不依赖 libz 进行构建。

使用 MySQL 表

一旦 Postfix 带 MySQL 支持编译完成,您可以在 main.cf 中指定映射类型,如下所示:

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

文件 /etc/postfix/mysql-aliases.cf 指定了大量信息,用于告知 Postfix 如何引用 MySQL 数据库。如需完整说明,请参阅 mysql_table(5) 手册页。

示例:本地别名

#
# mysql 配置文件,用于 local(8) aliases(5) 查找
#
# 登录 mysql 服务器的用户名和密码。
user = someone
password = some_password
# 服务器上的数据库名称。
dbname = customer_database
# 适用于 Postfix 2.2 及更高版本的 SQL 查询模板。
# 详情请参阅 mysql_table(5)。
query = SELECT forw_addr FROM mxaliases WHERE alias='%s' AND status='paid'
# 适用于 Postfix 2.2 之前的版本。详情请参阅 mysql_table(5)。
select_field = forw_addr
table = mxaliases
where_field = alias
# 不要忘记开头的 "AND"!
additional_conditions = AND status = 'paid'
# 这是为了使 UTF8 查询在 Postfix 2.11 至 3.1 中正常工作,
# 并且从 Postfix 3.2 开始这是默认设置。
option_group = client

附加说明

Postfix 3.2 及更高版本默认读取 [client] 选项组设置。要禁用此行为,请不指定 option_file,并设置 "option_group ="(即空值)。

Postfix 3.1 及更早版本不会读取 [client] 选项组设置,除非指定了非空的 option_fileoption_group 值。要启用此功能,请指定例如 "option_group = client"。

MySQL 配置界面支持多个 MySQL 数据库:您可以使用一个用于虚拟表,一个用于访问表,以及一个用于别名表(如需)。

对于需要多个邮件交换器的站点,虽然使用网络化邮件数据库可带来便利,但为避免引入系统单点故障,我们提供了让 Postfix 通过多个主机访问单个 MySQL 映射的特性。此功能适用于在两个或更多主机上设置镜像 MySQL 数据库的场景。当一个主机上的查询因错误失败时,其余主机将以随机顺序尝试连接。如果所有 MySQL 服务器主机均不可达,则邮件将被延迟,直至至少一个主机可达。

致谢

  • 初始版本由 Scott Cotton 和 Joshua Marcus(IC Group, Inc.)贡献。
  • Liviu Daia 修改了配置界面并添加了 main.cf 配置功能。
  • Liviu Daia 在 Jose Luis Tallon 和 Victor Duchovni 的进一步完善下,为 LDAP、MySQL 和 PostgreSQL 开发了通用查询、result_format、domain 和 expansion_limit 接口。