MYSQL_TABLE(5) MYSQL_TABLE(5)
名称
mysql_table - Postfix 的 MySQL 客户端配置
概述
postmap -q "字符串" mysql:/etc/postfix/文件名
postmap -q - mysql:/etc/postfix/文件名 <输入文件
描述
Postfix 邮件系统使用可选表进行地址重写或邮件路由。这些表通常采用 dbm 或 db 格式。
此外,查找表也可以指定为 MySQL 数据库。要使用 MySQL 查找功能,需要在 main.cf 中将 MySQL 源定义为查找表,例如:
alias_maps = mysql:/etc/postfix/mysql-aliases.cf
文件 /etc/postfix/mysql-aliases.cf 的格式与 Postfix main.cf 文件相同,可以指定下文描述的参数。
列表成员资格
使用 SQL 存储 $mynetworks、$mydestination、$relay_domains、$local_recipient_maps 等列表时,必须理解表需要将每个列表成员存储为单独的键。表查找验证的是键的*存在性*。关于详细讨论,请参阅 DATABASE_README 文档中的"Postfix 列表与表"部分。
请勿创建返回 $mydestination 或 $relay_domains 等中完整域名列表的表,或者返回 $mynetworks 中 IP 地址的表。
请创建以每个匹配项为键、任意值为内容的表。对于 SQL 数据库,返回键本身或常量值是很常见的做法。
MySQL 参数
hosts
Postfix 尝试连接和查询的主机。使用 unix: 指定 UNIX 域套接字,inet: 指定 TCP 连接(默认)。示例:
hosts = inet:host1.some.domain inet:host2.some.domain:port
hosts = host1.some.domain host2.some.domain:port
hosts = unix:/file/name
主机会以随机顺序尝试,所有通过 UNIX 域套接字的连接会先于 TCP 连接尝试。连接在闲置约 1 分钟后自动关闭,并在需要时重新打开。Postfix 2.0 及更早版本不会随机化主机顺序。
注意:如果将 localhost 指定为主机名(即使加上 inet: 前缀),MySQL 会连接到默认的 UNIX 域套接字。要让 MySQL 通过 TCP 连接 localhost,必须指定:
hosts = 127.0.0.1
注意:如果 hosts 设置只指定了一个服务器,此客户端会假定目标是负载均衡器,将在单次失败后立即重新连接。对于 Postfix 3.9 及更早版本,请将同一服务器指定两次。
user
password
登录 MySQL 服务器的用户名和密码。示例:
user = someone
password = some_password
dbname
服务器上的数据库名称。示例:
dbname = customer_database
charset (默认: utf8mb4)
默认的 MySQL 客户端字符集,这也意味着排序规则。
此参数在 Postfix 3.9 及更高版本中可用。在早期 Postfix 版本中,默认值由 MySQL 实现决定(MySQL 8.0 默认为 utf8mb4,历史版本为 latin1)。
idle_interval (默认: 60)
空闲数据库连接关闭前的秒数。
此功能在 Postfix 3.9 及更高版本中可用。
retry_interval (默认: 60)
数据库连接出错后跳过的秒数。
注意:如果 hosts 设置只指定了一个服务器,此客户端会假定目标是负载均衡器,将在单次失败后立即重新连接。对于 Postfix 3.9 及更早版本,请将同一服务器指定两次。
此功能在 Postfix 3.9 及更高版本中可用。
query
用于搜索数据库的 SQL 查询模板,其中 %s 是 Postfix 尝试解析的地址的占位符,例如:
query = SELECT replacement FROM aliases WHERE mailbox = '%s'
默认情况下,每个查询都必须返回结果集(而不是将结果存储在表中);使用"require_result_set = no"(Postfix 3.2 及更高版本)时,没有结果集将被视为"未找到"。
此参数支持以下'%'扩展:
%% 替换为字面的'%'字符。
%s 替换为输入键。使用 SQL 引号确保输入键不会添加意外的元字符。
%u 当输入键是 user@domain 形式的地址时,替换为地址本地部分的 SQL 引号内容。否则替换为整个搜索字符串。如果本地部分为空,查询将被抑制且不返回结果。
%d 当输入键是 user@domain 形式的地址时,替换为地址域部分的 SQL 引号内容。否则查询将被抑制且不返回结果。
%[SUD]
这些大写扩展在 query 参数中的行为与其小写对应项相同。对于 result_format 参数(见下文),它们扩展的是输入键而非结果值。
%[1-9]
%1、%2...%9 模式替换为输入键域的最重要部分。如果输入键是 [email protected],则 %1 是 com,%2 是 example,%3 是 mail。如果输入键不合格或没有足够的域部分满足所有指定模式,查询将被抑制且不返回结果。
下文描述的 domain 参数将输入键限制为匹配域中的地址。当 domain 参数非空时,对不合格地址或非匹配域中地址的 SQL 查询将被抑制且不返回结果。
此参数在 Postfix 2.2 中可用。在早期版本中,SQL 查询由单独的参数构建:select_field、table、where_field 和 additional_conditions。从旧参数到等效查询的映射为:
SELECT [select_field]
FROM [table]
WHERE [where_field] = '%s'
[additional_conditions]
WHERE 子句中的'%s'会扩展为转义后的搜索字符串。在 Postfix 2.2 中,如果未指定 query 参数,则使用这些传统参数。
注意:不要在查询参数周围加引号。
result_format (默认: %s)
应用于结果属性的格式模板。最常用于在结果后附加(或前置)文本。此参数支持以下'%'扩展:
%% 替换为字面的'%'字符。
%s 替换为结果属性的值。当结果为空时跳过。
%u 当结果属性值是 user@domain 形式的地址时,替换为地址的本地部分。当结果的本地部分为空时跳过。
%d 当结果属性值是 user@domain 形式的地址时,替换为地址的域部分。当结果不合格时跳过。
%[SUD1-9]
这些大写和数字扩展插值的是输入键的部分而非结果。它们的行为与 query 中描述的相同。实际上,由于输入键是预先知道的,结果模板中键不包含所有指定信息的查询会被抑制且不返回结果。
例如,使用"result_format = smtp:[%s]"可以将 mailHost 属性用作 transport(5) 表的基础。应用结果格式后,多个值会连接为逗号分隔的字符串。expansion_limit 参数可以限制结果中的值数量,这对于最多只能返回一个值的映射特别有用。
默认值 %s 指定每个结果值应按原样使用。
此参数在 Postfix 2.2 及更高版本中可用。
注意:不要在结果格式周围加引号!
domain (默认: 无域列表)
这是域名、文件路径或"type:table"数据库的列表。指定后,只有具有*非空*本地部分和匹配域的完全限定搜索键才有资格进行查找:不执行'user'查找、裸域查找和"@domain"查找。这可以显著减少 MySQL 服务器的查询负载。
domain = postfix.org, hash:/etc/postfix/searchdomains
最好不要使用 SQL 来存储符合 SQL 查找条件的域。
此参数在 Postfix 2.2 及更高版本中可用。
注意:不要为 local(8) 别名定义此参数,因为输入键总是未限定的。
expansion_limit (默认: 0)
对映射查找返回的结果元素总数(以逗号分隔列表形式)的限制。设置为 0 表示禁用限制。如果超过限制,查找会返回临时错误。将限制设为 1 可确保查找不会返回多个值。
option_file
从给定文件而非默认的 my.cnf 位置读取选项。这会从 [client] 选项组读取选项,可选地后跟由 option_group 指定的组中的选项。
此参数在 Postfix 2.11 及更高版本中可用。
option_group (默认: Postfix >=3.2: client, <=3.1: 空)
从 MySQL 选项文件的指定组中读取选项,在读取 [client] 组的选项之后。
Postfix 3.2 及更高版本默认读取 [client] 选项组设置。要禁用此功能,请不指定 option_file 并指定"option_group ="(即空值)。
Postfix 3.1 及更早版本除非指定了非空的 option_file 或 option_group 值,否则不会读取 [client] 选项组设置。要启用此功能,请指定例如"option_group = client"。
此参数在 Postfix 2.11 及更高版本中可用。
require_result_set (默认: yes)
如果为"yes",要求每个查询都必须返回结果集。如果为"no",将没有结果集视为"未找到"。
此参数在 Postfix 3.2 及更高版本中可用。
TLS 相关设置
有关底层 MYSQL_OPT_SSL_* 功能的详细信息,请参阅 https://dev.mysql.com/doc/c-api/en/mysql-options.html 或 https://mariadb.com/kb/en/mysql_optionsv/。
tls_cert_file
包含客户端 X509 证书的文件。
此参数在 Postfix 2.11 及更高版本中可用。
tls_key_file
包含与 tls_cert_file 对应的私钥的文件。
此参数在 Postfix 2.11 及更高版本中可用。
tls_CAfile
包含客户端将识别的所有证书颁发机构 X509 证书的文件。优先级高于 tls_CApath。
此参数在 Postfix 2.11 及更高版本中可用。
tls_CApath
包含单独证书颁发机构证书文件的目录。
此参数在 Postfix 2.11 及更高版本中可用。
tls_ciphers
SSL 加密允许使用的密码列表。
此参数在 Postfix 2.11 及更高版本中可用。
tls_verify_cert (默认: no)
验证服务器名称是否与证书中的通用名称匹配。
此参数在 Postfix 2.11 及更高版本中可用。
使用 MySQL 存储过程
Postfix 3.2 及更高版本支持调用存储过程而非在查询中使用 SELECT 语句,例如:
query = CALL lookup('%s')
可以在存储过程的参数中使用前文描述的'%'扩展。
默认情况下,每个存储过程调用都必须返回结果集,即每条代码路径都必须执行返回结果集的 SELECT 语句(而不是将结果存储在表中)。使用"require_result_set = no"时,没有结果集将被视为"未找到"。
存储过程不得返回多个结果集。也就是说,不能有任何代码路径执行多个返回结果的 SELECT 语句(而不是将结果存储在表中)。
以下是返回单个结果集的存储过程示例:
CREATE [DEFINER=`user`@`host`] PROCEDURE
`lookup`(IN `param` VARCHAR(255))
READS SQL DATA
SQL SECURITY INVOKER
BEGIN
select goto from alias where address=param;
END
过时的 main.cf 参数
为了与其他 Postfix 查找表兼容,MySQL 参数也可以在 main.cf 中定义。为此,请指定不以斜杠或点开头的 MySQL 源名称。MySQL 参数将通过"您为源定义的名称_参数名"的形式访问。例如,如果将映射指定为"mysql:mysqlname",则"hosts"参数将在 main.cf 中定义为"mysqlname_hosts"。
注意:使用此形式时,MySQL 源的密码会写入 main.cf,而该文件通常是全局可读的。未来 Postfix 版本将不再支持此形式。
过时的查询接口
本节描述 Postfix 2.2 起已弃用的接口。它已被上文描述的更通用的 query 接口取代。如果定义了 query 参数,则此处描述的旧参数将被忽略。请迁移到新接口,因为旧接口可能在未来的版本中移除。
以下参数可用于填充形式如下的 SELECT 模板语句:
SELECT [select_field]
FROM [table]
WHERE [where_field] = '%s'
[additional_conditions]
占位符 %s 会被搜索字符串替换,并经过转义处理,因此如果包含单引号或其他特殊字符,不会导致解析错误或更严重的安全问题。
select_field
SQL 的"select"参数。示例:
select_field = forw_addr
table
SQL 的"select .. from"表名。示例:
table = mxaliases
where_field
SQL 的"select .. where"参数。示例:
where_field = alias
additional_conditions
SQL 查询的附加条件。示例:
additional_conditions = AND status = 'paid'
参见
postmap(1), Postfix 查找表维护
postconf(5), 配置参数
ldap_table(5), LDAP 查找表
pgsql_table(5), PostgreSQL 查找表
sqlite_table(5), SQLite 查找表
自述文件
DATABASE_README, Postfix 查找表概述
MYSQL_README, Postfix MySQL 客户端指南
许可证
必须随本软件分发 Secure Mailer 许可证。
历史
Postfix 1.0 版本引入了 MySQL 支持。
作者
原始实现:
Scott Cotton, Joshua Marcus
IC Group, Inc.
后续改进:
Liviu Daia
罗马尼亚科学院数学研究所
P.O. BOX 1-764
RO-014700 布加勒斯特, 罗马尼亚
存储过程支持由 John Fawcett 提供。
Wietse Venema
Google, Inc.
111 8th Avenue
New York, NY 10011, USA
MYSQL_TABLE(5)