Sun Java System Messaging Server 6.3 管理指南

第 10 章 关于 MTA 服务和配置

本章介绍常规 MTA 服务和配置。其他章节中包含更具体和详细的说明。其中包含以下各节:

10.1 编译 MTA 配置

只要修改了 MTA 配置文件(例如 imta.cnfmappingsaliasesoption.dat),就必须重新编译配置。该命令可以将配置文件编译成共享内存中的单个映像(在 UNIX 中)或动态链接库(在 NT 中)。

经过编译的配置中包含静态和动态可重新装入的部分。如果更改了动态部分,并且运行了 imsimta reload,则正在运行的程序将重新装入动态数据。动态部分为映射表、别名和查找表。

编译配置信息的主要原因是为了提高性能。使用经过编译的配置的另一个功能是可以更方便地测试配置更改,因为使用编译后的配置时,配置文件本身不会处于“活动”状态。

当 MTA 组件(例如通道程序)必须读取配置文件时,它首先会查看经过编译的配置是否存在。如果存在,则将映像附加到正在运行的程序。如果映像附加操作失败,则 MTA 会返回使用原先读取文本文件的方法。

如果对 reverseforward 或常规数据库进行了更改,可执行命令 imsimta reload 使更改生效。如果对 imta.cnfmappings 文件、aliasesconversionsoption.dat 文件进行了更改,而这些更改不会影响作业控制器,则应先执行 imsimta cnbuild,再执行 imsimta restart smtp。如果对 dispatcher.cnf 进行了更改,则需要执行 imsimta restart dispatcher。如果对编译后的配置中的配置文件进行了更改,并且这些更改会影响作业控制器但不会影响 SMTP 服务器,则通常应执行以下命令:imsimta cnbuildimsimta restart job_controller

如果对编译后的配置中的配置文件进行了更改,而这些更改会影响 SMTP 服务器和作业控制器,则应执行以下命令:


imsimta cnbuild
imsimta restart smtp 
imsimta restart job_controller

(有关这些命令的详细信息,请参见《Sun Java System Messaging Server 6.3 Administration Reference》中的“MTA Commands”。)

必须重新启动作业控制器的其他实例有:

MTA 配置包括 imta.cnf 及其所含的所有文件(例如 internet.rules)、alias 文件、mappings 文件、conversions 文件、option.dat 文件(以及上述所有文件中包含的所有文件)、imta.filter 以及 reverseforward 和通用数据文件,还可能包括一些 configutil 参数。

请注意,以上对 imta.cnf 的所有更改(例如,添加/更改通道定义中的关键字)也需要 imsimta cnbuild—这是基本要求,无论是否需要重新启动作业控制器。

除非因上述条件之一必须重新启动作业控制器,否则应尽量避免重新启动,特别是在队列中有大量邮件的情况下。

建议不要在营运系统中使用 imsimta refresh 命令,因为通常没有必要重新启动作业控制器,而且重新启动作业控制器将会重置邮件重试次数、延迟的通知邮件、退回的邮件等。

10.2 MTA 配置文件

主 MTA 配置文件为 imta.cnf。默认情况下,此文件位于 msg-svr-base/config/imta.cnf。此文件包含 MTA 通道定义及通道重写规则。与重写目标地址关联的通道成为目标通道。使用默认的 imta.cnf 时,系统通常会运行良好。

本节简要介绍了 MTA 配置文件。有关配置构成 MTA 配置文件的重写规则和通道定义的详细信息,请参见第 11 章,配置重写规则第 12 章,配置通道定义

通过修改 MTA 配置文件,可以建立在站点中使用的通道,并且可以通过重写规则确定哪些通道负责哪类地址。配置文件通过指定可用的传输方法(通道)及将地址类型与相应的通道关联的传输路线(重写规则),建立电子邮件系统的布局。

配置文件由两部分组成:域重写规则和通道定义。域重写规则最先显示在文件中,并由空行与通道定义分隔开。通道定义统称为通道表。一个单独的通道定义构成一个通道块。

以下 imta.cnf 配置文件示例显示了如何使用重写规则将邮件路由至正确的通道。其中不使用域名,以尽可能使其简化。重写规则显示在配置文件的上半部分,下半部分是通道定义。


! test.cnf - An example configuration file.   (1)!
! This is only an example of a configuration file. It serves
! no useful purpose and should not be used in a real system.
!
! Part I: Rewrite rules
a     $U@a-daemon           (2)
b     $U@b-daemon
c     $U%c@b-daemon
d     $U%d@a-daemon    
      (3)
! Part II: Channel definitions
l      (4)
local-host

a_channel defragment charset7 usascii      (5)
a-daemon

b_channel noreverse notices 1 2 3
b-daemon

</opt/SUNWmsgsr/msg-tango/table/internet.rules    (6)

下表说明了先前配置文件中的关键项(标有黑体数字,括在括号中):

  1. 感叹号 (!) 用于包含注释行。感叹号必须显示在第一列。任何其他位置的感叹号均被解释为文字感叹号。

  2. 重写规则在配置文件的上半部分显示。重写规则的各行之间不能出现空行。允许出现具有注释的行(以第一列中的感叹号开始)。

  3. 文件中出现的第一个空行表示重写规则部分的结束和通道块的开始。这些定义统称为通道主机表,该表定义了 MTA 可以使用的通道以及与每个通道相关联的名称。

  4. 第一个显示的通道块通常是本地通道或 l 通道。然后空行将各个通道块彼此分隔开。(defaults 通道例外,它可以显示在 l 通道之前。)

  5. 典型的通道定义由通道名称 (a_channel)、定义通道配置的若干关键字 (defragment charset7 usascii) 以及也被称为通道标记的路由系统 (a-daemon) 组成。

  6. 配置文件中可以包含其他文件的内容。如果某一行中的第一列包含小于号 (<),则该行中的剩余内容将被视为文件名;文件名应始终使用完整的绝对文件路径。该文件将被打开,其内容将在该点并入配置文件。包含的文件最多可以嵌套三层。配置文件中包含的所有文件必须与配置文件一样,可由所有人读取。

表 10–1 显示了上述配置如何路由一些示例地址。

表 10–1 地址和关联的通道

地址 

排队到通道 

u@a

a_channel

u@b

b_channel

u@c

b_channel

u@d

a_channel

有关 MTA 配置文件的更多信息,请参见8.4 重写规则8.5.3 通道定义第 11 章,配置重写规则


注 –

只要更改了 imta.cnf 文件,就必须重新编译 MTA 配置。请参见10.1 编译 MTA 配置


10.3 映射文件

MTA 的许多组件都使用面向表查找的信息。此类表用于将输入字符串转换(即,映射)为输出字符串。此类表称为映射表,通常显示为两列。第一(左边的)列提供对其进行匹配的可能输入字符串(模式),第二(右边的)列给出了输入字符串映射到的结果输出字符串(模板)。有关 MTA 进程所使用的表以及何时使用的详细信息,请参见表 10–2

大多数 MTA 数据库(包含不同类型的 MTA 数据,不应与映射表混淆)—都是此类表的实例。但是,MTA 数据库文件不具备通配符查找功能,因为其具有内在局限性,必须要扫描整个数据库才能找到匹配的通配符。

MTA mappings 文件支持多个映射表。它具备通配符功能以及多步和迭代映射方法。此方法的计算量比使用数据库要大,特别是条目很多时。但是,其灵活性带来的好处是您不需要等效数据库中的大多数条目,从而可能使总体开销较低。

映射表保存在 MTA mappings 文件中。这是使用 MTA tailor 文件中的 IMTA_MAPPING_FILE 选项指定的文件;默认情况下,该文件为 msg-svr-base /config/mappingsmappings 文件的内容将作为可重新装入的部分并入经过编译的配置中(请参见10.1 编译 MTA 配置)。如果无法让所有人都能读取该文件,将导致错误行为。只要更改了 mappings 文件,就必须重新编译 MTA 配置。请参见10.1 编译 MTA 配置

表 10–2 列出了本指南中所介绍的映射表。

表 10–2 Messaging Server 映射表

映射表 

页 

说明 

AUTH_REWRITE

与 authrewrite 关键字配合使用,以使用从验证操作 (SASL) 中获得的寻址信息修改标题和信封地址。请参见12.4.3 TCP/IP 连接和 DNS 查找支持

CHARSET-CONVERSION

用于指定应该执行哪些类型的通道到通道字符集转换和邮件重新格式化。请参见13.6 字符集转换和邮件重新格式化

COMMENT_STRINGS

用于修改地址标题注释(括在括号中的字符串)。请参见12.6.13 处理地址标题行中的注释

CONVERSIONS

用于为转换通道选择邮件通信。请参见13.5.2 选择用于转换处理的通信

FORWARD

用于执行转发,与使用别名文件或别名数据库执行的转发类似。请参见10.9.3 正向查找表和 FORWARD 地址映射

FROM_ACCESS

用于基于信封源地址过滤邮件。To 地址为不相关的地址时使用该表。请参见18.2.1 访问控制映射表—操作

INTERNAL_IP

用于识别内部系统和子网。请参见18.6 添加 SMTP 中继

IP_ACCESS

用于根据源通道、远程服务器的 IP 地址和当前尝试的 IP 地址索引来阻止外来连接。请参见18.3.5 IP_ACCESS 映射表

MAIL_ACCESS

用于根据 SEND_ACCESSPORT_ACCESS 表中找到的组合信息阻止外来的连接。请参见18.2.1 访问控制映射表—操作

NOTIFICATION_LANGUAGE

用于自定义或本地化通知邮件。请参见10.10 控制传送状态通知邮件

ORIG_MAIL_ACCESS

用于根据 ORIG_SEND_ACCESSPORT_ACCESS 表中找到的组合信息阻止外来的连接。请参见18.2.1 访问控制映射表—操作

ORIG_SEND_ACCESS

用于根据信封源地址、信封目标地址、源通道和目标通道阻止外来的连接。请参见18.2.1 访问控制映射表—操作

PERSONAL_NAMES

用于修改个人名称(尖括号分隔的地址前的字符串)。请参见12.6.14 处理地址标题行中的个人名称

PORT_ACCESS

用于根据 IP 编号阻止外来的连接。请参见18.2.1 访问控制映射表—操作

REVERSE

用于将地址从内部格式转换为公用的公布格式。请参见10.9 将地址由内部格式转换为公用格式

SEND_ACCESS

用于根据信封源地址、信封目标地址、源通道和目标通道阻止外来的连接。请参见18.2.1 访问控制映射表—操作

SMS_Channel_TEXT

用于站点定义的文本转换。请参见C.2.5 站点定义的文本转换

X-ATT-NAMES

用于从映射表中检索参数值。请参见13.5.3.5 通过转换条目调用映射表

X-REWRITE-SMS-ADDRESS

用于本地 SMS 地址有效性检查。请参见C.2.4 站点定义的地址有效性检查和转换

10.3.1 映射文件中的文件格式

mappings 文件由一系列单独的表组成。每个表的开头都是表名称。名称在第一列中始终为字母字符。表名称后面必须有一个空行,然后是表中的条目。条目由零个或多个缩进行组成。每个条目行包含两列,由一个或多个空格或制表符分隔。条目中的所有空格都必须用 $ 字符括起。每个映射表之后以及各映射表之间必须有一个空行;单个表中的条目之间不允许出现空行。注释用第一列中的感叹号 (!) 表示。

结果格式与以下格式类似:


TABLE1_NAME

   pattern1-1    template1-1
   pattern1-2    template1-2
   pattern1-3    template1-3
      .              .
      .              .
      .              .
   pattern1-n    template1-n

TABLE2_NAME

   pattern2-1    template2-1
   pattern2-2    template2-2
   pattern2-3    template2-3
       .            .
       .            .
       .            .
   pattern2-n    template2-n
          .
          .
          .


TABLE3_NAME

           .
          .
          .

         

使用映射表 TABLE2_NAME 的应用程序会将字符串 pattern2-2 映射为 template2-2 指定的任何内容。每种模式最多可以包含 256 个字符,每种模板最多可以包含 1024 个字符。在映射文件中,每行最多有 4096 个字符。映射中可以显示的条目数量没有限制(尽管条目数量过多可能会消耗大量的 CPU 资源,并且会消耗过多的内存)。较长的行(超过 252 个字符)可以使用反斜杠 (\) 结束,以在下一行继续。两列之间及第一列之前的空格不可省略。

mappings 文件中不允许出现重复的映射表名称。

