上一页    目录    索引    下一页
iPlanet Messaging Server 5.2 管理员指南

第 7 篇 配置重写规则


本章描述如何配置 imta.cnf 文件中的重写规则。如果尚未阅读第 6 篇 “关于 MTA 服务与配置”,应先阅读之,然后再回来阅读本章。

本章包括以下各节:

Messaging Server 的地址重写工具是处理和修改地址的主机或域部分的主要工具。Messaging Server 还提供了其他的地址处理工具,如别名、地址反转数据库和专用映射表。但为了求得最好的性能,在可能的情况下应尽量使用重写工具来处理地址。



备注: 在修改了 imta.cnf 文件中的重写规则后,必需重新启动任何如 SMAP 服务器这样的程序或通道:它们只在用命令 imsimta start 启动时一次性地加载配置数据。如果使用的是已编译的配置,则必须重新编译然后再重新启动。

有关编译配置信息和启动程序方面的详细信息,请参阅 iPlanet Messaging Server Reference Manual




重写规则结构



重写规则出现在 MTA 配置文件 imta.cnf 的前半部分。配置文件中的每条规则占用一行。规则之间可以有注释行,但不得有空行。重写规则序列以空行结束,其后是通道定义。图 7-1 所示为局部配置文件的重写规则部分。

图 7-1

! test.cnf - An example configuration file.
!
! This is only an example of a configuration file. It serves
! no useful purpose and should not be used in a real system.
!
a.com   $U@a-host
b.org   $U@b-host
c.edu   $U%c@b-daemon
d.com   $U%d@a-daemon

! Begin channel definitions


简单配置文件 - 重写规则

重写规则包括两部分:一个模式,后跟一个等值串或模板。这两部分必须用空格分开,但其本身不得包含空格。重写规则结构如下:

pattern template

pattern(模式)

指示要在域名中寻找的串。图 7-1 所示的模式为 a.comb.orgc.edud.com

若模式匹配地址的域部分,重写规则即被应用于该地址。必须用空格将模式与模板分开。有关模式语法的详细信息,请参阅“重写规则模式和标记”

template(模板)

为下列中的之一:

UserTemplate%DomainTemplate@ChannelTag[controls]

UserTemplate@ChannelTag[controls]

UserTemplate%DomainTemplate[controls]

UserTemplate@DomainTemplate@ChannelTag[controls]

UserTemplate@DomainTemplate@SourceRoute@ChannelTag[controls]

UserTemplate(用户模板)

指定地址的用户部分如何被重写。置换序列可用来表示原地址的各个部分或数据库查询结果。置换序列被其所表示的内容代替从而构成重写地址。在图 7-1 中,使用的置换序列为 $U。有关详细信息,请参阅“模板置换串和重写规则控制序列”

DomainTemplate(域模板)

指定地址的域部分如何被重写。类似于 UserTemplateDomainTemplate 可包含置换序列。

ChannelTag(通道标记)

指示发送邮件的通道。(所有通道定义必须包含通道标记和通道名。通道标记通常出现在重写规则以及通道定义中。)

controls(控制)

使用控制可限制一个规则的适用性。一些控制序列必须出现在规则的开头,其他的控制则必须出现在规则的末尾。与控制有关的详细信息,请参阅“模板置换串和重写规则控制序列”

有关模板语法的详细信息,请参阅“重写规则模板”


重写规则模式和标记



本节包含下列分节:

大部分重写规则模式由一个与唯一主机相匹配的特定的主机名,或者一个匹配整个子域中的任意主机/域的子域模式所组成。

例如,下面所示的重写规则模式包含一个仅与指定主机相匹配的特定主机名:

host.siroe.com

下一个重写规则模式包含一个将匹配整个子域中的任意主机或域的子域模式:

.siroe.com

然而,这一模式并不与主机名 siroe.com 精确匹配,要与主机名 siroe.com 精确匹配,需要另一个 siroe.com 模式。

MTA 首先尝试从特定的主机名重写主机/域名,然后逐步归纳使其不那么具体。这意味着较专一的重写规则模式比较一般的重写规则模式优先应用。例如,假定配置文件中有下面所示的重写规则模式:

hosta.subnet.siroe.com
.subnet.siroe.com
.siroe.com

基于重写规则模式,地址 jdoe@hosta.subnet.siroe.com 将匹配重写规则模式 hosta.subnet.siroe.com;地址 jdoe@hostb.subnet.siroe.com 将匹配重写规则模式 .subnet.siroe.com;地址 jdoe@hostc.siroe.com 将匹配重写规则模式.siroe.com

特别应指出的是,结合子域重写规则模式来使用重写规则,在 Internet 站点中是相当普遍的。这种站点一般拥有许多内部主机和子网的重写规则,因而将把顶级 Internet 域的重写规则从 internet.rulesserver-instance/imta/config/internet.rules)文件包含到配置中。

为了确保发送到 Internet 目的地的邮件(而不是通过更专一的重写规则处理的发至内部主机目的地之邮件)被适当地重写并路由到外发的 TCP/IP 通道,须确保 imta.cnf 文件中包含:


! Ascension Island
.AC $U%$H$D@TCP-DAEMON
. [text
. removed for
. brevity]
! Zimbabwe
.ZW $U%$H$D@TCP-DAEMON

IP 域字面值(常值)遵循类似的层次匹配模式,尽管是从右到左(而非从左到右)的匹配。例如,下面的模式只匹配、且精确匹配 IP 常值 [1.2.3.4]

[1.2.3.4]

下面的模式匹配子网 1.2.3.0 中的任何项:

[1.2.3.]

