CANONICAL(5) CANONICAL(5)
名称
canonical - Postfix 规范地址映射表格式
概述
postmap /etc/postfix/canonical
postmap -q "字符串" /etc/postfix/canonical
postmap -q - /etc/postfix/canonical <输入文件
描述
可选的 canonical(5) 表用于指定本地和非本地地址的映射规则。该映射由 cleanup(8) 守护进程在邮件存入队列前使用,且支持递归映射。
通常,canonical(5) 表以文本文件形式存在,作为 postmap(1) 命令的输入。执行后会生成 dbm 或 db 格式的索引文件,供邮件系统快速查询。修改文本文件后,需执行命令"postmap /etc/postfix/canonical"重建索引。
当通过 NIS、LDAP 或 SQL 等方式提供映射表时,其查询方式与普通索引文件相同。
此外,该表也可作为正则表达式映射提供(模式以正则表达式表示),或指向基于 TCP 的查询服务。这类情况下的查询方式详见下文"正则表达式表"和"TCP 查询表"章节。
默认情况下,canonical(5) 映射会同时影响消息头地址(邮件正文中显示的地址)和信封地址(如 SMTP 协议命令中使用的地址)。可通过 canonical_classes 参数控制。
注意:Postfix 2.2 及后续版本仅在客户端匹配 local_header_rewrite_clients 参数,或 remote_header_rewrite_domain 配置了非空值时,才会重写远程 SMTP 客户端的消息头。如需保持 Postfix 2.2 之前的行为,请指定"local_header_rewrite_clients = static:all"。
典型应用场景包括:
- 将登录名替换为 姓名.姓氏 格式
- 修正旧版邮件系统生成的地址格式
canonical(5) 映射不同于虚拟别名或本地别名:
- 如需修改收件地址但不改变邮件头,请使用 virtual(5) 或 aliases(5) 映射
- 虚拟别名详见 本地别名
大小写处理
查询时会将搜索字符串转换为小写。从 Postfix 2.3 开始,regexp: 和 pcre: 等支持大小写混合匹配的数据库类型将保留原始大小写。
表格式
postmap(1) 命令的输入格式如下:
模式 地址
当邮件地址匹配 模式 时,将其替换为对应的 地址
空行和注释:
- 空行和仅含空白字符的行会被忽略
- 以#开头的行视为注释
多行文本:
- 逻辑行以非空白字符开头
- 以空白字符开头的行视为上一行的续行
查询顺序
使用 DB、DBM 等索引文件或 NIS、LDAP、SQL 等网络表时,每个 用户@域名 查询会按以下顺序执行,直到找到匹配项:
1. 用户@域名 地址
- 完全匹配,优先级最高
- 适用于修正旧系统生成的地址
- 也可用于生成 姓名.姓氏 格式地址
2. 用户 地址
- 当域名等于 $myorigin
- 或域名在 $mydestination 中列出
- 或在 $inet_interfaces/$proxy_interfaces 中列出时生效
- 适用于将登录名转为 姓名.姓氏 格式
3. @域名 地址
- 通配符匹配,优先级最低
- 注意:使用通配符时,Postfix 会接受该域名下任何收件人的邮件,可能导致退信风暴
- 安全建议:
a) 改用精确的 1:1 映射
b) 或为该域名添加收件人验证:
smtpd_recipient_restrictions =
...
reject_unauth_destination
check_recipient_access
inline:{example.com=reject_unverified_recipient}
unverified_recipient_reject_code = 550
结果地址重写
查询结果会经过以下处理:
1. 若结果为 @其他域名,则保持用户名不变,仅替换域名
2. 当 append_at_myorigin=yes 时,为不含@的地址追加"@$myorigin"
3. 当 append_dot_mydomain=yes 时,为不含.的地址追加".$mydomain"
地址扩展
当邮件地址包含收件人分隔符时(如 user+扩展@domain),查询顺序变为:
1. user+扩展@domain
2. user@domain
3. user+扩展
4. user
5. @domain
propagate_unmatched_extensions 参数控制是否将未匹配的扩展(如 +foo)保留到查询结果中。
正则表达式表
使用正则表达式表(语法详见 regexp_table(5) 或 pcre_table(5))时:
- 每个模式都是应用于完整地址的正则表达式
- 不会拆分 user@domain 或 user+foo
- 按表中顺序匹配,首个匹配的模式生效
- 支持使用 $1、$2 等引用匹配的子表达式
TCP 查询表
使用基于 TCP 的查询服务(协议详见 tcp_table(5),Postfix 2.4 及更早版本不支持)时:
- 每次查询使用完整地址(不拆分)
- 结果处理方式与索引文件相同
已知问题
当前表格式不支持引号转义约定。
配置参数
以下 main.cf 参数特别相关(详见 postconf(5)):
canonical_classes (envelope_sender, envelope_recipient, header_sender, header_recipient)
指定哪些地址类型受规范映射影响
canonical_maps (空)
消息头和信封的地址映射表
recipient_canonical_maps (空)
收件人地址映射表
sender_canonical_maps (空)
发件人地址映射表
propagate_unmatched_extensions (canonical, virtual)
指定哪些映射表会保留未匹配的地址扩展
其他相关参数:
inet_interfaces (all)
邮件系统监听的网络接口
local_header_rewrite_clients (permit_inet_interfaces)
重写这些客户端的邮件头(补充$myorigin/$mydomain)
proxy_interfaces (空)
通过代理/NAT 接收邮件的接口
masquerade_classes (envelope_sender, header_sender, header_recipient)
地址伪装的作用范围
masquerade_domains (空)
需要隐藏子域结构的域名列表
masquerade_exceptions (空)
排除地址伪装的用户列表
mydestination ($myhostname, localhost.$mydomain, localhost)
本地投递的域名列表
myorigin ($myhostname)
本地邮件的默认域名
owner_request_special (yes)
对 owner-列表名 和 列表名-request 地址的特殊处理
remote_header_rewrite_domain (空)
重写远程客户端邮件头的默认域名
参见
cleanup(8) - 邮件规范化和入队
postmap(1) - 查询表管理工具
postconf(5) - 配置参数说明
virtual(5) - 虚拟别名系统
参考文档
DATABASE_README - 查询表概述
ADDRESS_REWRITING_README - 地址重写指南
版权声明
本软件遵循 Secure Mailer 许可证。
作者
Wietse Venema
IBM T.J. Watson 研究院
邮政信箱 704
美国纽约州约克城高地 10598
Wietse Venema
Google 公司
第八大道 111 号
美国纽约州纽约市 10011
CANONICAL(5)