10.3.1.1 将其他文件包含到映射文件中

可以将其他文件包含到 mappings 文件中。这可以通过以下格式的行来实现:


<file-spec
            

它可以有效地将文件 file-spec 的内容替换到 mappings 文件中包含出现的位置。文件规范应指定一个完整文件路径(目录等)。以此方式包括的所有文件都必须可由所有用户读取。此类包含的 mappings 文件中还允许具有注释。包括最多可以嵌套三层。装入 mappings 文件的同时会装入包含的文件—不是需要时才将其装入,因此 使用包含的文件时不涉及性能或内存的节省。

10.3.2 映射操作

mappings 文件中的所有映射都以一致的方式应用。从一个映射到下一个映射的唯一变化就是输入字符串的源和映射输出的用途。

映射操作始终以输入字符串和映射表开始。按照条目在映射表中显示的顺序,从上到下每次扫描一个条目。每个条目的左侧都用作模式,并使用该模式以不区分大小写的方式比较输入字符串。有关 MTA 进程所使用的表以及何时使用的详细信息,请参见表 10–2。本节包含以下几个部分:

10.3.2.1 映射条目模式

模式可以包含通配符。特别地,允许使用以下常用通配符:星号 (*) 匹配零个或多个字符,每个百分比符号 (%) 匹配一个字符。可以在星号、百分比符号、空格和制表符前加一个美元符号 ($) 来引用它们。引用星号或百分比符号将使其不具有特殊意义。必须引用空格和制表符以防止它们过早地结束模式或模板。文字美元符号字符应该采用双写的形式 ($$),第一个美元符号引用第二个美元符号。

表 10–3 映射模式通配符

通配符

说明

只匹配一个字符。 

匹配零个或多个字符,最长或“最多”可匹配从左至右的全部字符。 

向后匹配

说明

$ n* 

匹配第 n 个通配符或全局通配符。 

修饰符

说明

$_ 

使用最少或“最短”的从左至右匹配。 

$@ 

关闭后续通配符或全局通配符的“保存”。 

$^ 

打开后续通配符或全局通配符的“保存”;这是默认设置。 

全局通配符

说明

$A% 

匹配一个字母字符(A-Z 或 a-z)。 

$A* 

匹配零或多个字母字符(A-Z 或 a-z)。 

$B% 

匹配一个二进制数字(0 或 1)。 

$B* 

匹配零个或多个二进制数字(0 或 1)。 

$D% 

匹配一个十进制数字 (0-9)。 

$D* 

匹配零个或多个十进制数字 (0-9)。 

$H% 

匹配一个十六进制数字(0-9 或 A-F)。 

$H* 

匹配零个或多个十六进制数字(0-9 或 A-F)。 

$O% 

匹配一个十进制数字 (0-9)。 

$O* 

匹配零个或多个八进制数字 (0-7)。 

$S% 

匹配一个符号集字符(例如,0-9、A-Z、a-z、_、$)。 

$S* 

匹配零个或多个符号集字符(即 0-9、A-Z、a-z、_、$)。 

$T% 

匹配一个制表符或垂直制表符,或空格字符。 

$T* 

匹配零个或多个制表符或垂直制表符,或空格字符。 

$X% 

$H% 的同义词。 

$X* 

$H* 的同义词。 

$[ c]% 

匹配字符 c。 

$[ c]* 

匹配任意出现的字符 c。 

$[ c1 c2 ... cn ]%

只匹配 c1、c2 或 cn 中出现的一个字符。

$[ c1 c2 ... cn ]*

匹配 c1、c2 或 cn 中出现的任意字符。

$[ c1 -cn ]%

匹配 c1 至 cn 范围中的任一字符。

$[ c1 -cn ]*

匹配 c1 至 cn 范围内出现的任意字符。

$< IPv4> 

匹配一个 IPv4 地址(忽略位)。 

$(IPv4) 

匹配一个 IPv4 地址(保留前缀位)。 

${IPv6} 

匹配一个 IPv6 地址。 

在全局结构内(即 $[...] 结构内)反斜杠字符 (\) 是引用字符。要表示文字连字符 - 或右方括号 ],则在全局结构内必须用反斜杠引用连字符或右方括号。

模式中的所有其他字符仅表示并匹配自身。特别地,在映射模式或模板中,单引号和双引号字符以及括号都没有特殊意义,它们只是一些普通的字符。这样一来,便很容易写入与非法地址或部分地址对应的条目。

要指定多个修饰符或指定修饰符和向后匹配,语法中只能使用一个美元字符。例如,要向后匹配初始通配符,而不保存向后匹配自身,则使用 $@0,而不是 $@$0。

请注意,imsimta test -match 实用程序可用于测试映射模式,特别是测试模式中的通配符行为。

星号通配符通过从左至右处理输入字符串,最大程度地匹配字符。例如,将输入字符串 a/b/c 与模式 */* 进行比较时,左边的星号将匹配 a/b,右边的星号匹配剩余部分 c

$_ 修饰符使通配符匹配最小化,将最小匹配视为匹配,从左至右处理模式。例如,将字符串 a/b/c 与模式 $_*/$_* 进行比较时,左边的 $_* 将匹配 a,右边的 $_* 则匹配 b/c

10.3.2.2 IP 匹配

使用 IPv4 前缀匹配时,要指定 IP 地址或子网,后跟斜杠和距离前缀的位数(可选),在比较匹配时,位数很重要。例如,以下示例匹配 123.45.67.0 子网中的所有地址:

$(123.45.67.0/24)

使用 IPv4 忽略位匹配,要指定 IP 地址或子网,后跟斜杠或检查匹配时忽略的位数(可选)。例如,以下示例匹配 123.45.67.0 子网中的所有地址:

$<123.45.67.0/8>

以下示例匹配 123.45.67.4123.45.67.7 范围中的所有地址:

$<123.45.67.4/2>

IPv6 匹配匹配一个 IPv6 地址或子网。

10.3.2.3 映射条目模板

如果给定条目中的模式比较失败,则不执行任何操作,继续扫描下一个条目。如果比较成功,条目的右侧将用作模板以生成输出字符串。该模板会将输入字符串有效地替换为根据模板给出的说明构造的输出字符串。

模板中几乎所有的字符都只是在输出中生成它们自身。只有美元符号 ($) 例外。

美元符号后跟美元符号、空格或制表符将在输出字符串中生成美元符号、空格或制表符。注意,必须引用所有这些字符串,才能将其插入输出字符串中。

美元符号后跟数字 n 代表替换;美元符号后跟字母字符称为“元字符”。元字符本身并不显示在由模板生成的输出字符串中,而是生成一些特殊的替换或处理。有关特殊替换和标准处理元字符的列表,请参见表 10–4。所有其他的元字符都保留用于特定于映射的应用程序。

请注意,元字符 $C$E$L$R 中的任何一个出现在匹配模式的模板中时,都会影响映射进程并控制进程是终止还是继续。即,可以设置迭代映射表条目,使一个条目的输出成为另一个条目的输入。如果匹配模式的模板不包含元字符 $C$E$L$R 中的任何一个,则假设为 $E(立即终止映射进程)。

为防止无限循环,将限制通过映射表的迭代数量。每次重新启动通过的字符串(长度等于或大于上一个通过的字符串)时,计数器的数量都会增加。如果该字符串的长度比上一个字符串短,则系统会将计数器重置为零。计数器超过 10 以后,将不接受重新迭代映射的请求。

表 10–4 映射模板替换和元字符

替换序列 

替换 

$n

从 0 开始从左至右计数的第 n 个通配符字段。

$#...#

序列号替换。 