除了已经讨论的较常见的主机或子域类型的重写规则模式外,重写规则也可以使用几种特殊的模式,见表 7-1 中的概要,并在下面的段落中讨论。

表 7-1 重写规则特殊模式概要


模式

说明/用法

$*

匹配任何地址。如果指定了此规则,则不论其在文件中的位置如何,它都将是第一个被使用的规则。

$%

Percent Hack 规则。匹配任何以 A%B 形式描述的主机/域。

$!

Bang-style 规则。匹配任何以 A!B 形式描述的主机/域。

[ ]

IP 常值全匹配规则。匹配任何 IP 域常值。

.

匹配任何形式的主机/域描述。例如,joe@[129.165.12.11]

除了这些特殊模式外,Messaging Server 还有标记的概念可能出现在重写规则模式中。在一个地址有可能被多次重写的情况下需使用这些标记,而且在前一次重写的基础上,随后的重写必须有所区别,这是通过控制用哪个重写规则去匹配地址而实现的。有关详细信息,请参阅“有标记重写规则集”


用于匹配 Percent Hack 的规则

如果 MTA 试图重写具有 A%B 形式的地址并且失败,在完全失败之前会尝试一种额外的规则,即将地址形式处理为 A%B@localhost。(有关这些地址形式的详细信息,请参阅“重写规则模板”。)这个额外规则就是 Percent Hack 规则。其模式为 $%。此模式永不改变。当一个包含 Percent Hack 的本地部分以其他方式(包括如下所述的全匹配规则)重写失败时,此规则才予以启用。

Percent Hack 规则对于赋予 Percent Hack 地址以一些特殊的、内部的含义是十分有用的。


用于匹配 Bang-Style(UUCP)地址的规则

如果 MTA 试图重写具有 B!A 形式的地址并且失败,在完全失败之前会尝试一种额外的规则,即将地址形式处理为 B!A@localhost。这个额外的规则即 Bang-style 规则。其模式是 $!。此模式永不改变。当包含一个感叹号的本地部分以其他方式(包括如下所述的默认规则)重写失败时,此规则才予以启用。

Bang-style 规则可强制 UUCP 式样的地址经路由选择发送到一个具有广泛 UUCP 系统和路由能力的系统。


可匹配任意地址的规则

如果其他规则无法匹配并且通道表中无法找到该主机/域描述,则特殊的模式“.”(单句号)将匹配任何主机/域描述。换句话说,当其他地址重写方法都失败时,“.”规则将作为最后的一种手段进行地址重写。


备注: 关于置换序列,当全匹配规则匹配成功并且其模板被扩展时,$H 扩展为完整的主机名,$D 扩展为一个点“.”。因此,$D 在一个全匹配规则模板中的作用是很有限的!




有标记重写规则集

在重写进行过程中,将不同的规则集引入这一过程可能是适当的。您可通过重写规则标记实现这一目的。在配置文件或域数据库中查找之前,当前标记被添加在每个模式的前面。您可通过重写规则模板(如下所述)中的置换串 $T 用任何匹配的重写规则对该标记进行更改。

标记具有记忆性,一旦设置就会继续应用到从单一地址抽取出的所有主机。这意味着,一旦要使用任何标记,就必须非常细心地提供以适当标记值打头的备用规则。实践中很少会出现问题,因为标记通常只应用于非常专门的应用软件。一旦完成地址的重写,标记即被重置为默认标记,即一个空串。

根据约定,所有标记均以竖杠 | 结束。这一字符在一般地址中并不使用,因此可自由地用来分隔标记与模式的其余部分。


重写规则模板



以下各节将较详细地描述重写规则的模板格式。表 7-2 概括了各种模板格式。

表 7-2 重写规则模板格式概要


模板

页面

用法

A%B

1

A 为新用户/邮箱名,B 为新主机/域描述,再次重写。

A@B

1

视为 A%B@B。

A%B@C

1

A 为新用户/邮箱名,B 为新主机/域描述,路由到与主机 C 相关联的通道上。

A@B@C

1

视为 A@B@C@C。

A@B@C@D

1

A 为新用户/邮箱名,B 为新主机/域描述,插入 C 作为一个源路由,路由到与主机 D 相关联的通道上。


常用重写模板:A%B@C 或 A@B

下面的模板是最常见的模板形式。该规则应用于地址的用户部分和地址的域部分。于是使用新地址将邮件路由到一个指定的通道(由 ChannelTag 指示)。

UserTemplate%DomainTemplate@ChannelTag[controls]

下面模板形式在应用上与最常见的模板形式等同。然而,只有当 DomainTemplate ChannelTag 等同时,此种模板形式才成为可能。

UserTemplate@ChannelTag[controls]


重复重写模板 A%B

下面模板格式应用于元规则,这需要在应用规则后进行另外的重写。此规则应用后,整个重写过程在作为结果的新地址上重复。(而所有其他的重写规则格式则在规则应用后终止重写过程。)

UserTemplate%DomainTemplate[controls]

例如,下面的规则具有从地址末端删除所出现在那里可删除域(.removable domain)。

.removable $U%$H

在使用这些重复规则时应格外小心;使用不正确会造成“规则循环”(rules loop)。出于这一原因,只在确实必要时才应使用“元规则”。请确保一定要用 imsimta test -rewrite 命令测试元规则。有关 test -rewrite 命令的详细信息,请参阅 iPlanet Messaging Server Reference Manual


指定路由重写模板,A@B@C@D 或 A@B@C

如下格式的模板与常见模板以同样的方式运行 UserTemplate%DomainTemplate@ChannelTag(注意在第一分隔符上的区别),不同的是 ChannelTag 是作为源路由而被插入到地址中的。邮件然后经路由选择被传送到 ChannelTag

