MYSQL_TABLE(5)                                                  MYSQL_TABLE(5)

名称
       mysql_table - Postfix 的 MySQL 客户端配置

概述
       postmap -q "字符串" mysql:/etc/postfix/文件名

       postmap -q - mysql:/etc/postfix/文件名 <输入文件

描述
       Postfix 邮件系统使用可选表进行地址重写或邮件路由。这些表通常采用 dbmdb 格式。

       此外,查找表也可以指定为 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_fieldtablewhere_fieldadditional_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_fileoption_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.htmlhttps://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)