$]...[ 

URL 查找;在结果中替换。 

$|...|

将指定的映射表应用于所提供的字符串。 

${...} 

常规的数据库替换。 

$}domain,attribute{

添加该功能以访问每个域的属性。domain 是当前域,attribute 是与该域相关联的属性。如果该域存在并具有属性,则它的初始值将被替换为映射结果;如果属性或域两者中有一个不存在,则映射条目将失败。

attributes 可以为域 LDAP 的属性或以下定义的特殊属性:

_base_dn_—域中用户条目的基 DN

_domain_dn_—域条目自身的 DN

_domain_name_—域名(与之相对的是别名)

_canonical_name_—与域相关联的规范名称

$[...]

调用由站点提供的例程;在结果中替换。 

元字符

说明

$C

将继续执行从下一个表格条目开始的映射进程,并将此条目的输出字符串用作映射进程的新输入字符串。 

$E

立即结束映射进程;将此条目的输出字符串用作映射进程的最终结果。$+1E 立即退出,不解释模板的其余部分。

$L

从下一个表条目开始继续执行映射进程;将此条目的输出字符串用作新的输入字符串;表中所有条目都耗尽之后,从第一个表条目开始再执行一次传递。后续匹配可以用 $C$E$R 元字符覆盖此条件。

$R

从映射表的第一个条目开始继续执行映射进程;将此条目的输出字符串用作映射进程的新的输入字符串。 

$nA 

插入从位置 0 开始的当前地址左侧第 n 个字符,如果省略 n,则将插入整个地址。 

$nX 

插入从 0 开始的邮件主机左侧第 n 个组件,如果省略 n,则将插入整个邮件主机。 

$?x?

映射条目百分之 x 的时间成功。 

$\

强制后续文本为小写。 

$^

强制后续文本为大写。 

$_

使后续文本保留其原有大小写形式。 

$=

强制后续替换字符经适当引用插入到 LDAP 搜索过滤器中。材料为大写。 

$:x

仅在设置了指定的标志后才匹配。 

$;x

仅在清除了指定的标志后才匹配。 

本节包含以下几个部分:

通配符字段替换 ($n)

后跟数字 n 的美元符号将被替换为与模式中第 n 个通配符相匹配的内容。通配符从 0 开始编号。例如,以下条目将匹配输入字符串 PSI%A::B 并生成结果输出字符串 b@a.psi.siroe.com


PSI$%*::*    $1@$0.psi.siroe.com

输入字符串 PSI%1234::USER 也将匹配,并生成 USER@1234.psi.siroe.com 作为输出字符串。输入字符串 PSIABC::DEF 不会匹配此条目中的模式,也不执行任何操作;即,不会从此条目生成输出字符串。

控制文本的大小写 ($\, $^, $_)

元字符 $\ 强制后续文本为小写,$^ 强制后续文本为大写,$_ 使后续文本保留其原有的大小写。例如,使用映射对区分大小写的地址进行转换时,这些元字符可能会十分有用。

进程控制 ($C, $L, $R, $E)

$C$L$R$E 元字符可以影响映射进程,控制是否终止以及何时终止映射进程。元字符:

映射表模板是从左到右进行扫描的。要为可能“成功”或“失败”的条目(例如,常规数据库替换或随机值控制的条目)设置 $C$L$R 标志,请将 $C$L$R 元字符置于可能成功或失败的条目部分的左侧;否则,如果该条目的剩余部分失败,则不显示标志。

检查特殊标志

某些映射探测设置了特殊标志。这些标志是可设置的,设置后可使用 $:, $; 测试的通用映射表功能测试其是否存在。$:x 使条目仅在设置了标志 x 的情况下匹配。$;x 使条目仅在清除标志 x 的情况下匹配。有关可以应用于该表的任何特殊标志,请参见特定映射表说明。(请参见表 18–2 中的 $A、$T、$S、$F 和 $D。)

如果希望在标志检查成功时条目应成功并终止,而在标志检查失败时映射进程应继续,则条目应在标志检查的左侧使用 $C 元字符,在标志检查的右侧使用 $E 标志。

条目随机成功或失败 ($?x?)

映射表条目中的元字符 $?x? 使该条目的“成功”时间达到 x%;在剩余时间内,该条目“失败”,并且将映射条目的输入按原样输出。(注意,取决于映射,条目失败的效果不一定与首先不匹配的条目相同。)x 应是一个指定成功百分比的实际数字。

例如,假设 IP 地址为 123.45.6.78 的系统向您的站点发送了过多的 SMTP 电子邮件,您想要使其速度减慢;可以按以下方式使用 PORT_ACCESS 映射表。假设您只允许 25% 的连接尝试,拒绝剩余 75% 的连接尝试。以下 PORT_ACCESS 映射表使用 $?25? 使具有 $Y(接受连接)的条目仅在 25% 的时间内成功;在剩余 75% 的时间内,当此条目失败时,该条目上的初始 $C 将使 MTA 从下一个条目继续执行映射,导致连接尝试被拒绝,同时显示 SMTP 错误和消息:请稍后重试


PORT_ACCESS

   TCP|*|25|123.45.6.78|*         $C$?25?$Y
   TCP|*|25|123.45.6.78|*         $N45s$ 4.40$ Try$ again$ later

序列号替换 ($#...#)

$#...# 替换会增加 MTA 序列文件中存储的值,并将该值替换至模板。当映射表输出中需要有唯一的限定符时,则可以使用此模板生成唯一的递增字符串,例如,使用映射表生成文件名时。

允许使用以下语法形式中的任何一种:


$#seq-file-spec|radix|width|m#

$#seq-file-spec|radix|width#

$#seq-file-spec|radix#

$#seq-file-spec#

必需的 seq-file-spec 参数是已有的 MTA 序列文件的完整文件规范。可选的 radixwidth 参数分别指定用于输出序列值的基数(基)和输出的位数。默认基数为 10。从 -36 至 36 范围内的值均可作为基数;例如,基数 36 给出以数字 0 至 9、字母 A 至 Z 表示的值。默认情况下,序列值按其原有宽度打印,但是如果指定的宽度需要更多的位数,则输出结果的左侧将用 0 补齐,从而获得正确的位数。注意,如果明确指定了宽度,则必须同时明确指定基数。

可选的 m 参数是模量。如果指定了第四个参数,则插入的值是从文件模量 m 中检索到的序列号。默认情况下,不执行任何模量操作。

如上所述,映射中所引用的 MTA 序列文件必须已存在。要创建 MTA 序列文件,请使用以下 UNIX 命令:


touch seq-file-spec


cat >seq-file-spec

               

使用映射表访问的序列号文件必须可由所有人读取,才能保证正确操作。要使用此类序列号文件,还必须具有 MTA 用户帐户(在 imta_tailor 文件中配置为 nobody)。

URL 替换,$]...[

$]url [ 格式的替换是特殊处理的。url 可以是任何支持的 URL 类型,其中包括 file:data:。也可以使用标准的 LDAP URL 并省略主机和端口;主机和端口改为由 LDAP_HOSTLDAP_PORT 选项指定。即,应将 LDAP URL 指定为:

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

其中,显示的方括号字符 [] 表示 URL 的可选部分。dn 是必需的标识名,用于指定搜索基准。URL 可选的 attributesscopefilter 部分进一步完善了要返回的信息。即,attributes 指定要从匹配此 LDAP 查询的 LDAP 目录条目中返回的属性。scope 可以是 base(默认值)、onesub 中的任何一个。filter 描述匹配条目的特性。

某些 LDAP URL 替换序列可以在 LDAP 查询 URL 中使用。URL 长度可以为 1024 个字符。这还适用于通过映射以及对其他映射的映射调用所创建的表达式。

映射表替换 ($|...|)

$|mapping;argument| 格式的替换是特殊处理的。MTA 在 MTA mappings 文件中查找名为 mapping 的辅助映射表,并使用 argument 作为具有此名称的辅助映射表的输入。具有此名称的辅助映射表必须存在,并且必须在其输出中设置了 $Y 标志(如果成功);如果具有此名称的辅助映射表不存在,或没有设置 $Y 标志,则该辅助映射表替换将失败,原始的映射条目也将被视为失败:原始的输入字符串将被用作输出字符串。

请注意,如果您要在执行映射表替换的映射表条目中使用进程控制元字符(例如 $C$R$L),应将进程控制元字符置于映射表模板中的映射表替换的左侧;否则,映射表替换“失败”将导致不能显示进程控制元字符。

常规查找表或数据库替换 (${...})

${text} 格式的替换要特殊处理。text 部分用作访问通用查找表或 数据库的密钥(有关更多信息,请参见10.9.1 MTA 文本数据库)。如果在表中找到了 text,则将替换表中对应的模板。如果 text 与表中的条目都不匹配,则输入字符串将按原样用作输出字符串。

如果您使用的是通用查找表,则需要设置 MTA 选项 use_text_databases 的低顺序位。即,将其设置为奇数。需要将对 general.txt 的更改编译到 MTA 配置中(使用 imsimta cnbuild 进行编译并使用 imsimta reload 重新装入可重新装入的数据)。

如果正在使用常规数据库,则该数据库应该可由所有人读取才能保证它正确操作。

如果要在执行通用表替换的映射表条目中使用进程控制元字符(例如 $C、$R 或 $L),则应将进程控制元字符置于映射表模板中通用表替换的左侧;否则通用表替换“失败”将导致不显示进程控制元字符。

由站点提供的例程替换 ($[...])

$[image,routine,argument] 格式的替换是特殊处理的。image、routine、argument 部分用于查找和调用由用户提供的例程。在 UNIX 上运行时,MTA 使用 dlopendlsym 从共享库 image 中动态装入和调用 routine 例程。然后使用以下参数列表将 routine 例程作为函数调用:


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

argumentresult 是长度为 252 字节的字符串缓冲区。argumentresult 将作为指针传递至字符串(例如,在 C 中,作为 char*)。arglengthreslength 是由引用传递的带有符号的长整数。输入时,argument 包含来自映射表模板的 argument 字符串,arglength 包含该字符串的长度。返回时,结果字符串应放在 result 中,其长度应放在 reslength 中。然后,此结果字符串将替换映射表模板中的 $[image,routine,argument]。如果映射表替换失败,则 routine 例程应返回 0;如果映射表替换成功,则该例程应返回 -1。如果替换失败,则正常情况下,原始输入字符串将原样用作输出字符串。

如果要在执行由站点提供的例程替换的映射表条目中使用进程控制元字符(例如,$C$R$L),应该将进程控制元字符置于映射表模板中由站点提供的例程替换的左侧;否则,映射表替换的“失败”将导致不显示进程控制元字符。

由站点提供的例程调用机制可以使用各种复杂的方式来扩展 MTA 的映射进程。例如,在 PORT_ACCESSORIG_SEND_ACCESS 映射表中,可以调用某些类型的装入监视服务,其结果可用于确定是否接受连接或邮件。

由站点提供的共享库映像 image 应可由所有用户读取。

生成 UTF-8 字符串

您可以从常规映射表功能中的 Unicode 字符值生成 UTF-8 字符串。以下格式的 Unicode 元字符序列:

$&A0A0,20,A1A1&

将生成一个 UTF-8 字符串,其中包含位于 A0A020A1A1 位置的字符。

10.4 其他 MTA 配置文件

除了 imta.cnf 文件,Messaging Server 还提供了其他几个配置文件,以帮助您配置 MTA 服务。表 10–5 中汇总了这些文件。本节包含以下几个部分:

如果对 reverseforward 或常规数据库进行了更改,可执行命令 imsimta reload 使更改生效(请参见10.9.1 MTA 文本数据库)。如果对 imta.cnfmappings 文件、aliasesconversionsoption.dat 文件进行了更改,而这些更改不会影响 job_controller,则应先执行 imsimta cnbuild,再执行 imsimta restart smtp。如果对 dispatcher.cnf 进行了更改,则需要执行 imsimta restart dispatcher。如果对编译后的配置中的配置文件进行了更改,并且这些更改会影响作业控制器但不会影响 SMTP 服务器,则通常应执行以下命令:imsimta cnbuildimsimta restart job_controller

有关这些命令的详细信息,请参见《Sun Java System Messaging Server 6.3 Administration Reference》中的“MTA Commands”

表 10–5 MTA 配置文件

文件 

说明 

10.4.1 别名文件(强制)

实现目录中不存在的别名。msg-svr-base /config/aliases

10.4.2 TCP/IP (SMTP) 通道选项文件(也称为 SMTP 选项文件)

设置特定于通道的选项。msg-svr-base /config/channel_option

10.4.3 转换文件

由转换通道使用,用于控制邮件正文部分的转换。 msg-svr-base/config/conversions

10.4.4 分发程序配置文件(强制)

分发程序的配置文件。msg-svr-base /config/dispatcher.cnf

10.4.8 作业控制器文件(强制)

作业控制器所使用的配置文件。 /msg-svr-base/config/job_controller.cnf

MTA 配置文件(强制) 

用于地址重写、路由以及通道定义。 /msg-svr-base/config/imta.cnf

10.3 映射文件(强制)

映射表的系统信息库。/msg-svr-base/ config/mappings

10.4.6 选项文件

全局 MTA 选项文件。/msg-svr-base/ config/option.dat

10.4.7 调整文件(强制)

用于指定位置和某些优化参数的文件。/ msg-svr-base/config/imta_tailor

常规查找表(可选) 

常规查找工具与常规数据库等效。可重新装入的经过编译的配置的一部分。 

用于指定位置和某些优化参数的文件。/ msg-svr-base/config/general.txt

正向查找表(可选) 

To: 地址的查找。与正向数据库等效。可重新装入的经过编译的配置的一部分。 

/msg-svr-base/config/forward.txt

反向查找表(可选) 

From: 地址的反向查找。与反向数据库等效。可重新装入的经过编译的配置的一部分。/msg-svr-base /config/reverse.txt

10.4.1 别名文件

别名文件 aliases 可用来设置目录中未设置的别名。特别地,根的地址是一个很好的示例。如果目录中存在同一别名,则将忽略在此文件中设置的别名。有关别名和 aliases 文件的更多信息,请参见10.5 别名

aliases 文件进行更改后,必须重新启动 MTA 以使更改生效。

10.4.2 TCP/IP (SMTP) 通道选项文件

TCP/IP 通道选项文件可以控制 TCP/IP 通道的各种特性。通道选项文件必须存储在 MTA 配置目录中,并命名为 x_option,其中 x 是通道的名称。例如,msg-svr-base /config/tcp_local_option。有关更多信息,请参阅12.4.1 配置 SMTP 通道选项。有关所有通道选项关键字和语法的完整信息,请参见《Sun Java System Messaging Server 6.3 Administration Reference》

10.4.3 转换文件

转换文件 conversions 指定转换通道如何对通过 MTA 的邮件执行转换。可以选择转换任何 MTA 通信子集,并可以使用任何一组程序或命令过程来执行转换处理。MTA 将查看转换文件,以便为每个正文部分选择适当的转换。

有关此文件的语法的更多信息,请参见13.5 转换通道

10.4.4 分发程序配置文件

分发程序配置文件 dispatcher.cnf 用于指定分发程序配置信息。安装时将创建一个默认的配置文件,可不必对其进行更改而直接使用。但是,如果出于安全性或性能原因需要修改默认配置文件,则可以通过编辑 dispatcher.cnf 文件来实现此操作。(有关概念性信息,请参见8.3 分发程序

分发程序配置文件的格式与其他 MTA 配置文件的格式类似。指定选项的行具有以下格式:

option=value

option 是选项的名称,value 是选项被设置成的字符串或整数。如果 option 可以接受整数值,则可以使用 b%v 格式的记数法指定基数,其中 b 是以 10 为基数表示的基数,v 是以 b 为基数表示的实际值。此类选项规范根据应用以下选项设置的服务,使用以下格式的行分组成几个部分:

[SERVICE=service-name]

service-name 是服务的名称。显示在任何此类部分标记之前的初始选项规范将全局地应用于所有部分。

以下是一个样例分发程序配置文件 (dispatcher.cnf)。


! The first set of options, listed without a [SERVICE=xxx]
! header, are the default options that will be applied to all
! services.
!
MIN_PROCS=0
MAX_PROCS=5
MIN_CONNS=5
MAX_CONNS=20
MAX_LIFE_TIME=86400
MAX_LIFE_CONNS=100
MAX_SHUTDOWN=2
!
! Define the services available to Dispatcher
!
[SERVICE=SMTP]
PORT=25
IMAGE=msg-svr-base/lib/tcp_smtp_server
LOGFILE=msg-svr-base/log/tcp_smtp_server.log

有关此文件的参数的更多信息,请参见《Sun Java System Messaging Server 6.3 Administration Reference》

10.4.5 映射文件

mappings 文件定义 MTA 如何将输入字符串映射为输出字符串。

MTA 的许多组件都使用面向表查找的信息。一般说来,此类表格可用于将输入字符串转换(即映射)为输出字符串。此类表(称为映射表),通常显示为两列,第一(或左边的)列给出了可能的输入字符串,第二(或右边的)列给出了与输入关联的结果输出字符串。大多数 MTA 数据库都是此类映射表的实例。但是,MTA 数据库文件不具备通配符查找功能,因为其具有内在局限性,必须要扫描整个数据库才能找到匹配的通配符。

mappings 文件为 MTA 提供了支持多个映射表的工具。它提供了完整的通配符工具,并同时提供了多步和迭代映射方法。此方法的计算量比使用数据库要大,特别是条目很多时。但是,其灵活性带来的好处是实际上您不需要等效数据库中的大多数条目,从而可能使实际总体开销较低。

可以使用 imsimta test -mapping 命令来测试映射表。有关 mappings 文件和 test -mapping 命令的语法的更多信息,请参见10.3 映射文件《Sun Java System Messaging Server 6.3 Administration Reference》

mappings 文件进行更改后,必须重新启动 MTA 或执行命令 imsimta reload

10.4.6 选项文件

选项文件 option.dat 指定与特定于通道的选项相反的全局 MTA 选项。

您可以使用选项文件覆盖作为整体应用于 MTA 的各种参数的默认值。特别地,选项文件可用于建立读入配置和别名文件的各种表的大小。您还可以使用选项文件限制 MTA 接收的邮件的大小、指定 MTA 配置中允许的通道数量、设置允许的重写规则的数量,等等。

option.dat 中,以 #!; 开头的行被视为注释行,即使前一行带有表示待续的后缀 \ 也不例外。这就说明必须留意包含这些字符的长选项(特别是传送选项)。

对于因自然布局而具有以 # 或 ! 开头的连续行的传送选项,有一种安全而巧妙的解决方法。

有关选项文件语法的更多信息,请参见《Sun Java System Messaging Server 6.3 Administration Reference》

10.4.7 调整文件

调整文件 imta_tailor 用于设置各种 MTA 组件的位置。为使 MTA 正常工作,imta_tailor 文件必须始终位于 msg-svr-base/config 目录中。

尽管您可以编辑此文件以反映在特定安装中的更改,但是您必须谨慎地执行此操作。对此文件进行更改后,必须重新启动 MTA。最好是在 MTA 停止时进行更改。


注 –

除非绝对必要,否则请勿编辑此文件。


有关此文件的完整信息,请参见《Sun Java System Messaging Server 6.3 Administration Reference》

10.4.8 作业控制器文件

作业控制器可以创建并管理传送邮件的通道作业。这些通道作业在作业控制器内的进程池中运行。可以将池看作是一个运行通道作业的“地方”。池提供了一个计算区域,一组作业可以在其中运行而不与池外的作业竞争资源。(有关作业控制器概念和通道关键字配置的信息,请参阅8.7 作业控制器12.5.4 用于通道执行作业的处理池12.5.5 服务作业限制。)

作业控制器文件 job_controller.cnf 用于指定以下通道处理信息:

imta.cnf 文件中,可以使用 pool 关键字指定进程池(已在 job_controller.cnf 中定义)的名称。例如,以下 job_controller.cnf 样例文件的片段定义池 MY_POOL

[POOL=MY_POOL]
job_limit = 12

以下 imta.cnf 样例文件的片断指定通道块中的池 MY_POOL

channel_x pool MY_POOL
channel_x-daemon

如果要修改与默认池配置关联的参数或添加其他池,则可以通过编辑 job_controller.cnf 文件,然后停止并重新启动作业控制器来实现。

作业控制器配置文件中的第一个池用于不指定池名称的所有请求。在 MTA 配置文件 (imta.cnf) 中定义的 MTA 通道可以通过使用后跟池名称的 pool 通道关键字将它们的处理请求定向到特定的池。池名称必须与作业控制器配置中的池名称匹配。如果作业控制器不能识别请求的池名称,则将忽略请求。

在初始配置中,定义了以下池:DEFAULTLOCAL_POOLIMS_POOLSMTP_POOL

10.4.8.1 使用示例

通常情况下,如果您需要将某些通道的处理与其他通道的处理区分开,则可以在作业控制器配置中添加附加的池定义。您也可以选择使用具有不同特征的池。例如,您可能需要控制某些通道可以处理的同时进行的请求的数量。您可以通过创建具有作业限制的新池来完成此操作,然后使用 pool 通道关键字将这些通道定向到更适合的新池。

除了池定义以外,作业控制器配置文件还包含 MTA 通道表以及作业控制器处理每个通道的请求所必须使用的命令。两类请求分别称为“主”类型和“从”类型。通常情况下,通道的 MTA 邮件队列中存储了邮件时,便会调用通道主程序。主程序会使邮件退出队列。

调用从程序的目的是轮询某通道并选取进入该通道的所有邮件。尽管几乎所有的 MTA 通道都有主程序,但是很多通道却没有或不需要从程序。例如,经过 TCP/IP 处理 SMTP 的通道就不使用从程序,因为网络服务和 SMTP 服务器将根据 SMTP 服务器发出的请求接收外来 SMTP 邮件。SMTP 通道的主程序是 MTA 的 SMTP 客户端。

如果与通道关联的目标系统无法一次处理多个邮件,则需要创建一种新类型的池,其作业限制为一个池:

[POOL=single_job]
job_limit=1

反之,如果目标系统具有足够的并行处理能力,则可以将作业限制设置为较高的值。

示例 10–1 显示了样例作业控制器配置文件。表 10–6 显示了可用的选项。


示例 10–1 UNIX 中的样例作业控制器配置文件


!MTA Job Controller configuration file
!
!Global defaults
tcp_port=27442         (1)
secret=never mind
slave_command=NULL     (2)
max_life_age=3600      (3)
!
!
!Pool definitions
!
[POOL=DEFAULT]         (4)
job_limit=10           (5)
!
[POOL=LOCAL_POOL]
job_limit=10
!
[POOL=IMS_POOL]
job_limit=1
!
[POOL=SMTP_POOL]
job_limit=1
!
!Channel definitions
!
!
[CHANNEL=l]             (6)
master_command=msg-svr-base/lib/l_master
!
[CHANNEL=ims-ms]
master_command=msg-svr-base/lib/ims_master
!
[CHANNEL=tcp_*]         (7)
master_command=msg-svr-base/lib/tcp_smtp_client

前述示例中的关键项(带有编号、括在括号中,且为粗体)为:

  1. 此全局选项定义了作业控制器在其上侦听请求的 TCP 端口号。

  2. 为后续的 [CHANNEL] 部分设置默认 SLAVE_COMMAND

  3. 为后续的 [CHANNEL] 部分设置默认 MAX_LIFE_AGE

  4. 该 [POOL] 部分定义了名为 DEFAULT 的池。

  5. 将此池的 JOB_LIMIT 设置为 10

  6. 该 [CHANNEL] 部分应用于名为 l 的通道,即 UNIX 本地通道。该部分中所需的唯一定义是 master_command,作业控制器执行该命令来运行此通道。由于通道名称中没有显示通配符,所以通道必须完全匹配。

  7. 该 [CHANNEL] 部分应用于名称以 tcp_* 开头的所有通道。由于此通道名称中包含通配符,所以它将与名称以 tcp_ 开头的任何通道相匹配。

添加附加池的示例

作业控制器可以创建并管理传送邮件的通道作业。这些通道作业在作业控制器内的进程池中运行。可以将池看作是一个运行通道作业的“地方”。池提供了一个计算区域,一组作业可以在其中运行而不与池外的作业竞争资源。请注意,在 job_controller 中设置的作业限制是针对每个池的。例如,如果将 SMTP_POOLjob_limit 定义为 10,则在任一给定时刻,只能有 10 个 tcp_smtp 客户端进程可以在该池中运行。

某些情况下,可能需要创建附加的 tcp_* 通道(例如,用于特别缓慢的邮件站点的 tcp 通道)。最好是使这些通道在不同的池中运行。这样做的原因在于,如果我们创建了十个不同的 tcp_* 通道,并且它们全在 SMTP_POOL 中运行,则在任一给定时刻,每个 tcp_* 通道上可能只有一个 tcp_smtp 客户端在运行(具体情况取决于是否有目标为所有 tcp_* 通道的邮件,以及是否将 SMTP_POOLjob_limit 定义为 10)。假设系统负载很重,并且所有队列中都有邮件等待通过各个 tcp_* 通道发送出去,这样效率就会很低。用户很可能会为附加的 tcp_* 通道定义附加的池,以防止出现争用槽的情况。

例如,假设我们设置了以下 tcp_* 通道:


tcp_yahoo smtp mx pool yahoo_pool keyword keyword keyword
tcp-yahoo-daemon

tcp_aol smtp mx keyword keyword keyword pool aol_pool
tcp-aol-daemon

tcp_hotmail smtp mx pool hotmail_pool keyword keyword keyword 
tcp-hotmail-daemon
...
tcp_sun smtp mx pool sun_pool keyword keyword keyword
tcp-sun-daemon

为了使每个新通道有十个 tcp_smtp_client 进程,我们要在 job_controller.cnf 文件中添加以下行:


[POOL=yahoo_pool]
job_limit=10

[POOL=aol_pool]
job_limit=10

[POOL=hotmail_pool]
job_limit=10

 ...

[POOL=sun_pool]
job_limit=10

有关池的更多信息,请参见12.5.4 用于通道执行作业的处理池

表 10–6 作业控制器配置文件选项

选项 

说明 

常规选项

说明

INTERFACE_ADDRESS=adapter

指定应绑定作业控制器的 IP 地址接口。指定的值(适配器)可以是 ANYALLLOCALHOST 之一,也可以是一个 IP 地址。默认情况下,作业控制器绑定到所有地址(相当于指定 ALLANY)。指定 INTERFACE_ADDRESS=LOCALHOST 表示作业控制器仅接受来自本地计算机内的连接。这不会影响正常操作,因为作业控制器不支持任何计算机之间的操作。但是,这对于 HA 代理可能正在检查作业控制器是否响应的 HA 环境可能并不适合。如果运行 Messaging Server 的计算机处于 HA 环境中,且具有一个“内部网络”适配器和一个“外部网络”适配器,而您不能确信防火墙可以阻止到高端口号的连接,则应考虑指定“内部网络”适配器的 IP 地址。

MAX_MESSAGES=integer

作业控制器以内存内结构保留有关邮件的信息。在较大的待办事项构建的事件中,可能需要限制此结构的大小。如果待办事项中的邮件数量超过了此处指定的参数,则有关后续邮件的信息将不会保留在内存中。因为邮件消息始终会被写入磁盘,所以邮件不会丢失,但是在作业控制器所知道的邮件数量降至此数量的一半之前,不会发送邮件。此时,作业控制器将模拟 imsimta cache -sync 命令扫描队列目录。最小值为 10。

默认值为 100000。 

SECRET=file_spec

用于保护已发送至作业控制器的请求的共享机密。 

SYNCH_TIME=time_spec

作业控制器会偶尔扫描磁盘上的队列文件,以检查是否有丢失的文件。默认情况下,此操作在作业控制器启动四小时后开始,每四小时进行一次。time_spec 的格式为 HH:MM/hh:mm/hh:mm。变量 hh.mm 是事件之间的时间间隔(以小时 [h] 和分钟 [m] 表示)。变量 HH:MM 是事件在一天中第一次发生的时间。例如,指定 15:45/7:15 则表示事件在 15:45 开始,并从此刻起每隔 7 小时 15 分钟就会再次发生。

TCP_PORT=integer

指定作业控制器应在其上侦听请求软件包的 TCP 端口。除非默认设置与系统上的其他 TCP 应用程序冲突,否则不要更改此选项。如果确实要更改此选项,请更改 MTA 调整文件 msg-svr-base /config/imta_tailor 中相应的 IMTA_JBC_SERVICE 选项,以使其匹配。TCP_PORT 选项应用于全局,如果显示在 [CHANNEL] 或 [POOL] 部分中,将被忽略。

池选项

说明

JOB_LIMIT=integer

指定池可同时(并行)使用的最大进程数。JOB_LIMIT 单独应用于每个池;作业的最大总数为所有池的 JOB_LIMIT 参数之和。如果在某部分之外设置此选项,则所有未指定 JOB_LIMIT 的 [POOL] 部分都会将其用作默认选项。在 [CHANNEL] 部分中,该选项将被忽略。

通道选项

说明

MASTER_COMMAND=file_spec

指定指向作业控制器创建的 UNIX 系统进程要执行的命令的完整路径,该命令用于运行通道并将通过该通道外发的邮件退出队列。如果在某部分之外设置此选项,则所有未指定 MASTER_COMMAND 的 [CHANNEL] 部分都会将其用作默认选项。在 [POOL] 部分中,该选项将被忽略。

MAX_LIFE_AGE=integer

指定通道主作业的最大生命周期(以秒为单位)。如果没有为通道指定此参数,则使用全局默认值。如果没有指定默认值,则使用 14400(240 分钟)。 

MAX_LIFE_CONNS=integer

除了最大生命周期参数以外,通道主作业的生命期限还受其可以询问作业控制器是否有任何邮件的次数的限制。如果没有为通道指定此参数,则使用全局默认值。如果没有指定默认值,则使用 300。 

SLAVE_COMMAND=file_spec

指定指向作业控制器创建的 UNIX 系统进程要执行的命令的完整路径,以便运行通道并轮询通过该通道的外来邮件。大多数 MTA 通道没有 SLAVE_COMMAND。如果是这种情况,则应指定保留值 NULL。如果在某部分之外设置此选项,则所有未指定 SLAVE_COMMAND 的 [CHANNEL] 部分都会将其用作默认选项。在 [POOL] 部分中,该选项将被忽略。

10.5 别名

MTA 提供了一个工具,用以支持与本地系统(不一定对应于实际用户)关联的邮箱名称:别名别名对于构建邮件列表、转发邮件以及提供用户名的同义词十分有用。有关如何处理别名解析的说明,请参见9.1.2.2 $V 元字符

aliases 文件或别名数据库中定义的旧样式邮件列表现在接受非位置 [capture] 参数。如果使用,[capture] 参数将指定一个捕获地址,指定时使用的语义与由 LDAP 中的用户或组的 LDAP_CAPTURE 属性指定的捕获地址相同。

作为 [envelope_from] 非位置别名参数、位置别名参数错误或 LDAP 属性 mgrpErrorsTo 值指定的值 "/" 现在被解释为请求恢复使用外来邮件的原始信封 From: 地址,同时保留邮件列表语义。这对于设置邮件列表以向原始发件人报告所有形式的列表错误可能非常有用。

10.5.1 别名数据库

建议不要使用别名数据库。请改用 aliases 文件,因为可以使用 imsimta reload 命令动态地重新装入别名文件。

MTA 将使用目录中的信息并创建别名数据库。每次参考常规别名文件时都会参考一次别名数据库。但是,使用常规别名文件之前,将先检查别名数据库。实际上,数据库充当一种在使用别名文件之前调用的地址重写程序。


注 –

数据库本身的格式是专用的。请勿尝试直接编辑数据库。请在目录中进行全部必需更改。


10.5.2 别名文件

aliases 文件用于设置未在目录中设置的别名。特别地,邮寄主管别名是一个很好的示例。如果目录中存在同一别名,则将忽略在此文件中设置的别名。可以通过执行 imsimta reload 命令(或重新启动 MTA)来激活更改。以感叹号开始的任何行都被看作注释,并将被忽略。空行也将被忽略。


注 –

Messaging Server 提供了用于地址处理的其他工具,例如地址反向数据库和专用映射表。但为了获得最佳性能,在可以执行地址操作时应使用重写规则。请参见第 11 章,配置重写规则


此文件中的一个物理行最多可包含 1024 个字符。可以使用反斜杠 (\) 继续符将一个逻辑行分隔成多个物理行。

文件的格式如下:

user@domain: address (用于托管域中的用户)

user@domain: address (用于非托管域中的用户。例如:default-domain)

例如:


! A /var/mail/ user
inetmail@siroe.com: inetmail@native-daemon

! A message store user
ms_testuser@siroe.com: mstestuser@ims-ms-daemon
         

10.5.3 在别名文件中包含其他文件

可以在主 aliases 文件中包含其他文件。以下格式的行对 MTA 进行定向,以读取 file-spec 文件:

<file-spec

文件规范必须是完整的文件路径规范,且文件的保护级别与主 aliases 文件的保护级别必须相同,例如,必须可由所有用户读取。

被包含文件的内容将插入到其在 aliases 文件中的引用位置。将被包含文件的引用替换为文件的实际内容也可以达到相同的效果。被包含文件的格式与主 aliases 文件本身的格式相同。实际上,被包含文件本身也可以包含其他文件。被包含文件最多允许嵌套三层。

10.6 命令行实用程序

Messaging Server 提供了多个命令行实用程序,让您可以为 MTA 执行各种维护、测试和管理任务。例如,您可以使用 imsimta cnbuild 命令编译 MTA 配置、别名、映射、安全性、系统级过滤器及选项文件。有关 MTA 命令行实用程序的完整信息,请参见《Sun Java System Messaging Server 6.3 Administration Reference》

10.7 SMTP 安全性和访问控制

有关 SMTP 安全性和访问控制的信息,请参见第 18 章,邮件过滤和访问控制

10.8 日志文件

所有特定于 MTA 的日志文件都保存在日志目录 (msg-svr-base /log) 中。此目录中包含说明通过 MTA 的邮件通信的日志文件,以及说明有关特定主程序或从程序的信息的日志文件。

有关 MTA 日志文件的更多信息,请参见第 25 章,管理日志记录

10.9 将地址由内部格式转换为公用格式

使用地址反向文本数据库(又称为反向文本数据库)和 REVERSE 映射表,可以将地址由内部格式转换为公用的公布格式。例如,uid@mailhost.siroe.comsiroe.com 域中的有效地址,但它可能不适于向外公开。您可能更希望使用类似于 firstname.lastname@siroe.com 的公用地址。

Messaging Server 提供了其他地址处理工具,例如 aliases 文件和专门的映射表。但为了获得最佳性能,在可以执行地址操作时应使用重写规则。请参见第 11 章,配置重写规则

本节包含以下几个部分:

在反向文本数据库中,每个用户的公用地址都是由目录中用户条目的 mail 属性指定的。

反向文本数据库包含一个有效的地址与公用地址之间的映射。有关更多信息,请参见10.9.1 MTA 文本数据库

如果在数据库中找到了地址,则数据库右侧对应的内容将替换为该地址。如果未找到该地址,则会尝试在 mappings 文件中查找名为 REVERSE 的映射表。如果该表不存在或表中没有匹配的条目,则不进行替换且重写操作正常终止。

如果在 mappings 文件中找到了 REVERSE 映射表,并且地址与映射条目匹配,则则结果字符串将替换该地址(如果该条目指定了 $Y)。如果指定了 $N,将放弃映射结果。如果映射条目除指定了 $Y 以外,还指定了 $D,则结果字符串将在反向数据库中再运行一次;如果找到匹配内容,数据库中的模板将替换映射结果(从而替换地址)。通用 REVERSE 映射表条目(即,应用于所有通道的条目)的格式如下所示。注意,标志可以在新地址之前,也可以在新地址的结尾。


REVERSE

   OldAddress        $Y[Flags]NewAddress

      

特定于通道的条目(即,仅在邮件通过特定通道时才发生的映射)的格式如下所示。请注意,必须将 option.dat 中的 use_reverse_database 设置为 13,特定于通道的条目才能正常工作。


REVERSE

   source-channel|destination-channel|OldAddress  $Y[Flags]NewAddresS

      

表 10–7 中显示了 REVERSE 映射表标志。

表 10–7 REVERSE 映射表标志

标志 

说明 

$Y 

将输出作为新的地址。 

$N 

地址保留不变。 

$D 

在反向数据库中运行输出。 

$A 

将模式添加为反向数据库条目。 

$F 

将模式添加为正向数据库条目。 

标志比较

说明

$:B 

仅匹配标题(正文)地址。 

$:E 

仅匹配信封地址。 

$:F 

仅匹配指向前的地址。 

$:R 

仅匹配指向后的地址。 

$:I 

仅匹配邮件 ID。 

10.9.1 MTA 文本数据库

MTA 使用 sleepycat 数据库的做法已过时,因为它会在 Messaging Server 部署中产生不稳定性。(请注意,近期内不会删除 sleepycat。)因此,应改用 MTA 文本数据库作为反向、正向以及常规数据库。

设置文本数据库:

  1. 准备一个包含数据的文本文件。

    此文件的格式与 imsimta crdb 使用的格式相同:每行一个条目,其中包含两个以一个或多个空格分隔的字段。文件名称是由 imta_tailor 中的 IMTA_GENERAL_DATAIMTA_REVERSE_DATAIMTA_FORWARD_DATA 选项指定的,这些选项通常分别指向 msg-svr-base/config/ 中的 IMTA_TABLE:general.txtIMTA_TABLE:reverse.txtIMTA_TABLE:forward.txt

    general.txt - 常规数据库 reverse.txt - 反向数据库forward.txt - 正向数据库

  2. USE_TEXT_DATABASES 选项中设置相应的一个或多个位:

    位 0(值为 1)- 使用文本文件作为常规数据库;位 1(值为 2)- 使用文本文件作为反向数据库;位 2(值为 4)- 使用文本文件作为正向数据库

  3. 设置启用所需数据库时需要使用的任何附加选项。

    例如,USE_REVERSE_DATABASEUSE_FORWARD_DATABASE 或任何其他选项

  4. 运行 imsimta cnbuild

  5. 运行 imsimta reload

USE_TEXT_DATABASES 不适用的唯一情况是用于高动态数据。在这些情况下,编写您自己的 MTA 插件而不是依赖于内置数据库支持可以获得更好的效果。

如果文本数据库不适用,并且您希望使用 crdb (Sleepycat) 数据库支持,可通过构造数据库使用方式并相应地更新进程以使用 imsimta crdbimsimta db 更新数据库,而无需重新编辑、重新加载或重新启动。但要,这种方法仅在以下场合奏效:您只能添加或更新现有条目,在这种情况下,您可以使用 imsimta crdb。否则,您必须将数据构造为一系列添加/删除/更改操作。如果没有使用这种方法构造数据(通常不会这样构造数据),在更新时将恢复为替换整个数据库,而此时最好使用文本数据库。

10.9.2 设置地址反向控制

reversenoreverse 通道关键字以及 MTA 选项 USE_REVERSE_DATABASEREVERSE_ENVELOPE 都可以用来控制何时以及如何应用地址反向的具体设置。默认情况下,地址反向操作应用于所有地址,不仅仅是指向后的地址。

通过设置 REVERSE_ENVELOPE 系统选项的值(默认值:1—打开,0—关闭)可以启用或禁用地址反向。

目标通道上的 noreverse 指定不对邮件中的地址应用地址反向。而 reverse 指定应用地址反向。有关详细信息,请参见12.6.9 启用特定于通道的反向数据库使用

USE_REVERSE_DATABASE 控制 MTA 是否将地址反向文本数据库和 REVERSE 映射用作替换地址的源。0 表示不在任何通道中使用地址反向。值为 5(默认值)指定在 MTA 地址重写进程执行重写后,对所有地址都应用地址反向(而不仅是应用于反向指向地址)。值为 13 指定在 MTA 地址重写进程执行重写后,对包含 reverse 通道关键字的地址应用地址反向(而不仅是应用于反向指向地址)。通过设置 USE_REVERSE_DATABASE 选项的位值,可以进一步精确地指定地址反向操作。有关详细信息,请参见《Sun Java System Messaging Server 6.3 Administration Reference》中的“Option File Format and Available Options”

REVERSE_ENVELOPE 选项用来控制是否将地址反向应用于信封 From 地址以及邮件标题地址。

有这些选项和关键字的作用的其他信息,请参见 Sun Java System Messaging Server Administration Reference 中的详细说明。

10.9.2.1 常规反向映射示例

以下是通用 REVERSE 映射的示例:假设 siroe.com 中内部地址的格式为 user@mailhost.siroe.com。而且,用户名称空间规则为:user@host1.siroe.comuser@host2.siroe.comsiroe.com 中的所有主机指定同一个人。以下 REVERSE 映射可以与地址反向文本数据库一起使用:

REVERSE

   *@*.siroe.com        $0@siroe.com$Y$D
            

在此示例中,格式为 name@anyhost.siroe.com 的地址将被更改为 name@siroe.com.$D 元字符使地址反向数据库可以被查询。地址反向文本数据库应包含以下格式的条目:

user@mailhost.siroe.com     first.last@siroe.com

            

10.9.2.2 特定于通道的反向映射示例

默认情况下,如果将路由能力范围设置为邮件服务器域,则将使用地址反向文本数据库。特定于通道的 REVERSE 映射表条目的示例如下:

REVERSE

   tcp_*|tcp_local|binky@macho.siroe.com    $D$YRebecca.Woods@siroe.com
            

此条目通知 MTA,对于源通道为 tcp_*、外发目标通道为 tcp_local 的所有邮件,都会将地址格式从 binky@macho.siroe.com 更改为 Rebecca.Woods@siroe.com


注 –

要启用特定于通道的反向映射,必须将 option.dat 中的 USE_REVERSE_DATABASE 选项设置为 13(默认值为 5)


10.9.3 正向查找表和 FORWARD 地址映射

地址反向不会应用于信封的 To: 地址。省略此操作的原因相当明显—信封的 To: 地址随着邮件在邮件系统中的传送,不断地被重写和修改。路由的整体目标是将信封的 To: 地址转换为不断增加的系统和特定于邮箱的格式。地址反向的规范化功能完全不适合于信封的 To: 地址。

在任何情况下,均可以在 MTA 中使用大量的工具替换信封的 To: 地址。别名文件、别名数据库及常规查找表恰好具备此功能。

MTA 还提供正向查找表和 FORWARD 映射,可用于特殊种类的转发目的,例如,基于模式的转发、特定于源的转发或地址的自动注册。请注意,正向查找表和 FORWARD 映射主要用于一些特殊种类的地址转发,大多数种类的地址转发可以使用 MTA 的某一其他转发机制更好地执行。

信封的 To: 地址的各种替换机制与反向查找表的功能等效,但是上面讨论的机制中还没有哪一种与反向映射功能等效。而且确实会发生需要对信封的 To: 地址使用映射功能的情况。

10.9.3.1 FORWARD 映射表

FORWARD 映射表提供了基于模式的转发功能和特定于源的转发机制。如果映射文件中存在 FORWARD 映射表,它将应用于每一个信封的 To: 地址。如果该映射表不存在或没有映射匹配条目,则不会进行任何更改。

如果地址匹配某个映射条目,则将测试映射结果。如果该条目指定$Y,结果字符串将替换信封的 To: 地址;如果指定 $N,将放弃映射结果。有关其他标志的列表,请参见表 10–8

表 10–8 FORWARD 输出映射表标志说明

标志 

说明 

$D 

在重写进程中再次运行输出 

$G 

在正向查找表中运行输出(如果已启用正向查找表) 

$H 

禁用进一步的正向查找表或 FORWARD 映射查找 

$I 

将邮件保存为 .HELD 文件

$N 

地址保留不变 

$Y 

将输出用作新地址 

在执行任何正向查找表查找之前,都会查询 FORWARD 映射(如果存在)。如果已通过 USE_FORWARD_DATABASE 的相应设置启用了正向查找表,则当 FORWARD 映射匹配且具有标志 $G 时,会将 FORWARD 映射的结果与正向查找表进行核对。(请注意,如果已指定特定于通道的正向查找表,则在正向查找表中进行查找之前,会将源地址和源通道置于 FORWARD 映射的结果之前。)如果匹配的 FORWARD 映射条目指定了 $D,则 FORWARD 映射(和可选的转发表查找)的结果将在 MTA 地址重写进程中再次运行。如果匹配的 FORWARD 映射条目指定了 $H,则在后续地址重写(使用 $D 的结果)期间将不会执行进一步的 FORWARD 映射或数据库查找。

以下输入标志现在可用于 FORWARD 映射。过去只能在各种 *_ACCESS 映射中使用这些标志。

表 10–9 FORWARD 输入映射表标志说明

标志 

说明 

$A 

用来验证连接的 SASL 

$D 

对于此收件人,NOTIFY=DELAYS 为活动状态 

$E 

传入连接使用的 ESMTP/EHLO 

$F 

对于此收件人,NOTIFY=FAILURES 为活动状态 

$L 

传入连接使用的 LMTP/LHLO 

$S 

对于此收件人,NOTIFY=SUCCESSES 为活动状态。 

$T 

用于安全连接的 SSL/TLS 

以下示例说明了复杂的 REVERSEFORWARD 映射的使用。假设系统或与 mr_local 通道关联的名为 am.sigurd.innosoft.com 的伪域生成通用格式的 RFC 822 地址:

"lastname, firstname"@am.sigurd.example.com

"lastname,firstname"@am.sigurd.example.com

尽管这些地址完全合法,但它们经常会使不完全符合 RFC 822 语法规则的其他邮件程序(例如没有正确处理引用地址的邮件程序)产生混淆。因此,不要求引用的地址格式可用于更多的邮件程序。此类格式之一为

firstname.lastname@am.sigurd.example.com

复杂的 FORWARD 和 REVERSE 映射的示例:

REVERSE

 *|mr_local|"*,$ *"@am.sigurd.example.com $Y"$1,$ $2"@am.sigurd.example.com
 *|mr_local|"*,*"@am.sigurd.example.com   $Y"$1,$ $2"@am.sigurd.example.com
 *|*|"*,$ *"@am.sigurd.example.com        $Y$3.$2@am.sigurd.example.com
 *|*|"*,*"@am.sigurd.example.com          $Y$3.$2@am.sigurd.example.com
 *|mr_local|*.*@am.sigurd.example.com     $Y"$2,$ $1"@am.sigurd.example.com
 *|*|*.*@am.sigurd.example.com            $Y$2.$3@am.sigurd.example.com

FORWARD

 "*,$ *"@am.sigurd.example.com            $Y"$0,$ $1"@am.sigurd.example.com
 "*,*"@am.sigurd.example.com              $Y"$0,$ $1"@am.sigurd.example.com
 *.*@am.sigurd.example.com                $Y"$1,$ $0"@am.sigurd.example.com

因此,以上示例中的样例映射表的目的有三个方面。(1) 允许使用以上三种地址格式中的任何一种。(2) 仅对 mr_local 通道显示原始格式的地址,必要时进行格式转换。(3) 仅对所有其他通道显示最新未引用格式的地址,必要时进行格式转换。(以上 REVERSE 映射中,假设已设置了 MTA 选项 USE_REVERSE_DATABASE 中的第 3 位。)

10.9.3.2 正向查找表

当地址转发需要进行自动注册或特定于源时,可以使用正向查找表。请注意,通常不应使用正向查找表进行邮件的简单转发;执行此类转发时,使用 aliases 文件或别名查找表效率更高。默认情况下不会使用正向查找表,必须通过 USE_FORWARD_DATABASE 选项明确启用后才能使用该表。转发表查找是在执行了地址重写和别名扩展,且检查了所有 FORWARD 映射之后执行的。如果正向表查找成功,则结果替换地址将在整个 MTA 地址重写进程中再次运行。

有两种正向查找表机制,即内存内散列表或常规文本数据库。除非表的大小过分大,否则建议使用散列表。(1,000 不会受到限制,但是 100,000 就会受到限制)。通过设置 use_text_databases 选项中的第 2 位(值为 4)和 use_forward_database 启用散列表。散列表从 msg-svr-base/configure/forward.txt 中读取,它经过编译成为配置的可重新装入的部分,并可通过 imsimta reload 命令强制重新装入活动的 MTA 进程。

源文本文件的默认格式为:


user1@domain1 changedmailbox1@changeddomain1
user2@domain2 changedmailbox@changeddomain2

但是,如果已通过设置 USE_FORWARD_DATABASE 选项中的第 2 位启用特定于源的转发数据库,源文本文件的格式为:

source-channel|source-address|original-address changed-address

例如,以下条目


tcp_limited|bob@blue.com|helen@red.com  "helen of troy"@siroe.com

如果且仅在邮件来自于bob@blue.com 且排队通道为 tcp_limited 时,将 To: 地址 address helen@red.com 映射为 "helen of troy"@siroe.com。

有关正向文本数据库的更多信息,请参见10.9.1 MTA 文本数据库

10.10 控制传送状态通知邮件

传送状态通知或状态通知是由 MTA 发送给发件人和邮寄主管(可选)的电子邮件状态消息。Messaging Server 使您可以按照内容和语言自定义通知邮件。您还可以分别为每类传送状态(例如 FAILEDBOUNCEDTIMEDOUT 等)创建不同的邮件。另外,您还可以为源于特定通道的邮件创建通知邮件。

默认情况下,状态通知存储于 msg-svr-base /config/locale/C 目录中(由 msg-svr-base/config/imta_tailor 文件中的 IMTA_LANG 设置指定)。文件名如下所示:

return_bounced.txtreturn_delivered.txtreturn_header.optreturn_timedout.txtreturn_deferred.txtreturn_failed.txtreturn_prefix.txtreturn_delayed.txtreturn_forwarded.txtreturn_suffix.txt

*.txt 文件的邮件文本中,每行都不能超过 78 个字符。请注意,您不应直接更改这些文件,因为升级 Messaging Server 的当前版本时会覆盖这些文件。如果要修改这些文件,并将它们用作唯一一组通知邮件模板文件 (return_*.txt),请将这些文件复制到一个新目录中,并在其中对它们进行编辑。然后,将 imta_tailor 文件中的 IMTA_LANG 选项设置为指向包含这些模板的新目录。如果希望有多组通知文件(例如,每种语言一组),则需要设置 NOTIFICATION_LANGUAGE 映射表。

本节包含以下几个部分:

10.10.1 构造和修改状态通知

单个通知邮件由三个文件构建而成:return_prefix.txt + return_ActionStatus.txt + return_suffix.txt

要自定义或本地化通知,应为每种语言环境和/或自定义创建一组完整的 return_*.txt 文件并将其存储在单独的目录中。例如,您可以将法语通知文件存储在一个目录中,将西班牙语通知文件存储在另一个目录中,并将特殊的未经许可的批量电子邮件通道的通知存储在第三个目录中。


注 –

本发行版中包含法语、德语和西班牙语的样例文件。您可以修改这些文件,使它们适合于特定的需要。

对于双字节语言,例如日语,请确保使用日语构造文本,然后就像查看 ASCII 一样查看该文本,以检查 % 字符。如果有意外的 % 字符,则使用 %% 替换它们。


下面介绍了状态通知邮件集的格式和结构。

  1. return_prefix.txt 提供了适当的标题文本以及正文的介绍材料。以下是美国英语语言环境的默认设置:


    Content-type: text/plain; charset=us-asci
    Content-language: EN-US
    
    This report relates to a message you sent with the following
    header fields: %H

    非美国 ASCII 状态通知邮件应相应更改 charset 参数和 Content-Language 标题值(例如,对于法语的本地化文件,值为 ISO-8859-1fr)。%H 是表 10–10 中定义的标题替换序列。

  2. return_<ActionStatus>.txt 包含特定于状态的文本。ActionStatus 指邮件的 MTA 状态类型。例如,return_failed.txt 的默认文本如下:

    无法将您的邮件传递给下列收件人:%R

    return_bounced.txt 的默认文本为:

    您的邮件被退回。是邮件管理员将其强行退回的。

    此邮件的收件人列表是:%R

  3. return_suffix.txt 包含结束文本。默认情况下,此文件为空。

表 10–10 通知邮件替换序列

替换 

定义 

%H 

扩展为邮件的标题。 

%C 

扩展为已排队的邮件的单位1 的数量。

%L 

扩展为邮件在返回之前留在队列中的单位1 的数量。

%F 

扩展为邮件可在队列中停留的单位1 的数量。

%S [%s] 

扩展为字母 S 或 s(如果先前扩展的数值不等于一)。示例:根据邮件已排队的天数,"%C day%s" 可扩展为“1 天”或“2 天”。 

%U [%u] 

扩展为正在使用的时间单位小时或天。示例:根据邮件已排队的天数或小时数以及 MTA 选项 RETURN_UNITS 的值,"%C %U%s" 可扩展为“2 天”或“1 小时”。如果您已设置 RETURN_UNITS=1(小时),并且您的站点正在使用本地化的状态通知邮件,则需要编辑除英语外所有语言的 return_delayed.txtreturn_timedout.txt 并将“天”替换为“小时”。对于法语,将 jour(s) 替换为 heure(s)。对于德语,将 Tag(e) 替换为 Stunde(n)。对于西班牙语,将 día(s) 替换为 hora(s)

%R 

扩展为邮件的收件人列表。 

%% 

%(请注意,无论为何种字符集,都将针对替换序列逐字节地扫描文本。如果您正在使用双字节字符集,请检查意外出现的 % 符号。) 

1 单位由 MTA 选项文件中的 RETURN_UNITS 选项定义,可以为小时或天(默认值)。

10.10.2 自定义和本地化传送状态通知邮件

可以本地化传送状态通知邮件,以便将邮件以不同的语言返回给不同用户。例如,可以将法语通知返回给首选使用法语的用户。

本地化或自定义状态通知邮件包括两个步骤:

  1. 创建一组本地化/自定义的 return_*.txt 邮件文件,并将每组文件存储在单独的目录中。10.10.1 构造和修改状态通知中说明了此操作

  2. 设置 NOTIFICATION_LANGUAGE 映射表。

NOTIFICATION_LANGUAGE 映射表(位于 msg-svr-base/config/mappings 中)根据原始邮件(导致系统发出通知的邮件)的属性(例如,语言、国家/地区、域或地址),指定要使用的一组本地化或自定义的通知邮件文件。

原始发件人的邮件将被解析以确定状态通知类型、源通道、首选语言、返回地址及第一收件人。根据该表的构造方式,将根据以上的一个或多个属性来选择一组通知文件。

NOTIFICATION_LANGUAGE 映射表的格式如下所示。由于印刷原因,该样例条目行经过了换行。实际条目应显示在一行中。


NOTIFICATION_LANGUAGE

 dsn-type-list|source-channel|preferred-language|return-address \
|first-recipient $Idirectory-spec

NOTIFICATION_LANGUAGE
 
! Preferred-language: header value specified
!
    *|*|fr|*|*     $I/lc_messages/table/notify_french/
    *|*|es|*|*     $IIMTA_TABLE/notify_spanish/
    *|*|en|*|*     $I/imta/lang/
!
! If no Preferred-language value, then select notification based on the
! country code in the domain name. EX: PF=French Polynesia; BO=Bolivia
!
    *|*|*|*.fr|*   $I/imta/table/notify_french/
    *|*|*|*.fx|*   $I/imta/table/notify_french/
    *|*|*|*.pf|*   $I/imta/table/notify_french/
    *|*|*|*.tf|*   $I/imta/table/notify_french/
    *|*|*|*.ar|*   $I/imta/table/notify_spanish/
    *|*|*|*.bo|*   $I/imta/table/notify_spanish/
    *|*|*|*.cl|*   $I/imta/table/notify_spanish/
    *|*|*|*.co|*   $I/imta/table/notify_spanish/
    *|*|*|*.cr|*   $I/imta/table/notify_spanish/
    *|*|*|*.cu|*   $I/imta/table/notify_spanish/
    *|*|*|*.ec|*   $I/imta/table/notify_spanish/
    *|*|*|*.es|*   $I/imta/table/notify_spanish/
    *|*|*|*.gp|*   $I/imta/table/notify_spanish/
    *|*|*|*.gt|*   $I/imta/table/notify_spanish/
    *|*|*|*.gy|*   $I/imta/table/notify_spanish/
    *|*|*|*.mx|*   $I/imta/table/notify_spanish/
    *|*|*|*.ni|*   $I/imta/table/notify_spanish/
    *|*|*|*.pa|*   $I/imta/table/notify_spanish/
    *|*|*|*.ve|*   $I/imta/table/notify_spanish/
                  

注 –

安装时将提供默认的 mappings.locale 文件,并将其包含在启用通知语言映射的 mappings 文件中。要禁用通知语言映射,请注释以下包含行:

! <IMTA_TABLE:mappings.locale

(请阅读该文件中的注释并根据您的需要进行修改。)


10.10.3 将生成的通知国际化

有两个选项文件既可用于传送状态也可用于邮件处理通知。这些文件旨在使生成的通知的国际化过程更加灵活。这些文件如下所示:


IMTA_LANG:return_option.dat (DSN)IMTA_LANG:disposition_option.dat (MDN)

表 10–11 介绍了可用于这些文件的选项。

表 10–11 传送状态和邮件处理通知选项

选项 

说明 

DAY (DSN)

设置 RETURN_UNITS=0(默认值)时,用于替换 %U%u 的插入文本。请注意,%U%u 没有区别(这与分别替换英文 "Day" 或 "day" 的默认情况不同)。

DIAGNOSTIC_CODE (DSN)

覆盖 DSN 第一部分各收件人部分的构建中使用的 "Diagnostic code:" 文本。指定此字段所用的字符集应与 DSN 第一部分使用的字符集相同。

HOUR (DSN)

设置 RETURN_UNITS=1 时,用于替换 %U%u 的插入文本。请注意,%U%u 没有区别(这与分别替换英文 "Hour" 或 "hour" 的默认情况不同)。

n.n.n (DSN)

构建 DSN 的各收件人部分时,将检查是否存在名称与各收件人的数值状态相匹配的选项。如果匹配,将在 DSN 中插入相应的文本。此外,如果上面指定的 REASON 选项生成零长度的结果,则不会插入 REASON 字段。

ORIGINAL_ADDRESS (DSN)

覆盖 DSN 第一部分各收件人部分的构建中使用的 "Original address:" 文本。指定此字段所用的字符集应与 DSN 第一部分使用的字符集相同。 

REASON (DSN)

覆盖 DSN 第一部分各收件人部分的构建中使用的 "Reason:" 文本。指定此字段所用的字符集应与 DSN 第一部分使用的字符集相同。

RECIPIENT_ADDRESS (DSN)

覆盖 DSN 第一部分各收件人部分的构建中使用的 "Original address:" 文本。指定此字段所用的字符集应与 DSN 第一部分使用的字符集相同。 

RETURN_PERSONAL(DSN 和 MDN)

替换个人姓名字段,以与 From: 字段结合使用字段。此字段应采用 RFC 2047 编码。如果未指定此选项,则使用由 RETURN_PERSONAL MTA 选项设置的值。

SUBJECT(DSN 和 MDN)

替换 Subject: 字段。该值仅在通知未提供其自身的主题字段时使用。此字段应采用 RFC 2047 编码。如果未使用此选项并且通知也未提供主题,则构建一个适当的主题。 

TEXT_CHARSET (MDN)

MDN 第一部分和主题应转换为的字符集文本。默认情况下,不执行任何转换。 

10.10.4 附加的状态通知邮件功能

前几个小节介绍了设置状态通知邮件的基本过程。以下小节将介绍附加功能:

10.10.4.1 阻止较大邮件的内容返回

通常情况下,当邮件被退回或阻止时,邮件的内容会返回发件人和通知邮件中的本地域邮寄主管。 如果完整地返回大量较大的邮件,则可能使资源负载过重。要阻止超过一定大小的邮件返回内容,请设置 MTA 选项文件中的 CONTENT_RETURN_BLOCK_LIMIT 选项。

MTA 获取与信封返回地址关联的阻止限制,并且在没有指定返回策略且邮件大小超过阻止限制时设置 RET=HDRS。这保证了较大邮件的未传送报告自身是可传送的。没有与此更改关联的新选项或设置。

10.10.4.2 从状态通知邮件包含的标题中删除非美国 ASCII 字符

Internet 邮件标题的原始格式不允许包含非美国 ASCII 字符。如果在邮件标题中使用非美国 ASCII 字符,则会使用 RFC 2047 中说明的“MIME 标题编码”对这些字符进行编码。因此,电子邮件中的中文“主题”行将实际显示为:

Subject: =?big5?Q?=A4j=AB=AC=A8=B1=AD=B1=B0=D3=F5=A5X=AF=B2?=

电子邮件客户端负责在显示这些标题时删除编码。

因为 %H 模板将标题复制到通知邮件的正文中,所以已编码的标题文本会正常显示。但是,如果主题中的字符集(这种情况下为 "big5")与 return_prefix.txtContent-Type 标题字符集参数中的字符集匹配,则 Messaging Server 将删除编码。如果不匹配,Messaging Server 将保留编码,不作更改。

10.10.4.3 设置通知邮件传送间隔

关键字:noticesnonurgentnoticesnormalnoticesurgentnotices

无法传送的邮件将在给定的通道队列中保存一段指定的时间,然后再返回发件人。此外,Messaging Server 尝试传送的同时,会将一系列状态/警告消息返回发件人。可以使用关键字 noticesnonurgentnoticesnormalnoticesurgentnotices 指定邮件之间的时间和间隔。示例:

notices 1 2 3

对于所有邮件,将在 1 到 2 天之后发送瞬态失败状态通知邮件。如果 3 天之后邮件仍然没有传送,则会将邮件返回其创始者。

urgentnotices 2,4,6,8

对于优先级为紧急的邮件,将在 2、4 和 6 天之后发送瞬态失败通知。如果 8 天之后邮件仍然没有传送,则会将邮件返回其创始者。

请注意,MTA 选项文件中的 RETURN_UNITS 选项使您可以用小时 (1) 或天 (0) 指定单位。默认设置为天 (0)。如果设置了 RETURN_UNITS=1,则需要安排返回作业每小时运行一次,并且每小时获取一次通知。当返回作业每小时运行一次时,它还将每小时翻滚 mail.log* 文件一次。要防止每小时都翻滚 mail.log 文件,可以将 imta.tailor 文件中的 IMTA_RETURN_SPLIT_PERIOD 调整文件选项设置为 24。返回作业时间安排由 configutil 参数 local.schedule.return_job 控制。但请注意,默认情况下,此命令定期运行(请参见4.6.2 预定义的自动任务)。

如果没有指定 notices 关键字,则默认使用本地通道 lnotices 设置。如果未对本地通道进行设置,则默认使用 notices 3, 6, 9, 12

10.10.4.4 在状态通知邮件中包含已变更的地址

关键字:includefinalsuppressfinaluseintermediate

MTA 生成通知邮件(退回邮件、传送回执邮件等)时,可能同时存在可用于 MTA 的“原始”格式的收件人地址和已变更的“最终”格式的该收件人的地址。MTA 始终会将原始格式(假如存在)包含在通知邮件中,因为这是通知邮件的收件人(通知邮件所关心的原始邮件的发件人)最可能识别的一种格式。

includefinalsuppressfinal 通道关键字控制 MTA 是否还包含最终格式的地址。对于要对外界“隐藏”内部邮箱名称的站点,抑制包含最终格式的地址可能会符合其利益。此类站点可能只愿意在状态通知邮件中包含原始的“外部”格式的地址。includefinal 是默认设置,包含最终格式的收件人地址。如果状态通知邮件中存在原始地址格式,则 suppressfinal 会使 MTA 抑制最终的地址格式。

useintermediate 关键字使用中间地址格式,亦即在列表扩展之后、用户邮箱名称生成之前生成的地址格式。如果此格式不存在,则使用最终格式。

10.10.4.5 对邮寄主管发送、阻止和指定状态通知邮件

默认情况下,除非返回了错误,并使用空的 Errors-to: 标题行或空的信封 From: 地址完全抑制了警告,否则将向邮寄主管发送失败和警告状态通知邮件的副本。可以通过以下小节和表 10–12 中介绍的众多通道关键字来控制进一步精确地向邮寄主管传送通知邮件。本节包含以下几个部分:

返回的失败邮件

关键字:sendpostnosendpostcopysendposterrsendpost

通道程序可能会因长时间服务故障或地址无效而无法传送邮件。发生这种情况时,MTA 通道程序会将邮件返回给发件人,并附带有邮件未传送的原因的说明。可以选择将所有失败邮件的副本发送给本地邮寄主管。这对监视邮件故障十分有用,但是可能会导致邮寄主管必须处理过多的通信量。(请参见表 10–12。)

警告消息

关键字:warnpostnowarnpostcopywarnposterrwarnpost

除了返回邮件,MTA 还可以发送未传送邮件的详细警告。这种现象通常是由于 notices 通道关键字设置引起的超时所致,尽管在某些情况下,通道程序可能在传送尝试失败后生成警告消息。警告消息包含故障和传送尝试持续时间的说明。大多数情况下,警告消息还包含有问题的邮件的标题和前几行。

可选地,所有警告邮件的副本可以发送给本地邮寄主管。在某种程度上,这对监视各个队列的状态十分有用,尽管它确实会产生大量要由邮寄主管处理的通信量。关键字 warnpostcopywarnposterrwarnpostnowarnpost 用于控制向邮寄主管发送警告消息。(请参见表 10–12。)

空的信封返回地址

关键字:returnenvelope

returnenvelope 关键字使用单个整数值,这些整数值可解释为一组位标志。位 0(值 = 1)控制由 MTA 生成的返回通知书写的是空的信封地址还是本地邮寄主管的地址。设置该位将强制使用本地邮寄主管地址,清除该位将强制使用空的地址。


注 –

RFC 1123 强制使用空的地址。但是,某些系统不能正确处理信封 From: 地址,但可能又需要使用此选项。


位 1(值 = 2)控制 MTA 是否将所有空的信封地址都替换为本地邮寄主管的地址。此选项用于适应不符合 RFC 821、RFC 822 或 RFC 1123 的非兼容系统。

位 2(值 = 4)禁止句法上无效的返回地址。

位 3(值 = 8)与 mailfromdnsverify 关键字相同。

邮寄主管返回的邮件内容

关键字:postheadonlypostheadbody

通道程序或定期邮件返回作业将邮件返回给邮寄主管和原始发件人时,邮寄主管副本可以是整个邮件也可以只是标题。将邮寄主管副本限制为标题,可以进一步增加用户邮件的保密级别。但是,此操作本身并不能保证邮件的安全性;如果愿意,邮寄主管和系统管理员通常可以使用 root 系统权限阅读邮件内容。(请参见表 10–12。)

设置每个通道邮寄主管的地址

关键字: aliaspostmasterreturnaddressnoreturnaddressreturnpersonalnoreturnpersonal

默认情况下,MTA 构建退回邮件或状态通知邮件时所使用的邮寄主管返回地址为 postmaster@local-host,其中 local-host 为正式的本地主机名(本地通道上的名称),邮寄主管的个人名称为 "MTA e-Mail Interconnect"。选择邮寄主管地址时应小心—非法的选择可能会导致快速的邮件循环并产生大量的错误消息。

可以使用 RETURN_ADDRESSRETURN_PERSONAL 选项设置 MTA 系统的默认邮寄主管地址和个人名称。或者,如果需要控制每个通道,可以使用 returnaddressreturnpersonal 通道关键字。returnaddressreturnpersonal 分别使用必需参数,以指定邮寄主管地址和个人名称。默认设置为 noreturnaddressnoreturnpersonal,表示应使用默认值。默认值通过 RETURN_ADDRESSRETURN_PERSONAL 选项或正常的默认值(如果未设置该选项)建立。

如果通道中含有 aliaspostmaster 关键字,则按正式通道名寄往用户名 postmaster(小写、大写或大小写混合)的所有邮件都将重定向到 postmaster@local-host,其中 local-host 是正式的本地主机名(本地通道上的名称)。注意,Internet 标准要求 DNS 中接收邮件的任何域均需具有用来接收邮件的有效邮寄主管帐户。因此,在需要集中邮寄主管的责任,而不是为单独的域设置单独的邮寄主管帐户时,该关键字是十分有用的。即,虽然 returnaddress 可以控制 MTA 从邮寄主管生成通知邮件时所使用的返回邮寄主管地址,但是 aliaspostmaster 将影响 MTA 对寄往邮寄主管的邮件的处理。

表 10–12 用于将通知邮件发送给邮寄主管和发件人的关键字

关键字 

说明 

返回的邮件内容

指定通知地址

notices

指定发送通知和返回邮件之前可能经历的时间。 

nonurgentnotices

指定为非紧急优先级的邮件发送通知和返回邮件之前可能经历的时间。 

normalnotices

指定为正常优先级的邮件发送通知和返回邮件之前可能经历的时间。 

urgentnotices

指定为紧急优先级的邮件发送通知和返回邮件之前可能经历的时间。 

返回的邮件

如何处理返回邮件的失败通知。

sendpost

启用向邮寄主管发送所有失败邮件的副本。 

copysendpost

向邮寄主管发送错误通知的副本(除非失败的邮件上的创始者地址为空),在这种情况下,邮寄主管将收到所有失败邮件的副本(除本身实际上为退回邮件或通知邮件的那些邮件)。 

errsendpost

仅在无法将通知返回创始者时向邮寄主管发送错误通知的副本。如果指定了 nosendpost,则永远不向邮寄主管发送失败的邮件。

nosendpost

禁用向邮寄主管发送所有失败邮件的副本。 

警告消息

如何处理警告消息。

warnpost

启用向邮寄主管发送警告消息的副本。默认设置是向邮寄主管发送警告的副本(除非使用空的 Warnings-to: 标题或空的信封 From: 地址。

copywarnpost

向邮寄主管发送警告消息的副本(除非未传送邮件上的创始者地址为空)。 

errwarnpost

在无法将通知返回创始者时向邮寄主管发送警告消息的副本。 

nowarnpost

禁用向邮寄主管发送警告消息的副本。 

返回的邮件内容

指定是向邮寄主管发送整个邮件还是只发送标题。

postheadonly

仅向邮寄主管返回标题。将邮寄主管副本限制为标题,可以进一步增加用户邮件的保密级别。但是,此操作并不能保证邮件的安全性,如果愿意,邮寄主管和系统管理员可以使用 root 系统权限阅读邮件内容。

postheadbody

同时返回邮件的标题和内容。 

返回的邮件内容

指定通知地址

includefinal

在传送通知中包含地址的最终格式(收件人地址)。 

returnenvelope

控制空的信封返回地址的使用。returnenvelope 关键字使用单个整数值,这些整数值可解释为一组位标志。

位 0(值 = 1)控制由 MTA 生成的返回通知书写的是空的信封地址还是本地邮寄主管的地址。设置该位将强制使用本地邮寄主管地址,清除该位将强制使用空的地址。 

位 1(值 = 2)控制 MTA 是否将所有空的信封地址都替换为本地邮寄主管的地址。此选项用于适应不符合 RFC 821、RFC 822 或 RFC 1123 的非兼容系统。

位 2(值 = 4)禁止句法上无效的返回地址。 

位 3(值 = 8)与 mailfromdnsverify 关键字相同。

suppressfinal

抑制通知邮件中的最终地址格式(如果通知邮件中存在原始地址格式)。 

useintermediate

使用在列表扩展之后,但在用户邮箱名称生成之前生成的地址的中间格式。如果此格式不存在,则使用最终格式。 

返回的邮件内容

指定通知地址

aliaspostmaster

将按正式的通道名称寄往 postmaster 用户名的邮件重定向至 postmaster@local-host,其中 local-host 是本地主机名(本地通道上的名称)。 

returnaddress

指定本地邮寄主管的返回地址。 

noreturnaddress

RETURN_ADDRESS 选项值用作邮寄主管地址名称。

returnpersonal

设置本地邮寄主管的个人名称。 

noreturnpersonal

RETURN_PERSONAL 选项值用作邮寄主管个人名称。

10.11 控制邮件处理通知

邮件处理通知 (Message Disposition Notifications, MDN) 是由 MTA 发送给发件人和/ 或邮寄主管的电子邮件报告,内容是邮件的传送处理。例如,如果邮件被 Sieve 过滤器拒绝,将给发件人发送 MDN。MDN 也称为已读回执、确认、回执通知或发送收据。Sieve 脚本撰写语言通常用于邮件服务过滤和休假邮件。

10.11.1 自定义和本地化邮件处理通知邮件

修改和本地化 MDN 的说明与自定义和本地化传送状态通知邮件的说明类似,两者只有一些细微的差别(如下所述)。(请参见10.10.2 自定义和本地化传送状态通知邮件10.10.3 将生成的通知国际化。)

此映射(称为 DISPOSITION_LANGUAGE 映射)与用于国际化状态通知的 notification_language 映射表(请参见10.10.2 自定义和本地化传送状态通知邮件)相当。

但是,采用如下的格式探测 MDN:

type|modifiers|source-channel|header-language|return|recipient

其中:

type 是处理类型,可为下列类型之一:displayeddispatchedprocesseddeleteddeniedfailed

modifiers 是以逗号分隔的处理修饰符列表。当前列表为:errorwarningsupersededexpired

source-channel 是生成 MDN 的源通道。

header-language 是下列之一指定的语言:accept-languagepreferred-languagex-accept-language。(MTA 使用这些选项中存在的第一个选项。)

return 是通知的返回地址。

recipient 是处理针对的地址。

处理映射的结果由两条或三条信息组成,各条信息之间用垂直条 (|) 分隔。第一条信息是该处理通知的模板文件的存放目录。第二条信息是独立的处理文本应该强制转换成的字符集。(此信息是必需的,因为一些处理—特别是由自动回复生成的处理或在休假 Sieve 操作中使用 :mime 参数生成的处理—不使用模板文件,从而不能从这些文件继承字符集。)最后,第三条信息是通知的替换主题行。此信息只有当映射还设置了 $T 标志时才使用。

下面附加的模板文件用于构建 MDN:

disposition_deleted.txt disposition_failed.txt disposition_denied.txt disposition_prefix.txt disposition_dispatched.txt disposition_processed.txt disposition_displayed.txt disposition_suffix.txt disposition_option.opt

这些模板文件的使用与状态通知邮件的各种 return_*.txt 文件的使用类似。在 *.txt 文件的邮件文本中,每行都不能超过 78 个字符。

10.12 优化 MTA 性能

本节介绍了 MTA 的其他优化。其中包含以下各节:

10.12.1 优化对发送到邮件列表的邮件的 LDAP 目录所进行的授权检查

您可以使用元字符替换减少对发送到邮件列表的邮件的 LDAP 目录所进行的授权检查。

现在可以在 mgrpModeratormgrpAllowedBroadcastermgrpDisallowedBroadcaster 属性中指定元字符替换。特别是各种与地址有关的元字符序列(用于整个地址的 $A、用于邮箱部分的 $U、用于域部分的 $D)都引用当前的信封 From: 地址,在某些情况下可以用于将 URL 返回的结果限制在可能(或保证)匹配的条目中。这可以使授权检查变得更有效。

新的 MTA 选项 PROCESS_SUBSTITUTIONS 控制是否在指定 URL 的各种 LDAP 属性中执行替换。该选项是位编码的值,每个位定义如下:

位 

值 

说明 

如果设置,则在 mgrpDisallowedBroadcaster 中启用替换 

如果设置,则在 mgrpAllowedBroadcaster 中启用替换 

如果设置,则在 mgrpModerator 中启用替换 

如果设置,则在 mgrpDeliverTo 中启用替换 

16 

在 memberURL 中启用替换 

PROCESS_SUBSTITUTIONS MTA 选项默认值为 0,表示默认情况下所有这些替换都被禁用。

例如通过 LDAP 查找定义的动态列表,该列表中的每个人都允许邮寄。在这种情况下,您通常要给列表定义如下属性:


mgrpAllowedBroadcaster:
ldap:///o=Sesta,c=US??sub?(&(objectClass=inetMailUser)(objectClass=inetOrgPerson))
mgrpDeliverTo:
ldap:///o=Sesta,c=US??sub?(&(objectClass=inetMailUser)(objectClass=inetOrgPerson)) 

但是,这样定义的效果是将列表扩展两次,一次是用于授权检查,另一次是建立实际的收件人列表。这是一项非常消耗服务器资源的操作。另一方面,如果您添加限制,以便在授权检查中只返回包含当前信封 From: 地址的条目,则可能会获得更好的效果。首先,将 PROCESS_SUBSTITUTION 的设置更改为 2,然后,您可以设置以下条目:


mgrpAllowedBroadcaster:
ldap:///o=Sesta,c=US??sub?(&(objectClass=inetMailUser)(objectClass=inetOrgPerson)
(mail=$A)
mgrpDeliverTo:
ldap:///o=Sesta,c=US??sub?(&(objectClass=inetMailUser)(objectClass=inetOrgPerson)) 

在本例中,只对发件人的条目进行广播授权检查,而不是检查 Sesta US 中的所有用户条目。这减少了目录服务器对单个匹配(最好是通过索引)和单个返回值必须执行的操作。另一种方法是返回条目列表,并让 MTA 执行匹配。

请注意,可用于替换的信息会有所不同,具体取决于属性是用于授权检查,还是用于实际的列表扩展。对于授权属性,整个地址 ($A)、域 ($D)、主机 ($H) 和本地部分 ($L) 都源自已验证的发件人地址。对于列表扩展属性,所有这些替换值都源自指定列表的信封收件人地址。但是对这两种情况来说,子地址替换 ($S) 都源自当前的信封收件人地址。

由于可以访问列表扩展 URL 中的子地址信息,因此可以定义 metagroups,即用于创建不同组的整个集合的单个组条目。例如,一个组的 mgrpDeliverTo 值为

mgrpDeliverTo: ldap:///o=usergroup?mail?sub?(department=$S)

并且相应的 PROCESS_SUBSTITUTIONS 值为 8,则可以使用格式为 group+department@domain.com 的地址向给定部门中的每个成员发送邮件。请注意,如果子地址看起来过于复杂,可以使用转发映射之类的机制修改语法。