UserTemplate@DomainTemplate@Source-Route
    @ChannelTag[controls]

被重写地址变为 @route:user@domain.下面的模板也有效:

UserTemplate@DomainTemplate@ChannelTag[controls]

例如,下面的规则将地址 jdoe@com1 重写到源路由地址 @siroe.com:jdoe@com1。通道标记变为 siroe.com:

com1 $U@com1@siroe.com


重写规则模板中的大小写敏感性

与重写规则中的模式不同的是,模板中的字符应区分大小写。当使用重写规则来给一个对大小写敏感的邮件系统提供界面时,这是十分必要的。注意,像 $U 和 $D 这样的置换序列在置换从地址中抽取的材料时,保持字符原来的大小写不变。

当需要强制被置换材料只使用特定的字体形式(大写或小写)时,例如强制 UNIX 系统中的邮箱采用小写字母,可在模板中使用特殊的置换序列以强制被置换材料转换为所希望的字体形式。特别是 $\,它可强制随后的被置换材料转换为小写,$^ 可强制随后的被置换材料转换为大写,$_ 表示保持原来的字体形式不变。

例如,可使用下面的规则强制使地址 unix.siroe.com 处的邮箱采用小写字母。

unix.siroe.com $\$U$_%unix.siroe.com


MTA 将重写规则应用到地址的方法



下面的步骤描述 MTA 是如何将重写规则应用到给定地址的:

  1. MTA 从地址中抽取第一个主机或域描述。

    在这种情况下,一个地址可指定多个主机名或域名。

    jdoe%hostname@siroe.com.

  2. 在标识出第一个主机名或域名后,MTA 通过搜索以寻找一个其模式匹配该主机名或域名的重写规则。

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

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

    若匹配成功,MTA 将邮件排在相关通道的队列中;否则,重写过程失败。若匹配通道为本地通道,有可能通过查询别名数据库或别名文件而执行一些另外的地址重写。

这些步骤将在下面段落中详细描述。

备注: 使用不属于任何现有通道的通道标记将致使其地址匹配这一规则的邮件被退回。也即,使匹配的邮件不可路由。




第 1 步:抽取第一个主机描述或域描述

重写一地址的过程开始于从地址中抽取第一个主机描述或域描述。(建议不熟悉 RFC822 地址约定的读者阅读该标准以便理解下面的讨论。)扫描主机/域规范的顺序如下:

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

  2. 出现在“at”(@)符号右边的主机

  3. 出现在最后一个单独的百分号(%)右边的主机

  4. 出现在第一个感叹号(!)左边的主机

如果关键字 bangoverpercent 在正进行地址重写的通道上有效,上述顺序的最后两项须对换。也就是说,如果试图为邮件排队的通道本身被 bangoverpercent 通道关键字所标记。

一些应首先抽取的地址和主机名的例子,见表 7-3


表 7-3 抽取的地址和主机名 


地址

第一个主机域规范

注释

user@a

a

“简短”域名。

user@a.b.c

a.b.c

