Sun Java System Messaging Server 6 2005Q4 管理指南

MTA 如何将重写规则应用到地址

以下步骤介绍 MTA 如何将重写规则应用到给定地址:

  1. MTA 从地址中提取第一个主机或域说明。

    一个地址可以指定多个主机或域名,如下例所示:

    jdoe%hostname@siroe.com.

  2. 识别了第一个主机或域名之后,MTA 将执行搜索,扫描其模式与主机或域名匹配的重写规则。

  3. 找到匹配的重写规则后,MTA 将根据该规则的模板部分重写地址。

  4. 最后,MTA 会将通道标记和与每个通道相关联的主机名进行比较。

    如果找到匹配,MTA 会将邮件加入关联的通道队列中;否则该重写过程失败。如果匹配的通道为本地通道,则会通过查找别名数据库和别名文件来进行地址的某个附加的重写。

在下个小节中将更加详细地介绍这些步骤。


注 –

使用不属于任何现有通道的通道标记将导致其地址与此规则匹配的邮件被退回。也就是使匹配的邮件无法路由。


步骤 1:提取第一个主机或域说明

重写地址的过程通过从地址中提取第一个主机或域说明开始。(建议不熟悉 RFC 822 地址约定的读者阅读该标准以便理解以下讨论内容。)扫描地址中的主机/域说明的顺序如下所示:

  1. 源路由中的主机(从左向右读取)

  2. 主机显示在 "at" 符号 (@) 的右侧

  3. 主机显示在最后单个百分比符号 (%) 的右侧

  4. 主机显示在第一个感叹号 (!) 的)

如果 bangoverpercent 关键字在正进行地址重写的通道上有效(即,如果尝试将邮件加入队列的通道自身被标上 bangoverpercent 通道关键字),则最后两个项目的顺序将被切换。

表 11–3 中显示了可以首先提取的一些地址和主机名的示例。

表 11–3 提取的地址和主机名

地址 

第一个主机域说明 

注释 

user@a

a

“简短格式”域名。 

user@a.b.c

a.b.c

全限定”域名 (fully qualified domain name, FQDN)。

user@[0.1.2.3]

[0.1.2.3]

“域文字”。 

@a:user@b.c.d

a

带有简短格式域名“路由”的源路由的地址。

@a.b.c:user@d.e.f

a.b.c

源路由的地址;路由部分被完全限定。 

@[0.1.2.3]:user@d.e.f

[0.1.2.3]

源路由的地址;路由部分是域文字。 

@a,@b,@c:user@d.e.f

a

带有 a 到 b 到 c 路由的源路由的地址。 

@a,@[0.1.2.3]:user@b

a

在路由部分中带有域文字的源路由的地址。 

user%A@B

B

此非标准的路由格式称为“百分比黑客”。

user%A

A

 

user%A%B

B

 

user%%A%B

B

 

A!user

A

“Bang 式样”寻址;通常用于 UUCP。 

A!user@B

B

 

A!user%B@C

C

 

A!user%B

B

nobangoverpercent 关键字处于活动状态;默认值。

A!user%B

A

bangoverpercent 关键字处于使用中。

RFC 822 不在地址中对感叹号 (!) 和百分比符号 (%) 进行解释。如果 at 符号不存在,百分比符号通常与 at 符号 (@) 的解释方法相同,因此 Messaging Server MTA 采用了该约定。

重复的百分比符号的特殊解释用于允许将百分比符号作为本地用户名的一部分;这在处理某些外部邮件系统地址时可能会十分有用。感叹号的解释符合 RFC 976 的“bang 式样”地址约定,因此可以在 Messaging Server MTA 中使用 UUCP 地址。

RFC 822 或 RFC 976 都没有指定这些解释的顺序,因此可以使用 bangoverpercentnobangoverpercent 关键字来控制执行重写的通道应用这些解释的顺序。尽管在某些情况下其他设置可能会很有用,但默认值更“标准”一些。


注 –

不建议在地址中使用感叹号 (!) 或百分比符号 (%)。


步骤 2. 扫描重写规则

从地址中提取出第一个主机或域说明后,MTA 将咨询重写规则以找出要执行的操作。将主机/域说明与每个规则的模式部分(即每个规则的左侧)进行比较。该比较不区分大小写。RFC 822 规定不区分大小写。MTA 不区分大小写,但在可能的情况下将保留大小写。

如果主机或域说明与任何模式均不匹配,即所谓的“与任何规则均不匹配”的情况,则主机或域说明的第一个部分(第一个句点前的部分,通常为主机名)将被删除并用星号 (*) 替换,然后将再次尝试查找生成的主机或域说明,但只在配置文件重写规则中查找(不查询域数据库)。

如果此操作失败,则会删除第一个部分并重复该过程。如果此操作也失败了,则会删除下一个部分(通常为子域),重写程序会再次尝试,首先带星号然后不带星号。包含星号的所有探测只在配置文件重写规则表中进行;不检查域数据库。此过程将继续,直到找到匹配或用尽整个主机或域说明。此过程的作用是尝试首先与最为特别的域匹配,然后逐渐与不太特别和比较一般的域匹配。

从倾向于算法的角度看,此匹配过程为:

例如,假设地址 dan@sc.cs.siroe.edu 将被重写。这将导致 MTA 按照给定的顺序查找以下模式:


sc.cs.siroe.edu
*.cs.siroe.edu
.cs.siroe.edu
*.*.siroe.edu
.siroe.edu
*.*.*.edu
.edu
*.*.*.*
.
 

步骤 3. 根据模板重写地址

主机/域说明与某个重写规则匹配后,将使用该规则的模板部分进行重写。模板指定了三个内容:

  1. 地址的新用户名。

  2. 地址的新的主机/域说明。

  3. 用于识别现有 MTA 通道(到达该地址的邮件应该发送到此通道)的通道标记。

步骤 4. 完成重写进程

主机/域说明重写后可能会出现下面两种情况之一。

重写规则失败

如果主机/域说明无法与任何重写规则匹配,并且不存在默认规则时,MTA 将使用“原样”说明;例如原始说明将成为新的说明和路由系统。如果地址中包含无意义的主机/域说明,则当路由系统不匹配与任何通道相关联的任何系统名时,将检测出该说明并将邮件退回。

重写后的语法检查

重写规则应用到地址后不进行任何附加的语法检查。这是有意的—这样可以使用重写规则将地址转换成不符合 RFC 822 的格式。但是,这也意味着配置文件中的错误可能会导致邮件为 MTA 留下不正确或非法的地址。

处理域文字

在重写过程中将对域文字进行特殊处理。如果地址的域部分中显示的域文字与某个重写规则模式不匹配,则该文字将被解释为由句点分隔并由方括号括起来的一组字符串。最右侧的字符串将被删除并会重复进行搜索。如果此操作不起作用则将删除下一个字符串,以此类推直到只剩下空括号。如果搜索空括号失败,则会删除整个域的文字并会对域地址的下一个部分(如果该部分存在)继续进行重写。域文字的内部处理中不使用星号;由星号替换整个域文字时,星号的数量与域文字中的元素的数量相对应。

与常规的域或主机说明类似,域文字也是按最特定到最不特定的顺序进行尝试。其模式匹配的第一个规则将是用于重写主机或域说明的规则。如果规则列表中有两个相同的模式,则会使用首先显示的模式。

例如,假设地址 dan@[128.6.3.40] 将被重写。重写程序将依次查找 [128.6.3.40][128.6.3.][128.6.][128.][] 以及 [*.*.*.*],最后是全匹配规则 "."