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) 命令的输入。执行后会生成 dbmdb 格式的索引文件,供邮件系统快速查询。修改文本文件后,需执行命令"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@domainuser+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)