“全限定”域名(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

这种非标准形式的路由叫做 Percent Hack。

user%A

A

user%A%B

B

user%%A%B

B

A!user

A

“Bang-style”寻址;通常用于 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 采用。

对重复的百分号的特殊解释用于将百分号作为本地用户名的一部分,这对于处理某些外国邮件系统地址可能有用。对感叹号的解释符合 RFC976 的 Bang-style 地址约定,这使得 Messaging Server MTA 可以使用 UUCP 地址。

上述符号的解释的顺序没有在 RFC 822 或 RFC 976 中说明,因此可使用 bangoverpercent 和 nobangoverpercent 这两个关键字控制通道进行重写时所用的顺序。尽管备用设置在某些情况下很有用,但默认值更为“标准”。


备注: 在地址中不提倡使用感叹号(!)或百分号(%)。




第 2 步:扫描重写规则

一旦第一个主机或域描述从地址中抽取出,MTA 就参照重写规则对其进行处理。将主机/域描述与每个规则的模式部分(即,每个规则的左部)进行比较。这种比较不区分大小写。不区分大小写是由 RFC822 决定的。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 将按字面含义使用描述。例如,原描述既是新描述又是路由系统。如果地址中有一个无意义的主机/域描述,邮件将被退回。当路由系统不匹配任何关联某个通道的系统名时,此种情况即被检测出。


重写后语法检查

在重写规则应用于地址后不进行另外的语法检查。这是有意的安排,其目的是用重写规则把一个地址转换成不符合 RFC822 的格式。然而,这也意味着配置文件中的错误可能导致邮件带着不正确或非法的地址离开 MTA。


处理域常值

在重写过程中要对域常值进行特别的处理。如果出现在地址域部分的域常值无法按字面匹配一个重写规则模式,该常值即被解释为用方括弧括起来的、用句号分隔开的一系列字符串。在删除了最右边的串后,再次搜寻。如果仍不成功,删除下一个串,如此循环往复,直到剩下空的括弧为止。如果搜寻空括弧失败,则删除整个域常值,重写过程在域地址的下一节(如果有的话)继续进行。在域常值内部处理中不使用星号;当一个完整的域常值被一个星号所替换时,星号数量与域常值中的元素数量相对应。

与常用域或主机描述一样,域常值也是按最专一到最不专一的顺序进行尝试。其模式匹配成功的第一个规则被用来重写主机或域描述。如果在规则列表中有两个完全相同的模式,则使用先出现的那个。

作为例子,假定要重写 dan@[128.6.3.40] 地址。重写程序先寻找 [128.6.3.40],然后是 [128.6.3.][128.6.][128.][][*.*.*.*],最后是全匹配规则“.”。


模板置换串和重写规则控制序列



通过在重写地址中插入一个字符串,置换串被用于重写用户名或地址,它的值是由所用的特定置换序列决定。本节包含下列分节:

例如,在下面的模板中 $U 是一个置换序列。这使得被重写地址的用户名部分被置换到模板的输出中。因此,如果 jdoe@mailhost.siroe.com 被模板所重写,输出结果应该是 jdoe@siroe.com,$U 置换了原地址中用户名部分的 jdoe:

$U@siroe.com

控制序列向给定的重写规则的适用性附加另外的条件。不仅重写规则的模式部分须匹配被检查的主机或域描述,而且被重写的地址的其他方面也必须满足控制序列或序列组所设置的条件。例如,$E 控制序列要求被重写的地址为一信封地址,而 $F 控制序列要求该地址为一个向前指引地址。下面的重写规则只适用于(重写)信封的 To:地址,其形式为 user@siroe.com

siroe.com $U@mail.siroe.com$E$F

如果域或主机描述匹配了一个重写规则的模式部分,但没有满足规则模板控制序列的所有要求,则重写规则失败,重写程序将继续查找其他适合的规则。

表 7-4 为模板置换串和控制序列的概要。


表 7-4 模板置换串和控制序列概要 


置换序列

置换

$D

匹配的域描述部分。

$H

主机或域描述的未匹配部分,模式中圆点的左边。

$L

域常值的未匹配部分,模式常值中圆点的右边。

$U

原地址中的用户名。

$0U

原地址中的本地部分(用户名),除去任何子地址。

$1U

原地址中的本地部分(用户名)中的子地址(如果有的话)。

$$

插入一个美元符号常值($)。

$%

插入一个百分号常值(%)。

$@

插入一个 at 符号常值(@)。

$\

强制将内容转换为小写字母。

$^

强制将内容转换为大写字母。

$_

使用原字体形式(大写或小写)。

$W

置换随机的、唯一串。

$]...[

LDAP 搜索 URL 查找。

$(text)

一般数据库置换;如果查找失败则规则失败。

${...}

将指定映射应用到提供的串。

$[...]

调用客户机提供的程序;在结果中置换。

$&n

未匹配主机(或含通配符的主机)的 nth 部分,从 0 开始从左至右计数。

$!n

未匹配主机(或含通配符的主机)的 nth 部分,从 0 开始从右至左计数。

$*n

匹配模式的 nth 部分,从 0 开始从左至右计数。

$#n

匹配模式的 nth 部分,从 0 开始从右至左计数。

$nD

已匹配的域描述部分,保留自最左边 nth 部分(从 0 开始计数)。

$nH

未匹配的主机/域描述部分,保留自最左边 nth 部分(从 0 开始计数)。

控制序列

对重写规则的影响

$1M

只有在通道为内部重新处理之通道的情况下适用。

$1N

只有在通道为内部重新处理之通道的情况下适用。

$1~

可对任何未决匹配项进行检查。如果检查失败,则可成功地终止对当前重写规则模板的处理。

$A

如果主机位于 at 符号右边则适用

$B

只适用于标题/正文地址

$C channel

若发送到 channel 则失败

$E

只适用于信封地址

$F

只适用于向前指引的(例如,TO:)地址

$M channel

只适用于 channel 正在重写地址的情况

$N channel

channel 正在重写地址则失败

$P

如果主机位于百分号右边则适用

$Q channel

适用于发送到 channel 的情况

$R

只适用于向后指引的(例如,From:)地址

$S

如果主机来自源路由则适用

$Tnewtag

在将重写规则标记设置为 newtag(新标记)

$Vhost

如果主机名没有在 LDAP 目录中定义(在 DC 树中或作为虚拟域)则失败。如果 LDAP 搜索超时,则直接跟在主机名后面的字符的重写模板之剩余部分将被供选用的 MTA 串 DOMAIN_FAILURE 替换。

$X

如果主机位于感叹号左边则适用

$Zhost

如果主机名在 LDAP 目录中有定义(在 DC 树中或作为虚拟域)则失败。如果 LDAP 搜索超时,则直接跟在主机名后面的字符的重写模板之剩余部分将被供选用的 MTA 串 DOMAIN_FAILURE 替换。

$?errmsg

若重写失败则返回 errmsg,而不是默认的出错信息。出错讯息必须使用 US ASCII。

$number?errmsg

若重写失败则返回 errmsg,而不是默认的出错信息,并将 SMTP 的扩展错误代码设置为 a.b.c

  • anumber/1000000(第一位数)

  • b 是(number/1000)1000 的剩余部分(2 至 4 位数的值)

  • cnumber 1000 的剩余部分(最后三位数的值)。

以下的例子将错误代码设为 3.45.89:

$3045089?the snark is a boojum


用户名和子地址置换 $U、$0U、$1U

模板中出现的任何 $U 将被用户名(RFC822 的“本地部分”)从原地址中替换掉。注意,形如 a."b" 的用户名将被 "a.b" 所替换,这是因为 RFC2822 已降格使用 RFC822 以前的语法,并以期后一种用法能在将来成为硬性规定。

模板中出现的任何 $0U 将被用户名从原地址中替换掉,并除去任何子地址及子地址指示符(+)。模板中出现的任何 $1U 将被子地址及子地址指示符(如果有的话)从原地址中替换掉。因此应注意,$0U 和 $1U 是用户名的互为补充的两个片断,$0U$1U 等同于简单的 $U。


主机/域和 IP 常值置换串 $D、$H、$nD、$nH、$L

任何 $H 将被不与规则匹配的主机或域描述部分所替换。任何 $D 将被与重写规则相匹配的主机或域描述所替换。字符序列 $nH 和 $nD 是保存最左边 nth 部分(从 0 开始计数)的一般的 $H 或 $D 部分的变量。也就是,$nH 和 $nD 忽略了一般为 $H 或 $D 的最左边的 n 个部分(从 1 开始计数),分别置换。特别是,$0H 等同于 $H,$0D 等同于 $D。

例如,假定地址 jdoe@host.siroe.com 匹配下面的重写规则:

host.siroe.com $U%$1D@TCP-DAEMON

重写后的地址为 jdoe@siroe.com 并将 TCP-DAEMON 用作出站通道。此处,若为 $D 则在整个域中置换匹配部分,即 host.siroe.com,而 $1D 则只在从第一部分(即 siroe)开始的那部分中置换匹配部分,因此只在 siroe.com 中置换。

$L 置换一域常值中不与重写规则相匹配的部分。


常值字符置换串 $$、$%、$@

字符 $、% 和 @ 通常为重写规则模板中的元字符。若需插入一个这样的常值字符,须在字符前用美元符号 $ 作标记。也即,$$ 扩展为一个单一的美元符号 $;$% 扩展为一个单一的百分号 %(在此情况下百分号不解释为模板域分隔符);$@ 扩展为一个单一的 at 符号@(也不解释为域分隔符)。


LDAP 查询 URL 置换串 $]...[

一形如 $]ldap-url[ 的置换串解释为一个 LDAP 查询 URL,而且 LDAP 查询的结果被置换。标准 LDAP URL 中忽略主机和端口。主机和端口则在 msg.conf 文件中指定(local.ldaphost local.ldapport 属性)。

也即,LDAP URL 应按如下格式指定,其中方括弧 [] 表示 URL 的可选部分。

ldap:///dn[?attributes[?scope?filter]]

dn 是必需的,它是一个指定搜索基的判别名。URL 中的可选的属性、范围和过滤器等部分进一步定义需返回什么信息。对于重写规则而言,所需的用于指定返回信息的属性是 mailRoutingSystem(或某个类似的属性)。范围可以是 base(默认)、one 或 sub 中的任意一个。所需过滤器可请求返回这样的对象:其 mailDomain 的值匹配被重写的域。

如果 LDAP 目录规划包含属性 mailRoutingSystemmailDomain,则决定用将一给定类型的地址路由到哪一个系统的可能的重写规则如下所示,其中将 LDAP URL 置换序列 $D 被用来在当前域名中置换到所创建的 LDAP 查询中:

.siroe.com \
  $U%$H$D@$]ldap:///o=siroe.com?mailRoutingSystem?sub? \
  (mailDomain=$D)


