本节说明了涉及地址处理的关键字。其中包含以下各节:
关键字:822、733、uucp、header_822、header_733、header_uucp
这组关键字控制通道支持的地址类型。传输层(邮件信封)中使用的地址和邮件标题中使用的地址是有区别的。
源路由信封地址。此通道支持完整的 RFC 822 格式的信封寻址约定(包含源路由)。也可以使用关键字 sourceroute,它是 822 的同义词。如果不指定其他信封地址类型关键字,则此关键字为默认设置。
百分号信封地址。此通道支持完整的 RFC 822 格式的信封寻址(源路由除外);应该使用百分号约定重写源路由。也可以使用关键字 percents,它是 733 的同义词。
在 SMTP 通道中使用 733 地址约定将导致在 SMTP 信封的传输层地址中继续使用这些约定。这可能违反 RFC 821。请仅在确实必要时才使用 733 地址约定。
bang 式样的信封地址。此通道在信封中使用符合 RFC 976 bang 式样地址约定的地址(例如,这是 UUCP 通道)。也可以使用关键字 bangstyle,它是 uucp 的同义词。
源路由标题地址。此通道支持完整的 RFC 822 格式的标题寻址约定(包含源路由)。如果不指定其他标题地址类型关键字,则此关键字为默认设置。
百分号标题地址。此通道支持 RFC 822 格式的标题寻址(源路由除外);应该使用百分号约定重写源路由。
在邮件标题中使用 733 地址约定可能会违反 RFC 822 和 RFC 976。请仅在确保通道连接到无法处理源路由地址的系统时才使用该关键字。
UUCP 或 bang 式样标题地址。不建议使用此关键字。使用此关键字违反 RFC 976。
关键字:bangoverpercent、nobangoverpercent、percentonly
地址始终依据 RFC 822 和 RFC 976 进行解释。但是,处理上述标准未涉及的某些复合地址时会有歧义。尤其是,格式 A!B%C 的地址可以解释为:
A 是路由主机,C 是最终目标主机
或
C 是路由主机,A 是最终目标主机
尽管 RFC 976 指出邮件程序可以使用后一种约定解释地址,但却没有说这种解释是必需的。某些情况下使用前一种解释反而更好。
bangoverpercent 关键字强制执行前一种 A!(B%C) 解释。nobangoverpercent 关键字强制执行后一种 (A!B)%C 解释。nobangoverpercent 是默认设置。
此关键字不影响对格式 A!B@C 地址的处理。这些地址将始终被处理为 (A!B)@C。RFC 822 和 RFC 976 均强制使用这种处理。
percentonly 关键字忽略 bang 路径。如果设置了此关键字,百分号将被解释为路由。
关键字:exproute、noexproute、improute、noimproute
MTA 使用的寻址模式假定所有系统都知道所有其他系统的地址并知道如何到达这些地址。不幸的是,这一理想并非在所有情况下都可行,例如当通道连接到一个或多个不为外界所知的系统(例如专用 TCP/IP 网络中的内部计算机)时就不可行。该通道中的系统的地址对于站点以外的远程系统来说可能是非法的。如果希望能够回复上述地址,则地址中必须包含源路由,源路由将通知远程系统通过本地计算机路由邮件。然后本地计算机可以(自动)将邮件路由到上述计算机中。
当通道地址传递到远程系统时,exproute 关键字("explicit routing" 的缩写)通知 MTA 关联的通道要求显式路由。如果在通道中指定了此关键字,MTA 会将包含本地系统名称(或本地系统的当前别名)的路由信息添加到与该通道匹配的所有标题地址和所有信封 From: 地址。默认设置 noexproute 指定不应该添加路由信息。
EXPROUTE_FORWARD 选项可用于将 exproute 操作限制为反向指向地址。当 MTA 通过无法为自身执行正确路由的通道连接到系统时,将出现另一种情况。在这种情况下,当邮件被发送到与无法胜任路由的系统相连接的通道中时,所有该邮件中使用的与其他通道关联的地址均需要指明路由。
隐式路由和 improute 关键字用于处理这种情况。MTA 知道,当邮件被发送到标记为 improute 的通道中时,邮件中使用的所有与其他通道匹配的地址都需要路由。默认设置 noimproute 指定不应该将路由信息添加到发出到指定通道的邮件的地址中。IMPROUTE_FORWARD 选项可用于将 improute 操作限制为反向指向地址。
exproute 和 improute 关键字应谨慎使用。它们会使地址变得长而且复杂,并可能破坏其他系统使用的智能路由模式。显式和隐式路由不应与指定的路由混淆。指定的路由用于将来自重写规则的路由信息插入到地址中。此功能由特殊的 A@B@C 重写规则模板激活。
激活指定路由后,它将被应用到标题和信封的所有地址。由于指定路由是被特定的重写规则激活的,因此它们通常独立于当前使用的通道。显式和隐式路由的控制却是以每个通道为基础,插入的路由地址始终是本地系统。
向通道重写地址时,routelocal 通道关键字使 MTA 尝试让地址中所有显式路由“短路”。显式路由地址(使用字符 !、% 或 @)将被简化。
在内部通道(如内部 TCP/IP 通道)中使用此关键字可以简化 SMTP 中继阻止的配置。
请注意,在可能需要显式 % 路由或其他路由的通道中不应该使用此关键字。
关键字:connectalias、connectcanonical
将邮件加入通道队列时,MTA 通常重写地址。邮件出队期间,不再执行其他重写操作。当主机名已更改,而通道队列中却仍然存在发送到旧主机名的邮件时,上述做法将导致潜在的问题。
connectalias 关键字通知 MTA 将邮件传送到收件人地址中列出的任意主机。该值为默认值。关键字 connectcanonical 通知 MTA 连接到 MTA 原本应该连接的系统的主机别名。
关键字:remotehost、noremotehost、defaulthost、nodefaulthost
MTA 常收到来自配置错误或不兼容的邮件程序和 SMTP 客户机的不包含域名的地址。在允许进一步传递这类邮件之前,MTA 将尝试使其合法。MTA 通过在地址中附加域名来达到上述目的(例如,将 @siroe.com 附加到 mrochek 后面)。
对于缺少域名的信封 To: 地址,MTA 始终假定应该附加本地主机名。但是对于其他地址(例如 From: 地址),就 MTA SMTP 服务器而言至少有两个合理的域名选择:本地 MTA 主机名和客户机 SMTP 报告的远程主机名。或者在某些情况下,可能还有第三种合理的选择—将添加到进入该通道的邮件中的特定域名。现在,前两种选择都可能是正确的,因为两种情况都可能在运行时以一定的频率出现。当处理配置不正确的 SMTP 客户机时,使用远程主机的域名比较合适。当处理轻量远程邮件客户机(例如使用 SMTP 收发邮件的 POP 或 IMAP 客户机)时,使用本地主机的域名可能比较合适。或者,如果是轻量远程邮件客户机(例如 POP 或 IMAP 客户机),则客户机具有不属于本地主机的自己的特定域名。那么添加上述不同的特定域名可能会比较合适。MTA 最好基于每个通道在通道中作选择。
noremotehost 通道关键字指定应该使用本地主机的名称。关键字 noremotehost 是默认设置。
defaulthost 通道关键字用于指定特定的主机名,以将其附加到外来的缺少域名的用户 ID 的地址中。它必须后接用于完成进入相应通道的地址(信封 From: 和标题中)的域名。(如果提交通道,defaulthost 关键字的第一个参数还将影响缺少域名的信封 To: 地址。)可以指定用于完成信封 To: 地址的第二个可选域名(其中至少有一个句点)。nodefaulthost 是默认设置。
如前面的外来邮件的备用通道(切换通道)部分所述,switchchannel 关键字可用于将外来的 SMTP 连接与特定通道相关联。该功能可用于在通道中对远程邮件客户机进行分组,以便对它们进行适当的处理。或者,您可以部署与标准兼容的远程邮件客户机(即使多个不兼容的客户机正在使用中),这比尝试解决 MTA 主机中网络范围的问题简单。
RFC 822 (Internet) 邮件需要包含收件人标题行:To:、Cc: 或 Bcc: 标题行。缺少上述标题行的邮件是非法的。然而,某些损坏的用户代理和邮件程序(例如,许多老版本的 sendmail)却发送非法邮件。
missingrecipientpolicy 关键字使用整数值,该值指定用于处理此类邮件的方法;如果未明确指定该关键字,则默认值为 1(传递非法邮件,不进行更改)。
表 12–25 missingrecipientpolicy 的值
值 |
操作 |
---|---|
0 |
将信封 To: 收件人置于 To: 标题行。 |
1 |
传递非法邮件,不进行更该。 |
2 |
将信封 To: 收件人置于 To: 标题行。 |
3 |
将所有信封 To: 收件人置于单一 Bcc: 标题行。 |
4 |
生成一个组构建(例如 ";")To: 标题行,即 "To: Recipients not specified: ;" |
5 |
生成一个空 Bcc: 标题行。 |
6 |
拒绝邮件。 |
请注意,MISSING_RECIPIENT_POLICY 选项可用于为此行为设置 MTA 系统默认值。初始 Messaging Server 配置将 MISSING_RECIPIENT_POLICY 设置为 1。
在 RFC 822 (Internet) 邮件中,所有 To:、Resent-To:、Cc: 或 Resent-Cc: 标题都需要至少包含一个地址—这种标题不能包含空值。然而,某些邮件程序却可能发出这种非法标题。如果在源通道中指定 dropblank 通道关键字,此关键字将使 MTA 删除外来邮件中所有这种非法空标题。
reverse 关键字通知 MTA,应该使用地址反向数据库或 REVERSE 映射(如果其中任何一个存在的话)检查或修改(如果可能)在此通道排队的邮件的地址。noreverse 使在此通道排队的邮件地址免受地址反向处理。reverse 关键字是默认设置。请参阅将地址由内部格式转换为公用格式。
某些邮件系统处理 RFC 822 所允许的所有地址时会有困难。尤其常见的例子是基于 sendmail 的带有错误配置文件的邮件程序。用引号引起的本地部分(或指定的邮箱)是问题的常见根源:
"smith, ned"@siroe.com
这是引起问题的如此主要的根源,以致于 RFC 1137 制订了解决该问题的方法。基本的处理方法是从地址中删除引号,然后应用转换,将需要引号的字符映射为原子中允许的字符(有关本文中使用的“原子”的定义,请参见 RFC 822)。例如,前面的地址将变成:
smith#m#_ned@siroe.com
restricted 通道关键字通知 MTA,通道将连接到要求此编码的邮件系统。然后,当邮件被写入通道时,MTA 对标题和信封地址中用引号引起的部分进行编码。通道中的外来地址将被自动解码。unrestricted 关键字通知 MTA 不执行 RFC 1137 编码和解码。关键字 unrestricted 是默认设置。
如果与通道连接的系统无法接受用引号引起的本地部分,则应该对该通道应用 restricted 关键字。如果通道实际生成用引号引起的本地部分,则不应该对其应用该关键字。(我们认为能够生成这种地址的通道也能够处理这种地址。)
关键字:addreturnpath、noaddreturnpath
通常,添加 Return-path: 标题行是执行最终传送的通道的责任。但是对于某些通道(例如 ims-ms 通道),由 MTA 添加 Return-path: 标题比允许通道执行此添加操作效率更高。addreturnpath 关键字使 MTA 在邮件加入该通道队列时添加 Return-path: 标题。
关键字:receivedfor、noreceivedfor、receivedfrom、noreceivedfrom
receivedfor 关键字指示 MTA,如果邮件只发给一个信封收件人,则将该信封 To: 地址包含在其构建的 Received: 标题行中。关键字 receivedfor 是默认设置。noreceivedfor 关键字指示 MTA 构建 Received: 标题行,但不包含任何信封地址信息。
receivedfrom 关键字指示 MTA,如果 MTA 由于某些种类的邮件列表扩展等原因而更改了信封 From: 地址,则在为外来邮件构建 Received: 标题行时包含原来的信封 From: 地址。receivedfrom 是默认设置。noreceivedfor 关键字指示 MTA 构建 Received: 标题行,但不包含原来的信封 From: 地址。
关键字:commentinc、commentmap、commentomit、commentstrip、commenttotal、 sourcecommentinc、sourcecommentmap、sourcecommentomit、sourcecommentstrip、 sourcecommenttotal
MTA 仅在必要时才解释标题行的内容。但是,必须对所有包含地址的已注册的标题行进行分析,以重写并消除缩写格式的地址,或者将其转换为合法地址。此进程期间,将在重建标题行时提取注释(括号中的字符串),并可能对其进行修改或将其排除。
可以使用关键字 commentinc、commentmap、commentomit、commentstrip 和 commenttotal 控制此行为。commentinc 关键字通知 MTA 保留标题行中的注释。这是默认设置。关键字 commentomit 通知 MTA 从寻址标题(例如,To:、From: 或 Cc: 标题行)删除所有注释。
关键字 commenttotal 通知 MTA 从除 Received: 标题行之外的所有标题行中删除所有注释;通常,该关键字没有用处或建议不要使用。commentstrip 通知 MTA 从所有注释字段中删除所有非原子字符。commentmap 关键字通过 COMMENT_STRINGS 映射表运行注释字符串。
在源通道中,可以使用关键字 sourcecommentinc、sourcecommentmap、sourcecommentomit、sourcecommentstrip 和 sourcecommenttotal 控制此行为。sourcecommentinc 关键字指示 MTA 保留标题行中的注释。这是默认设置。sourcecommentomit 关键字指示 MTA 从寻址标题(例如 To:、From: 和 Cc: 标题)删除所有注释。关键字 commenttotal 通知 MTA 从除 Received: 标题之外的所有标题中删除所有注释;因此,该关键字通常没有用处或建议不要使用。最后,sourcecommentstrip 关键字指示 MTA 从所有注释字段中删除所有非原子字符。sourcecommentmap 关键字通过源通道运行注释字符串。
上述关键字可以应用到所有通道中。
COMMENT_STRINGS 映射表的语法如下:
(comment_text) | address
如果条目模板设置了 $Y 标志,则使用指定的文本(应该用括号括起)替换原来的注释。
关键字:personalinc、personalmap、personalomit、personalstrip、 sourcepersonalinc、sourcepersonalmap、sourcepersonalomit、sourcepersonalstrip
在重写进程期间必须对所有包含地址的标题行进行分析,以重写并消除缩写格式的地址,或者将其转换为合法地址。在此进程期间,将在重建标题行时提取个人名称(尖括号分隔的地址前面的字符串),并可以选择对其进行修改或将其排除。
可以使用关键字 personalinc、personalmap、personalomit 和 personalstrip 控制此行为。关键字 personalinc 通知 MTA 保留标题中的个人名称。这是默认设置。关键字 personalomit 通知 MTA 删除所有个人名称。关键字 personalstrip 通知 MTA 从所有个人名称字段中删除所有非原子字符。personalmap 关键字指示 MTA 通过 PERSONAL_NAMES 映射表运行个人名称。
在源通道中,可以使用关键字 sourcepersonalinc、sourcepersonalmap、sourcepersonalomit 或 sourcepersonalstrip 控制此行为。sourcepersonalinc 关键字指示 MTA 保留标题中的个人名称。这是默认设置。sourcepersonalomit 关键字指示 MTA 删除所有个人名称。最后,sourcepersonalstrip 指示 MTA 从所有个人名称字段中删除所有非原子字符。sourcepersonalmap 关键字指示 MTA 通过源通道运行个人名称。
上述关键字可以应用到所有通道中。
PERSONAL_NAMES 映射表探测的语法是:
personal_name | address
如果模板设置了 $Y 标志,则用指定的文本替换原来的个人名称。
通常只在别名文件和别名数据库中查找被重写到本地通道(即 UNIX 中的 L 通道)的地址。可以将 aliaslocal 关键字置于通道中,以便在别名文件和别名数据库中也能查找被重写到该通道的地址。然后,ALIAS_DOMAINS 选项将控制所进行的查找探测的确切形式。
关键字:subaddressexact、subaddressrelaxed、subaddresswild
作为关于子地址概念的背景,本地和 ims-ms 通道对地址本地部分(邮箱部分)中的 + 字符有各自的特殊解释:在 name+subaddress@domain 形式的地址中,MTA 将邮箱中加号后面的部分看作子地址。本地通道将子地址看作附加的装饰性信息,它将邮件实际发送给帐户名,而不考虑子地址;ims-ms 通道将子地址解释为向其传送邮件的文件夹名。
子地址还影响本地通道(即 UNIX 中的 L 通道)对别名的查找、所有使用 aliaslocal 关键字标记的通道对别名的查找以及目录通道对邮箱的查找。上述查找匹配中对子地址的确切处理方式是可以配置的:将地址与条目进行比较时,MTA 将始终首先检查整个邮箱(包含子地址)以获得完全匹配;此后 MTA 是否执行其他检查是可以配置的。
subaddressexact 关键字指示 MTA 在条目匹配期间不执行特别的子地址处理;整个邮箱(包含子地址)与条目匹配时才认为该别名匹配。不执行其他比较(尤其是,不执行通配符比较或删除子地址后的比较)。subaddresswild 关键字指示 MTA,对完全匹配(包含整个子地址)进行查找后,接下来 MTA 应查找名称+* 格式的条目。subaddressrelaxed 关键字指示 MTA,对完全匹配以及名称+* 格式的匹配进行查找后,MTA 应另外检查仅名称部分相同的匹配。使用 subaddressrelaxed 时,以下格式的别名条目将与名称或名称 + 子地址匹配,无格式名称将转换为新名称,名称 + 子地址将转换为新名称 + 子地址。subaddressrelaxed 关键字是默认设置。
name: newname+*
因此,当使用别名或目录通道而用户希望接收使用任意子地址的邮件地址时,subaddresswild 关键字或 subaddressrelaxed 关键字可能很有用。使用上述关键字后,将无需再为地址中的每个子地址变量分别指定条目。
请注意,上述关键字只对本地通道(即 UNIX 中的 L 通道)、目录通道或用 aliaslocal 关键字标记的任意通道有意义。
标准的 Messaging Server 配置通过实际具有 subaddressrelaxed 行为的 L 通道进行中继操作(未明确指定其他关键字时使用的默认设置)。
rules 关键字通知 MTA 对该通道强制执行特定于通道的重写规则检查。该值为默认值。norules 关键字通知 MTA 不对该通道进行检查。这两个关键字通常用于调试,很少在实际应用程序中使用。
dequeue_removeroute 关键字在邮件出队列时从信封 To: 地址中删除源路由。此关键字当前仅在 tcp-* 通道中得以实现。将邮件传输到不能正确处理源路由的系统中时,此关键字会很有用。
关键字:viaaliasoptional、viaaliasrequired
viaaliasrequired 指定所有与通道匹配的最终收件人地址都必须由别名生成。最终收件人地址是指执行别名扩展(如果相关)后的匹配。不能将地址作为收件人地址直接传递给 MTA,也就是说,仅将地址重写到通道是不够的。重写到通道后,地址必须通过别名进行扩展,然后才能被认为与通道真正匹配。
例如,viaaliasrequired 关键字可以用于本地通道中阻止任意帐户(例如 UNIX 系统中的任意本地 Berkeley 邮箱)的传送。
默认设置是 viaaliasoptional,表示不要求与通道匹配的最终收件人地址由别名生成。