PGSQL_TABLE(5) PGSQL_TABLE(5)
名称
pgsql_table - Postfix PostgreSQL 客户端配置
概述
postmap -q "字符串" pgsql:/etc/postfix/文件名
postmap -q - pgsql:/etc/postfix/文件名 <输入文件
描述
Postfix 邮件系统使用可选表进行地址重写或邮件路由。这些表通常采用 dbm 或 db 格式。
此外,查找表也可以指定为 PostgreSQL 数据库。要使用 PostgreSQL 查找功能,需要在 main.cf 中定义 PostgreSQL 数据源作为查找表,例如:
alias_maps = pgsql:/etc/postfix/pgsql-aliases.cf
文件 /etc/postfix/pgsql-aliases.cf 的格式与 Postfix main.cf 文件相同,可以指定下文描述的参数。
列表成员关系
当使用 SQL 存储诸如 $mynetworks、$mydestination、$relay_domains、$local_recipient_maps 等列表时,必须理解表需要将每个列表成员存储为单独的键。表查找会验证键的*存在性*。有关详细讨论,请参阅 DATABASE_README 文档中的"Postfix 列表与表"部分。
请勿创建返回 $mydestination 或 $relay_domains 中完整域名列表的表,也不要返回 $mynetworks 中的 IP 地址列表。
请创建以每个匹配项为键、值为任意内容的表。在 SQL 数据库中,返回键本身或常量值是很常见的做法。
PGSQL 参数
hosts Postfix 尝试连接和查询的主机。除了 PostgreSQL 连接 URI 外,此设置还支持历史格式:unix:/路径名 用于 UNIX 域套接字,inet:主机:端口 用于 TCP 连接。其中 unix: 和 inet: 前缀为了向后兼容会被接受但忽略。示例:
hosts = postgresql://[email protected]/数据库名?sslmode=require
hosts = postgres://user:secret@localhost
hosts = inet:host1.some.domain inet:host2.some.domain:port
hosts = host1.some.domain host2.some.domain:port
hosts = unix:/文件/名称
支持的连接 URI 语法请参考 https://www.postgresql.org/docs/current/libpq-connect.html。
主机会以随机顺序尝试连接。闲置约 1 分钟后连接会自动关闭,并在需要时重新建立。详见 idle_interval 参数。
注意:如果 hosts 设置指定了 PostgreSQL 连接 URI,Postfix PostgreSQL 客户端将忽略该连接的 dbname、user 和 password 设置。
注意:如果 hosts 设置仅指定了一个服务器,客户端会假定目标是负载均衡器,并在单次失败后立即重连。对于 Postfix 3.9 及更早版本,请将同一服务器指定两次。
user
password
登录 PostgreSQL 服务器的用户名和密码。示例:
user = 用户名
password = 密码
对于以 URI 形式指定的 hosts 连接,user 和 password 设置将被忽略。
dbname 服务器上的数据库名称。示例:
dbname = 客户数据库
对于以 URI 形式指定的 hosts 连接,dbname 设置将被忽略。
当 hosts 指定任何非 URI 连接时,Postfix 3.10 及更高版本需要设置 dbname;早期版本始终需要此设置。
encoding
数据库客户端使用的编码。默认设置为:
encoding = UTF8
历史上,数据库客户端被硬编码为使用 LATIN1 以尝试禁用多字节字符支持。
此功能在 Postfix 3.8 及更高版本中可用。
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'
此参数支持以下 '%' 扩展:
%% 替换为字面 '%' 字符 (Postfix 2.2 及更高版本)
%s 替换为输入键。使用 SQL 引号确保输入键不会添加意外的元字符。
%u 当输入键是 user@domain 形式的地址时,替换为地址本地部分的 SQL 引号形式。否则替换为整个搜索字符串。如果本地部分为空,查询将被抑制且不返回结果。
%d 当输入键是 user@domain 形式的地址时,替换为地址域部分的 SQL 引号形式。否则查询将被抑制且不返回结果。
%[SUD] 这些大写扩展在查询参数中的行为与其小写对应项相同。与 result_format 参数(见下文)一起使用时,它们扩展的是输入键而非结果值。
这些 %S、%U 和 %D 扩展在 Postfix 2.2 及更高版本中可用。
%[1-9] %1、%2、... %9 模式将被替换为输入键域名的相应最重要部分。如果输入键是 [email protected],则 %1 是 com,%2 是 example,%3 是 mail。如果输入键未限定或没有足够的域组成部分来满足所有指定模式,查询将被抑制且不返回结果。
这些 %1、... %9 扩展在 Postfix 2.2 及更高版本中可用。
下文描述的 domain 参数将输入键限制为匹配域中的地址。当 domain 参数非空时,对未限定地址或非匹配域中地址的 SQL 查询将被抑制且不返回结果。
此参数的优先级在 Postfix 2.2 中有所变化,在早期版本中优先级从高到低为:select_function、query、select_field、...
在 Postfix 2.2 中,query 参数具有最高优先级,参见下文"过时的查询接口"部分。
注意:不要在 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"查找。这可以显著减少 PostgreSQL 服务器的查询负载。
domain = postfix.org, hash:/etc/postfix/searchdomains
最好不要使用 SQL 来存储符合 SQL 查找条件的域。
此参数在 Postfix 2.2 及更高版本中可用。
注意:不要为 local(8) 别名定义此参数,因为输入键总是未限定的。
expansion_limit (默认: 0)
对查找返回的结果元素总数(以逗号分隔列表形式)的限制。设置为 0 表示禁用限制。如果超过限制,查找将因临时错误而失败。将限制设置为 1 可确保查找不会返回多个值。
过时的 MAIN.CF 参数
为了与其他 Postfix 查找表兼容,PostgreSQL 参数也可以在 main.cf 中定义。为此,请指定不以斜杠或点开头的 PostgreSQL 数据源名称。PostgreSQL 参数将可以在 main.cf 中以"数据源名称_参数名"的形式访问。例如,如果将映射指定为"pgsql:pgsqlname",参数"hosts"将在 main.cf 中定义为"pgsqlname_hosts"。
注意:使用此形式时,PostgreSQL 数据源的密码会写入 main.cf,而该文件通常是全局可读的。此形式的支持将在未来的 Postfix 版本中移除。
过时的查询接口
本节描述 Postfix 2.2 中已过时的查询接口。请迁移到新的 query 接口,因为旧接口将被逐步淘汰。
select_function
此参数指定数据库函数名称。示例:
select_function = my_lookup_user_alias
这等同于:
query = SELECT my_lookup_user_alias('%s')
此参数会覆盖传统的表相关字段(如下所述)。在 Postfix 2.2 之前的版本中,它还会覆盖 query 参数。从 Postfix 2.2 开始,query 参数具有最高优先级,select_function 参数已被弃用。
以下参数(优先级低于上述 select_function 接口)可用于构建如下形式的 SQL SELECT 语句:
SELECT [select_field]
FROM [table]
WHERE [where_field] = '%s'
[additional_conditions]
%s 占位符在每次查找时会被查找键替换,并经过转义处理,因此即使包含单引号或其他特殊字符,也不会导致解析错误或更严重的安全问题。
从 Postfix 2.2 开始,此接口已被更通用的 query 接口取代。如果定义了更高优先级的 query 或 select_function 参数,此处描述的参数将被忽略。
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 查找表
mysql_table(5), MySQL 查找表
sqlite_table(5), SQLite 查找表
自述文件
DATABASE_README, Postfix 查找表概述
PGSQL_README, Postfix PostgreSQL 客户端指南
许可证
安全邮件程序许可证必须随本软件一起分发。
历史
PostgreSQL 支持在 Postfix 2.1 版本中引入。
作者
基于 MySQL 客户端:
Scott Cotton, Joshua Marcus
IC Group, Inc.
移植到 PostgreSQL:
Aaron Sethman
进一步改进:
Liviu Daia
罗马尼亚科学院数学研究所
P.O. BOX 1-764
RO-014700 布加勒斯特, 罗马尼亚
PGSQL_TABLE(5)