为了便于阅读,用反斜杠字符表示续行,使一个逻辑上的重写规则行呈现在两个物理行中。表 7-5 列出了 LDAP URL 置换序列。

表 7-5 LDAP URL 置换序列


置换序列

说明

$$

常值 $ 字符

$~ account

用户帐户主目录

$A

地址

$D

域名

$H

主机名(全限定域名的第一部分)

$L

去掉任何诸如 ~ 或 _ 这样的特殊前导字符的用户名

$S

子地址

$U

用户名


常规数据库置换串 $(...)

形如 $(text)这样的置换串被特定处理。文本部分被用作访问特殊的常规数据库的密钥。该数据库包括在文件 /imta/config/imta_tailor 中用 IMTA_GENERAL_DATABASE 选项指定的文件,通常就是文件 /imta/db/generaldb.db

该数据库是用实用工具 imta crdb 生成的。如果在数据库中找到“文本串”,则数据库的相关模板被置换。如果“文本串”不与数据库中的任何条目匹配,重写过程失败,就好象是重写规则一开始就没有匹配成功。如果置换成功,从数据库抽取出的模板被重新扫描以寻找另外的置换串。但是,来自抽取出的模板中的 $(text)置换被禁止,以防止无限的递归引用。

作为一个例子,假定地址 jdoe@siroe.siroenet 匹配下面的重写规则:

.SIROENET $($H)

然后,要在常规数据库中查找文本串 siroe,如果找到,查找结果将用于重写规则模板中。假定查找 siroe 的结果是 $u%eng.siroe.com@siroenet。那么模板的输出为 jdoe@eng.siroe.com(也即,用户名= jdoe,主机或域描述= eng.siroe.com),路由系统为 siroenet

如果常规数据库存在,它应该在世界范围内都是可读的,这样才能确保运转正常。


应用指定映射 ${...}

形如 ${mapping,argument} 的置换串用于从 MTA 映射文件中查找和应用一个映射。mapping 字段用于指定要使用的映射表的名称,而 argument 则用于指定要通过映射的字符串。映射必须存在,而且如果成功必须在输出中设置 $Y 标记。如果不存在或没有设置 $Y,重写将失败。如果成功,映射结果被合并到模板的当前位置处并再次扩展。

这种机制可使 MTA 的重写过程以各种复杂方式进行扩展。例如,用户名的地址部分可有选择地分析并修改,它通常不是 MTA 重写过程所具备的特性。


客户提供的例程置换串 $[...]

形如 $[ imageroutineargument] 置换串用于寻找和调用客户提供的例程。在 UNIX 的运行期,MTA 使用 dlopendlsym 从共享的库映像中动态地装载和调用指定的例程。例程以如下的参数表作为函数被调用:

status := routine (argument,arglength,result,reslength)

