简介
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 客户端库,可从以下位置获取:
要构建支持 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_file 或 option_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 接口。