argument result 分别为 252 字节长的字符串缓冲区。在 UNIX 中,argument result 均作为字符串指针被传递,(例如在 C 中,其类型为 char*。)arglength reslength 是以引用形式传递的有符号长整数。作为输入,argument 包含重写规则模板中的参数串,arglength 为该参数串的长度。作为返回,结果串应被置于 result 中,结果的长度所置于 reslength 中。结果串将替换重写规则模板中的“$[image,routine,argument]”。若重写规则失败,例程返回 0,若重写规则成功,则例程返回到 -1。

这种机制可使重写过程以所有类型的复杂方式扩展。例如,可实施对某些类型的名字服务的调用,并将结果用于对地址进行某种方式的修改。目录服务查找向前指引地址(例如,To: 地址),该地址通往主机 siroe.com,可按下面的重写规则执行。在“针对方向和位置的重写规则($B、$E、$F、$R)”中描述的 $F 使得此规则只适用于向前指引地址:

siroe.com $F$[LOOKUP_IMAGE,LOOKUP,$U]

当一向前指引地址 jdoe@siroe.com 匹配此重写规则时,将使 LOOKUP_IMAGE(UNIX 中的一个共享库)被装载到内存中,并使例程 LOOKUPjdoe 为参数而被调用。例程 LOOKUP 应通过结果参数返回一个不同的地址,例如,John.Doe%eng.siroe.com,并返回值 -1 表示重写规则成功。结果串中的百分号(见“重复重写模板 A%B”)使得重写过程以 John.Doe@eng.siroe.com 作为要重写的地址而再次启动。

在 UNIX 系统中,站点提供的共享库映像应该是世界范围内可读的。


单字段置换串 $&、$!、$*、$#

单字段置换串从被重写的主机或域描述之中抽取出一个单一的子域。可供使用的单字段置换串参见表 7-6

表 7-6 单字段置换串


控制序列

用法

$&n

在主机描述(不匹配或无法匹配某种类型的通配符)中置换 nth 元素,n=0,1,2,..,9。元素被圆点所分隔;左边的第一个元素为 0。如果所要求的元素不存在,重写失败。

$!n

在主机描述(不匹配或无法匹配某种类型的通配符)中置换 nth 元素,n=0,1,2,..,9。元素被圆点所分隔;右边的第一个元素为 0。如果所要求的元素不存在,重写失败。

$*n

在域描述(确与模式中的显式文本相匹配的部分)中置换 nth 元素,n=0,1,2,..,9。元素被圆点所分隔;左边的第一个元素为 0。如果所要求的元素不存在,重写失败。

$#n

在域描述(确与模式中的显式文本相匹配的部分)中置换 nth 元素,n=0,1,2,..,9。元素被圆点所分隔;右边的第一个元素为 0。如果所要求的元素不存在,重写失败。

假定地址 jdoe@eng.siroe.com 匹配下面的重写规则:

*.SIROE.COM $U%$&0.siroe.com@mailhub.siroe.com

来自模板的结果为 jdoe@eng.siroe.com,以 mailhub.siroe.com 作为路由系统使用。


唯一串置换串

每次使用控制序列 $W 时都插入一个包含大写字母和数字的文本串,此文本串被设计为唯一的和不可重复的。当必须创建无重复地址信息时,$W 是很有用的。


针对源通道的重写规则($M、$N)

有可能有这样的重写规则,它只在与指定的源通道相关联时发挥作用。当一个短格式名具有两种含义时这是很有用的:

  1. 当它出现在到达一个通道的邮件中时。

  2. 当它出现在到达另一个通道的邮件中时。

针对源通道的重写都与使用中的通道程序以及通道关键字 rules 和 norules 相关联。如果 norules 被指定在与执行重写的 MTA 组件相关联的通道上,则不进行针对通道的重写检查。如果 rules 被指定在通道上,则强制执行针对通道的规则检查。关键字 rules 为默认值

针对源通道的重写不与匹配一给定地址的通道相关联。这只取决于执行重写的 MTA 组件以及该组件的通道表条目。

针对通道的重写检查由出现在规则的模板部分中的控制序列 $N 或 $M 所触发。跟在 $N 或 $M 后面,直到 at 符号(@),百分号(%),或随后的 $N,$M, $Q,$C,$T,或 $? 之前的字符序列,被解释为通道名。

例如,如果 channel 当前没有执行重写,$Mchannel 致使规则失败。如果 channel 正执行重写,$Nchannel 致使规则失败。可以指定多重的 $M 和 $N 子句。如果多重 $M 子句中的任何一个匹配成功,则规则成功。如果多重 $N 子句中的任何一个匹配成功,则规则失败。


针对目标通道的重写规则($C、$Q)

有可能有这样的重写规则,它的应用取决于邮件正在其列队中等侯的那个通道。当某台主机有两个名字时这很有用,一个名字为一个主机组所知晓,剩下的一个为另一个主机所知晓。通过使用不同通道向每组主机发送邮件,地址可被重写以与主机相联系,而且所用的名字是每个主机组都知晓的。

针对目标通道的重写与邮件正在其列队中等侯处理的那个通道,以及该通道上的通道关键字 rules norules 相关联。如果将 norules 指定在目标通道上,不执行针对通道的重写检查。如果将 rules 指定在目标通道上,则强制执行针对通道的规则检查。关键字 rules 为默认值

针对目标通道的重写不与给定地址相匹配的通道关联。这主要取决于邮件信封上的 To: 地址。当一邮件进入队列时,信封上的 To: 地址被首次重写以确定邮件进入哪个通道队列。在重写信封上的 To: 地址的过程中,任何 $C$Q 这样的控制序列均被忽略。在信封上的 To: 地址被重写、目标通道被决定之后,控制序列 $C$Q 才有效,这是由于与该邮件相关的其他地址要被重写。

针对目标通道的重写检查由规则的模板部分中出现的控制序列 $C 或 $Q 所触发。跟在 $C 或 $Q 之后,直到 at 字符(@),百分号字符(%),或另外的 $N,$M,$C,$Q, $T 或 $? 之前的字符序列,被解释为通道名。

例如,如果 channel 不是目标通道,则 $Qchannel 致使规则失败。另一个例子,如果 channel 是目标通道,则 $C channel 致使规则失败。可指定多重的 $Q 和 $C 子句。如果多重 $Q 子句中的任何一个匹配成功,则规则成功。如果多重 $C 子句中的任何一个匹配成功,则规则失败


针对方向和位置的重写规则($B、$E、$F、$R)

有时需要指定只应用于信封地址,或只应用于标题地址的重写规则。如果被重写的地址不是信封地址,控制序列 $E 强制重写失败。如果被重写的地址不是来自邮件标题或正文,控制序列 $B 强制重写失败。这些控制序列对重写无其他影响,并可出现在重写规则模板的任何地方。

地址也可按方向分类。向前指引地址是指 To:,Cc:,Resent-to: 或其他指向目标的标题行或信封行。向后指引地址就是 From:,Sender: 或 Resent-From: 之类的指向源的地址。如果地址为向前指引,控制序列 $F 子句使重写被应用。如果地址为向后指引,控制序列 $R 子句使重写被应用。


针对主机位置的重写($A、$P、$S、$X)

环境偶尔也要求对出现于地址中的主机名的位置敏感的重写。地址中的主机名可以几种不同的环境出现:

在一般情况下,不管主机名出现在何处,都应以相同的方式处理。在某些情况下可能需要特殊的处理。

有四种控制序列可用于基于地址中主机位置的匹配控制。

如果主机处于上述以外的位置,规则失败。这些序列可合并为一个单一的重写规则。例如,如果 $S 和 $A 被指定,规则匹配在源路由或 @ 符号右边指定的主机。不指定这些序列中的任何一个等同于指定全部;规则可进行与位置无关的匹配。


改变当前标记值 $T

控制序列 $T 用于改变当前重写规则标记。在配置文件和域数据库中查找之前,重写规则标记被添加到所有重写规则模式的前面。跟在 $T 之后,直到 @,%,$N,$M,$Q,$C,$T 或 $? 之前的文本被取出作为新的标记。

在处理一些特殊地址形式(当遇见一个特定的组件时,地址被整个改变)时标记十分有用。例如,假定当在源路由中的找到特殊的主机名 internet,该名字应从地址中删除,作为结果的地址被强制匹配,而不管 TCP-DAEMON 通道。

这可以通过像下面这样的规则来实现(localhost 被假定为本地主机的正式名):

internet $S$U@localhost$Tmtcp-force|

mtcp-force|. $U%$H@TCP-DAEMON

第一个规则将匹配特殊主机名 internet,如果它出现在源路由中。它强制匹配 internet 而不管本地通道,以确保可从地址中将之删除。于是重写标记被设定。重写继续进行,但由于标记的缘故,没有任何正常的规则能够匹配。最后,借助标记尝试默认规则,且该集的第二个规则被激活,不顾任何其他标准地强制匹配地址,而不管 TGP-DAEMON 通道。


控制与重写相关的出错消息($?)

当重写和通道匹配失败时,MTA 提供默认的出错消息。改变这些消息的功能在某些情况下是很有用的。例如,如果某人试着向以太网路由器邮箱发送邮件,则像“Our routers cannot accept mail”这样的提示可能比通常的提示“illegal host/domain specified”包含了更多的信息。

一种特殊的控制序列可用于改变规则失败时会被打印出来的出错消息。序列 $? 用于指定一个出错消息。跟在 $? 之后,直到 at 符号(@),百分号(%),$N,$M,$Q,$C,$T 或 $? 之前的文本被取出作为出错消息文本,如果重写的结果无法匹配任何通道,该出错消息会被打印出来。出错消息的设置具有记忆性,贯穿整个重写过程均有效。

包含 $? 的规则操作类似于其他规则。一规则只包含 $? 而不包含别的内容,这种特殊情况须特别注意,重写过程在未改变邮箱或地址的主机部分的情况下终止,并且主机是按字面含义在通道表中查找的。这样的查找会如预期的那样失败,并将出错消息作为一个结果返回。

例如,假定 MTA 配置文件的最后一个重写规则如下:

. $?Unrecognized address; contact postmaster@siroe.com

在这个例子中,任何导致失败的不能识别的主机或域描述在其失败处理过程中都将生成如下的出错消息:Unrecognized address; contact postmaster@siroe.com.


处理大量重写规则



MTA 总是从 imta.cnf 文件中读入所有的重写规则并其储存在一个散列表中。使用编译的配置文件可免除因每次需要相关信息时就去读配置文件而付出的额外开销;仍旧用一个散列表来储存所有的重写规则。此方案对于小规模或中等规模数量的重写规则是适当的。然而,一些站点需要多达 10,000 个重写规则甚至更多,这将消耗惊人数量的存储空间。

MTA 通过提供一种可选的工具来解决这一问题,该工具可将大量的重写规则存储在一个带辅助索引的数据文件中。每当读常规配置文件时,MTA 都要检查域数据库的存在情况。如果该数据库存在就将之打开,而且每当从配置文件中找到的规则匹配失败时就去参考该数据库。域数据库只有当给定的规则没有在匹配文件中找到时才被检查,因此总能将规则添加到配置文件中以覆盖数据库中的规则。在默认状态下,域数据库用于存储与受托域相关的重写规则。IMTA_DOMAIN_DATABASE 属性被储存在 imta_tailor 文件中。默认的数据库位置是 server-instance/imta/db/domaindb.db


备注: 请不要手工编辑此文件。当受托域在 Directory Server 中创建时,dirsync 过程将覆盖任何存在的域数据库,所以任何定制编辑的内容都将丢失。




测试重写规则



您可用 imsimta test -rewrite 命令测试重写规则。限定词 -noimage 用于在重新编译新配置之前测试对配置文件所做的修改。

使用这一工具重写几个地址时,用限定词 -debug 是很有用的。因为它可逐步显示重写地址的过程。例如,键入如下的命令:

% imsimta test -rewrite -debug joe@siroe.com

有关实用工具 imsimta test -rewrite 的详细描述,请参见 iPlanet Messaging Server Reference Manual


重写规则示例



下面例子提供重写规则样本以及如何依据规则重写样本地址

假定系统 SC.CS.SIROE.EDU 的配置文件包含的重写规则如图 7-2 所示。

图 7-2 重写规则示例


sc                     $U@sc.cs.siroe.edu
sc1                    $U@sc1.cs.siroe.edu
sc2                    $U@sc2.cs.siroe.edu
*                      $U%$&0.cs.siroe.edu
*.cs                   $U%$&0.cs.siroe.edu
*.cs.siroe             $U%$&0.cs.siroe.edu
*.cs.siroe.edu         $U%$&0.cs.siroe.edu@ds.adm.siroe.edu
sc.cs.siroe.edu        $U@$D
sc1.cs.siroe.edu       $U@$D
sc2.cs.siroe.edu       $U@$D
sd.cs.siroe.edu        $U@sd.cs.siroe.edu
.siroe.edu             $U%$H.siroe.edu@cds.adm.siroe.edu
.edu                   $U@$H$D@gate.adm.siroe.edu
[]                     $U@[$L]@gate.adm.siroe.edu



表 7-7 所示为一些样本地址以及它们是如何依据重写规则被重写和路由的。

表 7-7 样本地址和重写


初始地址

重写为

路由到

user@sc

user@sc.cs.siroe.edu

sc.cs.siroe.edu

user@sc1

user@sc1.cs.siroe.edu

sc1.cs.siroe.edu

user@sc2

user@sc2.cs.siroe.edu

sc2.cs.siroe.edu

user@sc.cs

user@sc.cs.siroe.edu

sc.cs.siroe.edu

user@sc1.cs

user@sc1.cs.siroe.edu

sc1.cs.siroe.edu

user@sc2.cs

user@sc2.cs.siroe.edu

sc2.cs.siroe.edu

user@sc.cs.siroe

user@sc.cs.siroe.edu

sc.cs.siroe.edu

user@sc1.cs.siroe

user@sc1.cs.siroe.edu

sc1.cs.siroe.edu

user@sc2.cs.siroe

user@sc2.cs.siroe.edu

sc2.cs.siroe.edu

user@sc.cs.siroe.edu

user@sc.cs.siroe.edu

sc.cs.siroe.edu

user@sc1.cs.siroe.edu

user@sc1.cs.siroe.edu

sc1.cs.siroe.edu

user@sc2.cs.siroe.edu

user@sc2.cs.siroe.edu

sc2.cs.siroe.edu

user@sd.cs.siroe.edu

user@sd.cs.siroe.edu

sd.cs.siroe.edu

user@aa.cs.siroe.edu

user@aa.cs.siroe.edu

ds.adm.siroe.edu

user@a.eng.siroe.edu

user@a.eng.siroe.edu

cds.adm.siroe.edu

user@a.cs.sesta.edu

user@a.cs.sesta.edu

gate.adm.siroe.edu
- route inserted

user@b.cs.sesta.edu

user@b.cs.sesta.edu

gate.adm.siroe.edu
- route inserted

user@[1.2.3.4]

user@[1.2.3.4]

gate.adm.siroe.edu
- route inserted

基本而言,这些重写规则表述的是:如果主机名是我们的短格式名(sc,sc1sc2)中的一个,或者是我们的全名(sc.cs.siroe.edu,等等)中的一个,则将其扩展为全名,并路由给我们。将 cs.cmu.edu 添加到一个只有单部分的短格式名的后面,然后重试。将后面跟有 .cs 的单部分转换为后面跟有 .cs.siroe.edu 的单部分,然后重试。同样,将 cs.siroe 转换为 cs.siroe.edu,然后重试

如果名字为 sd.cs.siroe.edu(可能是我们直接连接的某个系统),重写并将之路由到该处。如果主机名是子域 cs.siroe.edu 中的任何其他名字,则路由到 ds.cs.siroe.edu(子域 .cs.siroe.edu 的网关)。如果主机名是子域 siroe.edu 中的任何其他名字,则路由到 cds.adm.siroe.edu(子域 siroe.edu 的网关)。如果主机名是顶层域 .edu 中的任何其他名字,则路由到 gate.adm.siroe.edu(它可能有能力将邮件路由到正确的目标)。如果用的是域常值,也将其发送到 gate.adm.siroe.edu

大部分重写规则应用(如前面的例子)在任何情况下都不会改变地址的用户名(或邮箱)部分。当 MTA 用作通往不符合 RFC822 的邮件系统的接口时,可使用改变地址的用户名部分的功能。对于这样的邮件系统,有必要将主机或域描述部分填充到地址的用户名部分。如果必须使用此功能,须格外小心。


上一页    目录    索引    下一页
(c) 2002 年 Sun Microsystems, Inc. 版权所有。

更新日期:2002 年 2 月 27 日