本章介绍常规 MTA 服务和配置。其他章节中包含更具体和详细的说明。其中包含以下各节:
修改 MTA 配置文件(例如 imta.cnf、mappings、aliases 或 option.dat)之后,必须重新编译配置。该命令可以将配置文件编译成共享内存中的单个映像(在 UNIX 中)或动态链接库(在 NT 中)。
经过编译的配置中包含静态和动态可重新装入的部分。如果更改了动态部分,并且运行了 imsimta reload,则正在运行的程序将重新装入动态数据。动态部分为映射表、别名和查找表。
编译配置信息的主要原因是为了提高性能。使用经过编译的配置的另一个功能是可以更方便地测试配置更改,因为使用编译后的配置时,配置文件本身不会处于“活动”状态。
当 MTA 组件(例如通道程序)必须读取配置文件时,它首先会查看经过编译的配置是否存在。如果存在,则将映像附加到正在运行的程序。如果映像附加操作失败,则 MTA 会返回使用原先读取文本文件的方法。
如果对 reverse、forward 或通用数据库进行了更改,可执行命令 imsimta reload 使更改生效。如果对 imta.cnf、mappings 文件、aliases、conversions 或 option.dat 文件进行了更改,而这些更改不会影响 job_controller,则应先执行 imsimta cnbuild,再执行 imsimta restart smtp。如果对 dispatcher.cnf 进行了更改,则需要执行 imsimta restart dispatcher。如果对编译后的配置中的配置文件进行了更改,并且这些更改会影响作业控制器但不会影响 SMTP 服务器,则通常应执行以下命令:imsimta cnbuild 和 imsimta restart job_controller。
如果对编译后的配置中的配置文件进行了更改,而这些更改会影响 SMTP 服务器和作业控制器,则应执行以下命令:
imsimta cnbuild imsimta restart smtp imsimta restart job_controller |
(有关这些命令的详细信息,请参见 《Sun Java System Messaging Server 6 2005Q4 Administration Reference》中的“MTA Commands”。)
必须重新启动作业控制器的其他实例有:
更改控制器配置文件 job_controller.cnf、job_controller.site 或 job_controller.cnf 中的任何文件
添加或更改 imta.cnf 文件中通道关键字 pool、maxjobs、master、slave、single、single_sys 或 multiple 的用法。在 imta.cnf 中添加或更改 threaddepth 通道关键字可以使用 imsimta cache -change -thread_depth=... 来代替
使对主通道作业所作的更改立即生效(而无需控制器等待当前的通道作业超时)的情况下,对 MTA 配置或通道选项文件进行的所有相关(即几乎全部)更改。(对 mappings 文件或 MTA 数据库所作的更改:(1) 通常与出站通道作业无关,尽管它们可能对于“中间”通道(例如 conversion、process 和 reprocess)非常重要;(2) 如果需要考虑这些中间通道,通常可以通过 imsimta reload 来处理对 mappings 文件或数据库所作的更改,而无需重新启动作业控制器。)希望使更改立即生效时,需要综合重新启动作业控制器造成的损害和运行某特种作业将多用的时间慎重考虑。
MTA 配置包括 imta.cnf 及其包含的所有文件(如 internet.rules)、alias 文件、mappings 文件、conversions 文件、option.dat 文件(以及上述所有文件中包含的所有文件)、imta.filter 以及 reverse、forward 和通用数据文件,还可能包括一些 configutil 参数。
请注意,以上对 imta.cnf 进行的所有更改(如添加/更改通道定义中的关键字)还需要 imsimta cnbuild - 这是基本要求,无论是否需要重新启动作业控制器。
除非因上述条件之一必须重新启动作业控制器,否则应尽量避免重新启动,特别是在队列中有大量邮件的情况下。
建议不要在营运系统中使用 imsimta refresh 命令,因为通常没有必要重新启动作业控制器,而且重新启动作业控制器将会重置邮件重试次数、延迟的通知邮件、退回的邮件等。
主 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) |
下表说明了先前配置文件中的关键项(标有黑体数字,括在括号中):
文件中出现的第一个空行表示重写规则部分的结束和通道块的开始。这些定义统称为通道主机表,该表定义了 MTA 可以使用的通道以及与每个通道相关联的名称。
第一个显示的通道块通常是本地通道或 l 通道。然后空行将各个通道块彼此分隔开。(defaults 通道例外,它可以显示在 l 通道之前)。
典型的通道定义由通道名称 (a_channel)、定义通道配置的若干关键字 (defragment charset7 usascii) 以及也被称为通道标记的路由系统 (a-daemon) 组成。
配置文件中可以包含其他文件的内容。如果某一行中的第一列包含小于号 (<),则该行中的剩余内容将被视为文件名;文件名应始终使用完整的绝对文件路径。该文件将被打开,其内容将在该点并入配置文件。包含的文件最多可以嵌套三层。配置文件中包含的所有文件必须与配置文件一样,可由所有人读取。
表 10–1 显示了上述配置如何路由一些示例地址。
表 10–1 地址和关联的通道
地址 |
排队到通道 |
---|---|
u@a |
a_channel |
u@b |
b_channel |
u@c |
c_channel |
u@d |
d_channel |
有关 MTA 配置文件的更多信息,请参阅重写规则、通道定义和第 11 章,配置重写规则。
只要更改了 imta.cnf 文件,就必须重新编译 MTA 配置。请参见编译 MTA 配置。
MTA 的许多组件都使用面向表查找的信息。此类表用于将输入字符串转换(即,映射)为输出字符串。此类表称为映射表,通常显示为两列。第一(左边的)列提供对其进行匹配的可能输入字符串(模式),第二(右边的)列给出了映射输入字符串的结果输出字符串(模板)。
大多数 MTA 数据库(包含不同类型的 MTA 数据,不应与映射表混淆)—都是此类表的实例。但是,MTA 数据库文件不具备通配符查找功能,因为其具有内在局限性,必须要扫描整个数据库才能找到匹配的通配符。
MTA mappings 文件支持多个映射表。它具备通配符功能以及多步和迭代映射方法。此方法的计算量比使用数据库要大,特别是条目很多时。但是,其灵活性带来的好处是您不需要等效数据库中的大多数条目,从而可能使总体开销较低。
映射表保存在 MTA mappings 文件中。这是使用 MTA tailor 文件中的 IMTA_MAPPING_FILE 选项指定的文件;默认情况下,该文件为 msg_svr_base/config/mappings。mappings 文件的内容将作为可重新装入的部分并入经过编译的配置中(请参见编译 MTA 配置)。如果无法让所有人都能读取该文件,将导致错误行为。只要更改了 mappings 文件,就必须重新编译 MTA 配置。请参见编译 MTA 配置。
表 10–2 列出了本指南中所介绍的映射表。
表 10–2 Messaging Server 映射表
映射表 |
页 |
说明 |
---|---|---|
AUTH_REWRITE |
与 authrewrite 关键字配合使用,以使用从验证操作 (SASL) 中获得的寻址信息修改标题和信封地址。请参见TCP/IP 连接和 DNS 查找支持 |
|
CHARSET-CONVERSION |
用于指定应该执行哪些类型的通道到通道字符集转换和邮件重新格式化。请参见字符集转换和邮件重新格式化 |
|
COMMENT_STRINGS |
用于修改地址标题注释(括在括号中的字符串)。请参见处理地址标题行中的注释 |
|
CONVERSIONS |
用于为转换通道选择邮件通信。请参见选择用于转换处理的通信 |
|
FORWARD |
用于执行转发,与使用别名文件或别名数据库执行的转发类似。请参见正向查找表和 FORWARD 地址映射 |
|
FROM_ACCESS |
用于基于信封源地址过滤邮件。如果 To 地址是不相关的地址,则使用此表。请参见访问控制映射表—操作 |
|
INTERNAL_IP |
用于识别内部系统和子网。请参见添加 SMTP 中继 |
|
MAIL_ACCESS |
用于根据 SEND_ACCESS 和 PORT_ACCESS 表中找到的组合信息阻塞外来的连接。请参见访问控制映射表—操作 |
|
NOTIFICATION_LANGUAGE |
用于自定义或本地化通知邮件。请参见控制传送状态通知邮件 |
|
ORIG_MAIL_ACCESS |
用于根据 ORIG_SEND_ACCESS 和 PORT_ACCESS 表中找到的组合信息阻塞外来的连接。请参见访问控制映射表—操作 |
|
ORIG_SEND_ACCESS |
用于根据信封源地址、信封目标地址、源通道和目标通道阻塞外来的连接。请参见访问控制映射表—操作 |
|
PERSONAL_NAMES |
用于修改个人名称(尖括号分隔的地址前的字符串)。请参见处理地址标题行中的个人名称 |
|
PORT_ACCESS |
用于根据 IP 编号阻止外来的连接。请参见访问控制映射表—操作 |
|
REVERSE |
用于将地址从内部格式转换为公用的公布格式。将地址由内部格式转换为公用格式 |
|
SEND_ACCESS |
用于根据信封源地址、信封目标地址、源通道和目标通道阻塞外来的连接。请参见访问控制映射表—操作 |
|
SMS_Channel_TEXT |
用于站点定义的文本转换。请参见站点定义的文本转换 |
|
X-ATT-NAMES |
用于从映射表中检索参数值。请参见通过转换条目调用映射表 |
|
X-REWRITE-SMS-ADDRESS |
用于本地 SMS 地址有效性检查。请参见站点定义的地址有效性检查和转换 |
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 指定的任何内容。每种模式或模板最多可以包含 252 个字符。映射中可以显示的条目数量没有限制(尽管条目数量过多可能会消耗大量的 CPU 资源,并且会消耗过多的内存)。较长的行(超过 252 个字符)可以使用反斜杠 (\) 结束,以在下一行继续。两列之间及第一列之前的空格不可省略。
mappings 文件中不允许出现重复的映射表名称。
可以将其他文件包含到 mappings 文件中。这可以通过以下格式的行来实现:
<file-spec |
它可以有效地将文件 file-spec 的内容替换到 mappings 文件中包含出现的位置。文件规范应指定一个完整文件路径(目录等)。以此方式包括的所有文件都必须可由所有用户读取。此类包含的 mappings 文件中还允许具有注释。包括最多可以嵌套三层。装入 mappings 文件的同时会装入包含的文件—不是需要时才将其装入,因此 使用包含的文件时不涉及性能或内存的节省。
mappings 文件中的所有映射都以一致的方式应用。从一个映射到下一个映射的唯一变化就是输入字符串的源和映射输出的用途。
映射操作始终以输入字符串和映射表开始。按照条目在映射表中显示的顺序,从上到下每次扫描一个条目。每个条目的左侧都用作模式,并使用该模式以不区分大小写的方式比较输入字符串。
模式可以包含通配符。特别地,允许使用以下常用通配符:星号 (*) 匹配零个或多个字符,每个百分比符号 (%) 匹配一个字符。可以在星号、百分比符号、空格和制表符前加一个美元符号 ($) 来引用它们。引用星号或百分比符号将使其不具有特殊意义。必须引用空格和制表符以防止它们过早地结束模式或模板。文字美元符号字符应该采用双写的形式 ($$),第一个美元符号引用第二个美元符号。
表 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。
使用 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.4 至 123.45.67.7 范围中的所有地址:
$<123.45.67.4/2>
IPv6 匹配匹配一个 IPv6 地址或子网。
如果给定条目中的模式比较失败,则不执行任何操作,继续扫描下一个条目。如果比较成功,条目的右侧将用作模板以生成输出字符串。该模板会将输入字符串有效地替换为根据模板给出的说明构造的输出字符串。
模板中几乎所有的字符都只是在输出中生成它们自身。只有美元符号 ($) 例外。
美元符号后跟美元符号、空格或制表符将在输出字符串中生成美元符号、空格或制表符。注意,必须引用所有这些字符串,才能将其插入输出字符串中。
美元符号后跟数字 n 代表替换;美元符号后跟字母字符称为“元字符”。元字符本身并不显示在由模板生成的输出字符串中,而是生成一些特殊的替换或处理。有关特殊替换和标准处理元字符的列表,请参见表 10–4。所有其他的元字符都保留用于特定于映射的应用程序。
请注意,元字符 $C、$E、$L 或 $R 中的任何一个出现在匹配模式的模板中时,都会影响映射进程并控制进程是终止还是继续。即,可以设置迭代映射表条目,使一个条目的输出成为另一个条目的输入。如果匹配模式的模板不包含元字符 $C、$E、$L 或 $R 中的任何一个,则假设为 $E(立即终止映射进程)。
为防止无限循环,将限制通过映射表的迭代数量。每次重新启动通过的字符串(长度等于或大于上一个通过的字符串)时,计数器的数量都会增加。如果该字符串的长度比上一个字符串短,则系统会将计数器重置为零。计数器超过 10 以后,将不接受重新迭代映射的请求。
表 10–4 映射模板替换和元字符
替换序列 |
替换 |
---|---|
$n |
从 0 开始从左至右计数的第 n 个通配符字段。 |
$#...# |
序列号替换。 |
$]...[ |
LDAP 搜索 URL 查找;在结果中替换。 |
$|...| |
将指定的映射表应用于所提供的字符串。 |
${...} |
常规的数据库替换。 |
$}domain,attribute{ |
添加该功能以访问每个域的属性。domain 是当前域,attribute 是与该域相关联的属性。如果该域存在并具有属性,则它的初始值将被替换为映射结果;如果属性或域两者中有一个不存在,则映射条目将失败。 attributes 可以为域 LDAP 的属性或以下定义的特殊属性: _base_dn_—域中用户条目的基本 DN _domain_dn_—域条目自身的 DN _domain_name_—域名(与之相对的是别名) _canonical_name_—与域相关联的规范名称 |
$[...] |
调用由站点提供的例程;在结果中替换。 |
元字符 |
说明 |
$C |
将继续执行从下一个表格条目开始的映射进程,并将此条目的输出字符串用作映射进程的新输入字符串。 |
$E |
立即结束映射进程;将此条目的输出字符串用作映射进程的最终结果。 |
$L |
从下一个表条目开始继续执行映射进程;将此条目的输出字符串用作新的输入字符串;表中所有条目都耗尽之后,从第一个表条目开始再执行一次传递。后续匹配可以用 $C、$E 或 $R 元字符覆盖此条件。 |
$R |
从映射表的第一个条目开始继续执行映射进程;将此条目的输出字符串用作映射进程的新的输入字符串。 |
$nA |
插入从位置 0 开始的当前地址左侧第 n 个字符,如果省略 n,则将插入整个地址。 |
$nX |
插入从 0 开始的邮件主机左侧第 n 个组件,如果省略 n,则将插入整个邮件主机。 |
$?x? |
映射条目百分之 x 的时间成功。 |
$\ |
强制后续文本为小写。 |
$^ |
强制后续文本为大写。 |
$_ |
使后续文本保留其原有大小写形式。 |
$= |
强制后续替换字符经适当引用插入到 LDAP 搜索过滤器中。材料为大写。 |
$:x |
仅在设置了指定的标志后才匹配。 |
$;x |
仅在清除了指定的标志后才匹配。 |
后跟数字 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 使映射进程继续处理下一个条目,将当前条目的输出字符串用作映射进程的新输入字符串,并且如果没有找到匹配的映射条目,则从第一个表条目开始在表中再次进行传递。具有 $C、$E 或 $R 元字符的后续匹配条目将覆盖此条件。
$R 使映射进程从表的第一个条目开始继续执行,将当前条目的输出字符串用作映射进程的新输入字符串。
$E 使映射进程终止;此条目的输出字符串为最终输出。$E 为默认值。
映射表模板是从左到右进行扫描的。要为可能“成功”或“失败”的条目(例如,通用数据库替换或随机值控制的条目)设置 $C、$L 或 $R 标志,请将 $C、$L 或 $R 元字符置于可能成功或失败的条目部分的左侧;否则,如果该条目的剩余部分失败,则不显示标志。
某些映射探测设置了特殊标志。这些标志是可设置的,设置后可使用 $:, $; 测试的通用映射表功能测试其是否存在。$:x 使条目仅在设置了标志 x 的情况下匹配。$;x 使条目仅在清除标志 x 的情况下匹配。有关可以应用于该表的任何特殊标志,请参见特定映射表说明。(请参见表 17–2 中的 $A、$T、$S、$F 和 $D。)
如果希望在标志检查成功时条目应成功并终止,而在标志检查失败时映射进程应继续,则条目应在标志检查的左侧使用 $C 元字符,在标志检查的右侧使用 $E 标志。
映射表条目中的元字符 $?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 序列文件的完整文件规范。可选的 radix 和 width 参数分别指定用于输出序列值的基数(基)和输出的位数。默认基数为 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)。
$]ldap-url[ 格式的替换是特殊处理的。ldap-url 被解释为 LDAP 查询 URL,并且该 LDAP 查询的结果将被替换。使用标准的 LDAP URL 时,会省略主机和端口;主机和端口代之由 LDAP_HOST 和 LDAP_PORT 选项指定。即,应将 LDAP URL 指定为:
ldap:///dn[?attributes[?scope?filter]]
其中,显示的方括号字符 [ 和 ] 表示 URL 的可选部分。dn 是必需的标识名,用于指定搜索基准。URL 可选的 attributes、scope 和 filter 部分进一步完善了要返回的信息。即,attributes 指定要从匹配此 LDAP 查询的 LDAP 目录条目中返回的属性。scope 可以是 base(默认)、one 或 sub 中的任何一个。filter 描述匹配条目的特性。
某些 LDAP URL 替换序列可以在 LDAP 查询 URL 中使用。
$|mapping;argument| 格式的替换是特殊处理的。MTA 在 MTA mappings 文件中查找名为 mapping 的辅助映射表,并使用 argument 作为具有此名称的辅助映射表的输入。具有此名称的辅助映射表必须存在,并且必须在其输出中设置了 $Y 标志(如果成功);如果具有此名称的辅助映射表不存在,或没有设置 $Y 标志,则该辅助映射表替换将失败,原始的映射条目也将被视为失败:原始的输入字符串将被用作输出字符串。
请注意,如果您要在执行映射表替换的映射表条目中使用进程控制元字符(例如 $C、$R 或 $L),应将进程控制元字符置于映射表模板中的映射表替换的左侧;否则,映射表替换“失败”将导致不能显示进程控制元字符。
${text} 格式的替换要特殊处理。text 部分用作访问通用查找表或数据库的密钥。数据库是使用 imsimta crdb 实用程序生成的。如果在表中找到了 text,则将替换表中对应的模板。如果 text 与表中的条目都不匹配,则输入字符串将按原样用作输出字符串。
如果您使用的是通用查找表,则需要设置 MTA 选项 use_text_databases 的低顺序位。即,将其设置为奇数。需要将对 general.txt 的更改编译到 MTA 配置中(使用 imsimta cnbuild 进行编译并使用 imsimta reload 重新装入可重新装入的数据)。
如果正在使用常规数据库,则该数据库应该可由所有人读取才能保证它正确操作。
如果要在执行通用表替换的映射表条目中使用进程控制元字符(例如 $C、$R 或 $L),则应将进程控制元字符置于映射表模板中通用表替换的左侧;否则通用表替换“失败”将导致不显示进程控制元字符。
$[image,routine,argument] 格式的替换是特殊处理的。image、routine、argument 部分用于查找和调用由用户提供的例程。在 UNIX 上运行时,MTA 使用 dlopen 和 dlsym 从共享库 image 中动态装入和调用 routine 例程。然后使用以下参数列表将 routine 例程作为函数调用:
status = routine (argument, arglength, result, reslength) |
argument 和 result 是长度为 252 字节的字符串缓冲区。argument 和 result 将作为指针传递至字符串(例如,在 C 中,作为 char*)。arglength 和 reslength 是由引用传递的带有符号的长整数。输入时,argument 包含来自映射表模板的 argument 字符串,arglength 包含该字符串的长度。返回时,结果字符串应放在 result 中,其长度应放在 reslength 中。然后,此结果字符串将替换映射表模板中的 $[image,routine,argument]。如果映射表替换失败,则 routine 例程应返回 0;如果映射表替换成功,则该例程应返回 -1。如果替换失败,则正常情况下,原始输入字符串将原样用作输出字符串。
如果要在执行由站点提供的例程替换的映射表条目中使用进程控制元字符(例如,$C、$R 或 $L),应将进程控制元字符置于映射表模板中由站点提供的例程替换的左侧;否则,映射表替换的“失败”将导致不显示进程控制元字符。
由站点提供的例程调用机制可以使用各种复杂的方式来扩展 MTA 的映射进程。例如,在 PORT_ACCESS 或 ORIG_SEND_ACCESS 映射表中,可以调用某些类型的装入监视服务,其结果可用于确定是否接受连接或邮件。
由站点提供的共享库映像 image 应可由所有用户读取。
您可以从常规映射表功能中的 Unicode 字符值生成 UTF-8 字符串。以下格式的 Unicode 元字符序列:
$&A0A0,20,A1A1&
将生成一个 UTF-8 字符串,其中包含位于 A0A0、20 和 A1A1 位置的字符。
除了 imta.cnf 文件,Messaging Server 还提供了其他几个配置文件,以帮助您配置 MTA 服务。表 10–5 中汇总了这些文件。
如果对 reverse、forward 或通用数据库进行了更改,可执行命令 imsimta reload 使更改生效。如果对 imta.cnf、mappings 文件、aliases、conversions 或 option.dat 文件进行了更改,而这些更改不会影响 job_controller,则应先执行 imsimta cnbuild,再执行 imsimta restart smtp。如果对 dispatcher.cnf 进行了更改,则需要执行 imsimta restart dispatcher。如果对编译后的配置中的配置文件进行了更改,并且这些更改会影响作业控制器但不会影响 SMTP 服务器,则通常应执行以下命令:imsimta cnbuild 和 imsimta restart job_controller。
有关这些命令的详细信息,请参见 《Sun Java System Messaging Server 6 2005Q4 Administration Reference》中的“MTA Commands”。
表 10–5 MTA 配置文件
文件 |
说明 |
---|---|
别名文件(强制) |
实现目录中不存在的别名。msg_svr_base/config/aliases |
TCP/IP (SMTP) 通道选项文件(也称为 SMTP 选项文件) |
设置特定于通道的选项。msg_svr_base/config/channel_option |
由转换通道使用,用于控制邮件正文部分的转换。msg_svr_base/config/conversions |
|
分发程序配置文件(强制) |
分发程序的配置文件。msg_svr_base/config/dispatcher.cnf |
作业控制器文件(强制) |
作业控制器所使用的配置文件。/msg_svr_base/config/job_controller.cnf |
MTA 配置文件(强制) |
用于地址重写、路由以及通道定义。/msg_svr_base/config/imta.cnf |
映射文件(强制) |
映射表的系统信息库。/msg_svr_base/config/mappings |
全局 MTA 选项文件。/msg_svr_base/config/option.dat |
|
调整文件(强制) |
用于指定位置和某些优化参数的文件。/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 |
别名文件 aliases 可用来设置目录中未设置的别名。特别地,根的地址是一个很好的示例。如果目录中存在同一别名,则将忽略在此文件中设置的别名。有关别名和 aliases 文件的更多信息,请参见别名。
对 aliases 文件进行更改后,必须重新启动 MTA 或执行命令 imsimta reload。
TCP/IP 通道选项文件可以控制 TCP/IP 通道的各种特性。通道选项文件必须存储在 MTA 配置目录中,并命名为 x_option,其中 x 是通道的名称。例如,msg_svr_base/config/imta/tcp_local_option。有关更多信息,请参阅配置 SMTP 通道选项。有关所有通道选项关键字和语法的完整信息,请参见 《Sun Java System Messaging Server 6 2005Q4 Administration Reference》。
转换文件 conversions 指定转换通道如何对通过 MTA 的邮件执行转换。可以选择转换任何 MTA 通信子集,并可以使用任何一组程序或命令过程来执行转换处理。MTA 将查看转换文件,以便为每个正文部分选择适当的转换。
有关此文件的语法的更多信息,请参见转换通道。
分发程序配置文件 dispatcher.cnf 用于指定分发程序配置信息。安装时将创建一个默认的配置文件,可不必对其进行更改而直接使用。但是,如果出于安全性或性能原因需要修改默认配置文件,则可以通过编辑 dispatcher.cnf 文件来实现此操作。(有关概念性信息,请参见分发程序。)
分发程序配置文件的格式与其他 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 2005Q4 Administration Reference》。
mappings 文件定义 MTA 如何将输入字符串映射为输出字符串。
MTA 的许多组件都使用面向表查找的信息。一般说来,此类表格可用于将输入字符串转换(即映射)为输出字符串。此类表(称为映射表),通常显示为两列,第一(或左边的)列给出了可能的输入字符串,第二(或右边的)列给出了与输入关联的结果输出字符串。大多数 MTA 数据库都是此类映射表的实例。但是,MTA 数据库文件不具备通配符查找功能,因为其具有内在局限性,必须要扫描整个数据库才能找到匹配的通配符。
mappings 文件为 MTA 提供了支持多个映射表的工具。它提供了完整的通配符工具,并同时提供了多步和迭代映射方法。此方法的计算量比使用数据库要大,特别是条目很多时。但是,其灵活性带来的好处是实际上您不需要等效数据库中的大多数条目,从而可能使实际总体开销较低。
可以使用 imsimta test -mapping 命令来测试映射表。有关 mappings 文件和 test -mapping 命令的语法的更多信息,请参见映射文件和 《Sun Java System Messaging Server 6 2005Q4 Administration Reference》。
对 mappings 文件进行更改后,必须重新启动 MTA 或执行命令 imsimta reload。
选项文件 option.dat 指定与特定于通道的选项相反的全局 MTA 选项。
您可以使用选项文件覆盖作为整体应用于 MTA 的各种参数的默认值。特别地,选项文件可用于建立读入配置和别名文件的各种表的大小。您还可以使用选项文件限制 MTA 接收的邮件的大小、指定 MTA 配置中允许的通道数量、设置允许的重写规则的数量,等等。
在 option.dat 中,以 #、! 或 ; 开头的行被视为注释行,即使前一行带有表示待续的后缀 \ 也不例外。这就说明必须留意包含这些字符的长选项(特别是传送选项)。
对于因自然布局而具有以 # 或 ! 开头的连续行的传送选项,有一种安全而巧妙的解决方法。
有关选项文件语法的更多信息,请参见 《Sun Java System Messaging Server 6 2005Q4 Administration Reference》。
调整文件 imta_tailor 用于设置各种 MTA 组件的位置。为使 MTA 正常工作,imta_tailor 文件必须始终位于 msg_svr_base/config 目录中。
尽管您可以编辑此文件以反映在特定安装中的更改,但是您必须谨慎地执行此操作。对此文件进行更改后,必须重新启动 MTA。最好是在 MTA 停止时进行更改。
除非绝对必要,否则请勿编辑此文件。
有关此文件的完整信息,请参见 《Sun Java System Messaging Server 6 2005Q4 Administration Reference》。
作业控制器可以创建并管理传送邮件的通道作业。这些通道作业在作业控制器内的进程池中运行。可以将池看作是一个运行通道作业的“地方”。池提供了一个计算区域,一组作业可以在其中运行而不与池外的作业竞争资源。(有关作业控制器概念和通道关键字配置的信息,请参阅作业控制器、用于通道执行作业的处理池和服务作业限制。)
作业控制器文件 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 通道关键字将它们的处理请求定向到特定的池。池名称必须与作业控制器配置中的池名称匹配。如果作业控制器不能识别请求的池名称,则将忽略请求。
在初始配置中,定义了以下池:DEFAULT、LOCAL_POOL、IMS_POOL、SMTP_POOL。
通常情况下,如果您需要将某些通道的处理与其他通道的处理区分开,则可以在作业控制器配置中添加附加的池定义。您也可以选择使用具有不同特征的池。例如,您可能需要控制某些通道可以处理的同时进行的请求的数量。您可以通过创建具有作业限制的新池来完成此操作,然后使用 pool 通道关键字将这些通道定向到更适合的新池。
除了池定义以外,作业控制器配置文件还包含 MTA 通道表以及作业控制器处理每个通道的请求所必须使用的命令。两类请求分别称为“主”类型和“从”类型。通常情况下,通道的 MTA 邮件队列中存储了邮件时,便会调用通道主程序。主程序会使邮件退出队列。
调用从程序的目的是轮询某通道并选取进入该通道的所有邮件。尽管几乎所有的 MTA 通道都有主程序,但是很多通道却没有或不需要从程序。例如,经过 TCP/IP 处理 SMTP 的通道就不使用从程序,因为网络服务和 SMTP 服务器将根据 SMTP 服务器发出的请求接收外来的 SMTP 邮件。SMTP 通道的主程序是 MTA 的 SMTP 客户端。
如果与通道关联的目标系统无法一次处理多个邮件,则需要创建一种新类型的池,其作业限制为一个池:
[POOL=single_job] job_limit=1
反之,如果目标系统具有足够的并行处理能力,则可以将作业限制设置为较高的值。
示例 10–1 显示了样例作业控制器配置文件。表 10–6 显示了可用的选项。
!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) anon_host=0 master_command=msg_svr_base/lib/tcp_smtp_client |
前述示例中的关键项(带有编号、括在括号中,且为粗体)为:
此全局选项定义了作业控制器在其上侦听请求的 TCP 端口号。
为后续的 [CHANNEL] 部分设置默认 MAX_LIFE_AGE。
该 [POOL] 部分定义了名为 DEFAULT 的池。
该 [CHANNEL] 部分应用于名为 l 的通道,即 UNIX 本地通道。该部分中所需的唯一定义是 master_command,作业控制器执行该命令来运行此通道。由于通道名称中没有显示通配符,所以通道必须完全匹配。
该 [CHANNEL] 部分应用于名称以 tcp_* 开头的所有通道。由于此通道名称中包含通配符,所以它将与名称以 tcp_ 开头的任何通道相匹配。
作业控制器可以创建并管理传送邮件的通道作业。这些通道作业在作业控制器内的进程池中运行。可以将池看作是一个运行通道作业的“地方”。池提供了一个计算区域,一组作业可以在其中运行而不与池外的作业竞争资源。请注意,在 job_controller 中设置的作业限制是针对每个池的。例如,如果将 SMTP_POOL 的 job_limit 定义为 10,则在任一给定时刻,只能有 10 个 tcp_smtp 客户机进程可以在该池中运行。
某些情况下,可能需要创建附加的 tcp_* 通道(例如,用于特别缓慢的邮件站点的 tcp 通道)。最好是使这些通道在不同的池中运行。这样做的原因在于,如果我们创建了十个不同的 tcp_* 通道,并且它们全在 SMTP_POOL 中运行,则在任一给定时刻,每个 tcp_* 通道上可能只有一个 tcp_smtp 客户机在运行(具体情况取决于是否有目标为所有 tcp_* 通道的邮件,以及是否将 SMTP_POOL 的 job_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 |
有关池的更多信息,请参见用于通道执行作业的处理池,另请参见 《Sun Java System Messaging Server 6 2005Q4 Administration Reference》。
表 10–6 作业控制器配置文件选项
MTA 提供了一个工具,用以支持与本地系统(不一定对应于实际用户)关联的邮箱名称:别名。别名对于构建邮件列表、转发邮件以及提供用户名的同义词十分有用。有关如何处理别名解析的说明,请参见$V 元字符。
在 aliases 文件或别名数据库中定义的旧样式邮递列表现在接受非位置 [capture] 参数。如果使用,[capture] 参数将指定一个捕获地址,指定时使用的语义与由 LDAP 中的用户或组的 LDAP_CAPTURE 属性指定的捕获地址相同。
建议不要使用别名数据库。代之,请使用 aliases 文件,因为可以使用 imsimta reload 命令将别名文件动态地重新装入。
MTA 将使用目录中的信息并创建别名数据库。每次参考常规别名文件时都会参考一次别名数据库。但是,使用常规别名文件之前,将先检查别名数据库。实际上,数据库充当一种在使用别名文件之前调用的地址重写程序。
数据库本身的格式是专用的。请勿尝试直接编辑数据库。请在目录中进行全部必需更改。
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 |
可以在主 aliases 文件中包含其他文件。以下格式的行对 MTA 进行定向,以读取 file-spec 文件:
<file-spec
文件规范必须是完整的文件路径规范,且文件的保护级别与主 aliases 文件的保护级别必须相同,例如,必须可由所有用户读取。
被包含文件的内容将插入到其在 aliases 文件中的引用位置。将被包含文件的引用替换为文件的实际内容也可以达到相同的效果。被包含文件的格式与主 aliases 文件本身的格式相同。实际上,被包含文件本身也可以包含其他文件。被包含文件最多允许嵌套三层。
Messaging Server 提供了多个命令行实用程序,让您可以为 MTA 执行各种维护、测试和管理任务。例如,您可以使用 imsimta cnbuild 命令编译 MTA 配置、别名、映射、安全性、系统级过滤器及选项文件。有关 MTA 命令行实用程序的完整信息,请参见 《Sun Java System Messaging Server 6 2005Q4 Administration Reference》。
有关 SMTP 安全性和访问控制的信息,请参见第 17 章,邮件过滤和访问控制。
所有特定于 MTA 的日志文件都保存在日志目录 (msg_svr_base/log) 中。此目录中包含说明通过 MTA 的邮件通信的日志文件,以及说明有关特定主程序或从程序的信息的日志文件。
有关 MTA 日志文件的更多信息,请参见第 21 章,管理日志记录。
使用地址反向数据库(又称为反向数据库)和 REVERSE 映射表,可以将地址由内部格式转换为公用的公布格式。例如,uid@mailhost.siroe.com 是 siroe.com 域中的有效地址,但它可能不适于向外公开。您可能更希望使用类似于 firstname.lastname@siroe.com 的公用地址。
Messaging Server 提供了其他地址处理工具,例如 aliases 文件和专门的映射表。但为了获得最佳性能,在可以执行地址操作时应使用重写规则。请参见第 11 章,配置重写规则。
在反向数据库中,每个用户的公用地址都是由目录中用户条目的 mail 属性指定的。专用或内部地址由 mailAlternativeAddress 属性指定。分发列表也是一样。
反向数据库包含任何有效的地址与此公用地址之间的映射。反向数据库通常位于 MTA 数据库目录中。该数据库是名称由 msg_svr_base/config/imta_tailor 文件中的 IMTA_REVERSE_DATABASE 选项指定的文件,默认情况下文件为 msg_svr_base/data/db/reversedb.*。
如果在数据库中找到了地址,则数据库右侧对应的内容将替换为该地址。如果未找到该地址,则会尝试在 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。 |
reverse 和 noreverse 通道关键字以及 MTA 选项 USE_REVERSE_DATABASE 和 REVERSE_ENVELOPE 都可以用来控制何时以及如何应用地址反向的具体设置。默认情况下,地址反向操作应用于所有地址,不仅仅是指向后的地址。
通过设置 REVERSE_ENVELOPE 系统选项的值(默认值:1—打开,0—关闭)可以启用或禁用地址反向。
目标通道上的 noreverse 指定不对邮件中的地址应用地址反向。reverse 指定应用地址反向。有关详细信息,请参见启用特定于通道的反向数据库使用。
USE_REVERSE_DATABASE 控制 MTA 是否将地址反向数据库和 REVERSE 映射用作替换地址的源。0 表示不在任何通道中使用地址反向。值为 5(默认值)指定在 MTA 地址重写进程执行重写后,对所有地址都应用地址反向(而不仅是应用于反向指向地址)。值为 13 指定在 MTA 地址重写进程执行重写后,对包含 reverse 通道关键字的地址应用地址反向(而不仅是应用于反向指向地址)。通过设置 USE_REVERSE_DATABASE 选项的位值,可以进一步精确地指定地址反向操作。有关详细信息,请参见《Sun Java System Messaging Server 6 2005Q4 Administration Reference》中的“Option File Format and Available Options”。
REVERSE_ENVELOPE 选项用来控制是否将地址反向应用于信封 From 地址以及邮件标题地址。
有这些选项和关键字的作用的其他信息,请参见 Sun Java System Messaging Server Administration Reference 中的详细说明。
以下是通用 REVERSE 映射的示例:假设 siroe.com 中内部地址的格式为 user@mailhost.siroe.com。而且,用户名称空间规则为:user@host1.siroe.com 和 user@host2.siroe.com 为 siroe.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
默认情况下,如果将路由能力范围设置为邮件服务器域,则将使用地址反向数据库。特定于通道的 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)。
地址反向不会应用于信封的 To: 地址。省略此操作的原因相当明显—信封的 To: 地址随着邮件在邮件系统中的传送,不断地被重写和修改。路由的整体目标是将信封的 To: 地址转换为不断增加的系统和特定于邮箱的格式。地址反向的规范化功能完全不适合于信封的 To: 地址。
在任何情况下,均可以在 MTA 中使用大量的工具替换信封的 To: 地址。别名文件、别名数据库及常规查找表恰好具备此功能。
MTA 还提供正向查找表和 FORWARD 映射,可用于特殊种类的转发目的,例如,基于模式的转发、特定于源的转发或地址的自动注册。请注意,正向查找表和 FORWARD 映射主要用于一些特殊种类的地址转发,大多数种类的地址转发可以使用 MTA 的某一其他转发机制更好地执行。
信封的 To: 地址的各种替换机制与反向查找表的功能等效,但是上面讨论的机制中还没有哪一种与反向映射功能等效。而且确实会发生需要对信封的 To: 地址使用映射功能的情况。
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 映射或数据库查找。
以下示例说明了复杂的 REVERSE 和 FORWARD 映射的使用。假设系统或与 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 位。)
当地址转发需要进行自动注册或特定于源时,可以使用正向查找表。请注意,通常不应使用正向查找表进行邮件的简单转发;执行此类转发时,使用 aliases 文件或别名查找表效率更高。默认情况下不会使用正向查找表,必须通过 USE_FORWARD_DATABASE 选项明确启用后才能使用该表。转发表查找是在执行了地址重写和别名扩展,且检查了所有 FORWARD 映射之后执行的。如果正向表查找成功,则结果替换地址将在整个 MTA 地址重写进程中再次运行。
有两种正向查找表机制,即内存内散列表或常规数据库。除非表的大小过分大,否则建议使用散列表。(1,000 不会受到限制,但是 100,000 就会受到限制)。通过设置 use_text_database 选项中的第 3 位(值为 34)和 use_forward_database 启用散列表。散列表从 msg_svr_base/configure/forward.txt 中读取,它经过编译成为配置的可重新装入的部分,并可通过 imsimta reload 命令强制重新装入活动的 MTA 进程。
转发数据库是一个 MTA crdb 数据库,是使用 crdb 实用程序从源文本文件创建的。源文本文件的默认格式为:
user1@domain1 changedmailbox1@changeddomain1 user2@domain2 changedmailbox@changeddomain2 |
但是,如果已通过设置 USE_FORWARD_DATABASE 选项中的第 3 位启用特定于源的转发数据库,源文本文件的格式为:
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。
传送状态通知或状态通知是由 MTA 发送给发件人和邮寄主管(可选)的电子邮件状态消息。Messaging Server 使您可以按照内容和语言自定义通知邮件。您还可以分别为每类传送状态(例如 FAILED、BOUNCED、TIMEDOUT 等)创建不同的邮件。另外,您还可以为源于特定通道的邮件创建通知邮件。
默认情况下,状态通知存储于 msg_svr_base/config/locale/C 目录中(由 msg_svr_base/config/imta_tailor 文件中的 IMTA_LANG 设置指定)。文件名如下所示:
return_bounced.txt、return_delivered.txt、return_header.opt、return_timedout.txt、return_deferred.txt、return_failed.txt、return_prefix.txt、return_delayed.txt、return_forwarded.txt 和 return_suffix.txt。
在 *.txt 文件的邮件文本中,每行都不能超过 78 个字符。请注意,您不应直接更改这些文件,因为升级 Messaging Server 的当前版本时会覆盖这些文件。如果要修改这些文件,并将它们用作唯一一组通知邮件模板文件 (return_*.txt),请将这些文件复制到一个新目录中,并在其中对它们进行编辑。然后,将 imta_tailor 文件中的 IMTA_LANG 选项设置为指向包含这些模板的新目录。如果希望有多组通知文件(例如,每种语言一组),则需要设置 NOTIFICATION_LANGUAGE 映射表。
单个通知邮件由三个文件构建而成:return_prefix.txt + return_ActionStatus.txt + return_suffix.txt
要自定义或本地化通知,应为每种语言环境和/或自定义创建一组完整的 return_*.txt 文件并将其存储在单独的目录中。例如,您可以将法语通知文件存储在一个目录中,将西班牙语通知文件存储在另一个目录中,并将特殊的未经许可的批量电子邮件通道的通知存储在第三个目录中。
本发行版中包含法语、德语和西班牙语的样例文件。您可以修改这些文件,使它们适合于特定的需要。
对于双字节语言,例如日语,请确保使用日语构造文本,然后就像查看 ASCII 一样查看该文本,以检查 % 字符。如果有意外的 % 字符,则使用 %% 替换它们。
下面介绍了状态通知邮件集的格式和结构。
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-1 和 fr)。%H 是表 10–9 中定义的标题替换序列。
return_<ActionStatus>.txt 包含特定于状态的文本。ActionStatus 指邮件的 MTA 状态类型。例如,return_failed.txt 的默认文本如下:
无法将您的邮件传递给下列收件人:%R
return_bounced.txt 的默认文本为:
您的邮件被退回。是邮件管理员将其强行退回的。
此邮件的收件人列表是:%R
return_suffix.txt 包含结束文本。默认情况下,此文件为空。
替换 |
定义 |
---|---|
%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.txt 和 return_timedout.txt 并将“天”替换为“小时”。对于法语,将 jour(s) 替换为 heure(s)。对于德语,将 Tag(e) 替换为 Stunde(n)。对于西班牙语,将 día(s) 替换为 hora(s) |
%R |
扩展为邮件的收件人列表。 |
%% |
%(请注意,无论为何种字符集,都将针对替换序列逐字节地扫描文本。如果您正在使用双字节字符集,请检查意外出现的 % 符号。) |
1 单位由 MTA 选项文件中的 RETURN_UNITS 选项定义,可以为小时或天(默认值)。 |
可以本地化传送状态通知邮件,以便将邮件以不同的语言返回给不同用户。例如,可以将法语通知返回给首选使用法语的用户。
本地化或自定义状态通知邮件包括两个步骤:
创建一组本地化/自定义的 return_*.txt 邮件文件,并将每组文件存储在单独的目录中。构造和修改状态通知中说明了此操作
设置 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 |
dsn-type-list 是以逗号分隔的传送状态通知类型列表。如果指定了多种类型,则这些类型必须由逗号分隔,中间不能包含空格(空格将终止映射表条目的模式)。这些类型如下:
failed—通用的永久性错误消息(例如,无此用户)。使用 return_failed.txt 文件。
bounced—与手动“退回”结合使用的通知邮件。由邮寄主管完成。使用 return_bounced.txt 文件。
timedout—MTA 无法在允许的传送时间内传送邮件。邮件将被返回。使用 return_timedout.txt 文件。
delayed—MTA 一直无法传送邮件,但将继续尝试传送。使用 return_delayed.txt 文件。
deferred—与 "delayed" 类似的未传送通知,但没有指示 MTA 将继续尝试传送的时间。使用 return_deferred.txt 文件。
forwarded—为此邮件请求了传送回执,但是该邮件现已被转发给不支持此类回执的系统。使用 return_forwarded.txt 文件。
source-channel 是生成通知邮件的通道,即邮件当前排队的通道。例如,ims-ms 对应于邮件存储的传送队列,tcp_local 对应于出站 SMTP 队列,等等。
preferred-language 是正在处理的邮件(为其生成通知的邮件)中所使用的语言。此信息的源最初是 accept_language 字段。如果该字段不存在,则使用 Preferred-language: 标题字段和 X-Accept-Language: 标题字段。有关标准语言代码值的列表,请参阅文件 msg_svr_base/config/languages.txt。
如果此字段不为空,则它将成为对 Preferred-language: 或 X-Accept-language: 标题行指定的邮件创始者。因此,您可以在此字段中找到无意义的字符。
return-address 是原始邮件的信封的 From: 地址。它是要向其发送通知邮件的信封地址,因此也是要使用的语言的指示符。
first-recipient 是原始邮件发往的信封的 To: 地址(如果邮件无法到达多个收件人处则为第一个地址)。例如,在通知“无法将您的邮件传送至 dan@siroe.com 中”的情况下,dan@siroe.com 即为报告的信封 To: 地址。
directory-spec 是是包含要使用的 return_*.txt 文件的目录(如果映射表探测匹配)。请注意,$I 必须位于目录规范之前。
例如,在 /lc_messages/table/notify_french/ 目录中存储法语通知文件 (return_*.txt) 以及在 /lc_messages/table/notify_spanish/ 目录下的 return_*.txt 文件中存储西班牙语通知文件的站点可能使用如下所示的表。注意,每个条目的开始处都必须有一个或多个空格,并且条目之间可以不含空行。
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
(请阅读该文件中的注释并根据您的需要进行修改。)
有两个选项文件既可用于传送状态也可用于邮件处理通知。这些文件旨在使生成的通知的国际化过程更加灵活。这些文件如下所示:
IMTA_LANG:return_option.dat (DSN)IMTA_LANG:disposition_option.dat (MDN) |
表 10–10 介绍了可用于这些文件的选项。
表 10–10 传送状态和邮件处理通知选项
选项 |
说明 |
---|---|
DAY (DSN) |
设置 RETURN_UNITS=0(默认值)时,用于替换 %U 或 %u 的插入文本。请注意,%U 和 %u 没有区别(这与分别替换英文 "Day" 或 "day" 的默认情况不同)。 |
覆盖用于构造 DSN 第一部分中每个收件人部分的 "Diagnostic code:" 文本。指定此字段所用的字符集应与 DSN 第一部分使用的字符集相同。 |
|
HOUR (DSN) |
设置 RETURN_UNITS=1 时,用于替换 %U 或 %u 的插入文本。请注意,%U 和 %u 没有区别(这与分别替换英文 "Hour" 或 "hour" 的默认情况不同)。 |
n.n.n (DSN) |
构建 DSN 的各收件人部分时,将检查是否存在名称与各收件人的数值状态相匹配的选项。如果匹配,将在 DSN 中插入相应的文本。此外,如果上面指定的 REASON 选项生成零长度的结果,则不会插入 REASON 字段。 |
覆盖 DSN DSN 第一部分各收件人部分的构建中使用的 "Recipient address:" 文本。指定此字段所用的字符集应与 DSN 第一部分使用的字符集相同。 |
|
REASON (DSN) |
覆盖用于构建 DSN 第一部分中每个收件人部分的 "Reason:" 文本。指定此字段所用的字符集应与 DSN 第一部分使用的字符集相同。 |
覆盖 DSN DSN 第一部分各收件人部分的构建中使用的 "Recipient address:" 文本。指定此字段所用的字符集应与 DSN 第一部分使用的字符集相同。 |
|
替换个人姓名字段,以与 From: 字段结合使用字段。此字段应采用 RFC 2047 编码。如果未指定此选项,则使用由 RETURN_PERSONAL MTA 选项设置的值。 |
|
SUBJECT(DSN 和 MDN) |
替换 Subject: 字段。该值仅在通知未提供其自身的主题字段时使用。此字段应采用 RFC 2047 编码。如果未使用此选项并且通知也未提供主题,则构建一个适当的主题。 |
MDN 第一部分和主题应转换为的字符集文本。默认情况下,不执行任何转换。 |
前几个小节介绍了设置状态通知邮件的基本过程。以下小节将介绍附加功能。
通常情况下,当邮件被退回或阻塞时,邮件的内容会返回发件人和通知邮件中的本地域邮寄主管。 如果完整地返回大量较大的邮件,则可能使资源负载过重。要阻塞超过一定大小的邮件返回内容,请设置 MTA 选项文件中的 CONTENT_RETURN_BLOCK_LIMIT 选项。
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.txt 中 Content-Type 标题字符集参数中的字符集匹配,则 Messaging Server 将删除编码。如果不匹配,Messaging Server 将保留编码,不作更改。
关键字:notices、nonurgentnotices、normalnotices、urgentnotices
无法传送的邮件将在给定的通道队列中保存一段指定的时间,然后再返回发件人。此外,Messaging Server 尝试传送的同时,会将一系列状态/警告消息返回发件人。可以使用关键字 notices、nonurgentnotices、normalnotices 或 urgentnotices 指定邮件之间的时间和间隔。示例:
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。返回作业时间安排由 local.schedule.return_job configutil 参数控制。
如果没有指定 notices 关键字,则默认使用本地通道 l 的 notices 设置。如果未对本地通道进行设置,则默认使用 notices 3, 6, 9, 12。
关键字:includefinal、suppressfinal、useintermediate
MTA 生成通知邮件(退回邮件、传送回执邮件等)时,可能同时存在可用于 MTA 的“原始”格式的收件人地址和已变更的“最终”格式的该收件人的地址。MTA 始终会将原始格式(假如存在)包含在通知邮件中,因为这是通知邮件的收件人(通知邮件所关心的原始邮件的发件人)最可能识别的一种格式。
includefinal 和 suppressfinal 通道关键字控制 MTA 是否还包含最终格式的地址。对于要对外界“隐藏”内部邮箱名称的站点,抑制包含最终格式的地址可能会符合其利益。此类站点可能只愿意在状态通知邮件中包含原始的“外部”格式的地址。includefinal 是默认设置,包含最终格式的收件人地址。如果状态通知邮件中存在原始地址格式,则 suppressfinal 会使 MTA 抑制最终的地址格式。
useintermediate 关键字使用中间地址格式,亦即在列表扩展之后、用户邮箱名称生成之前生成的地址格式。如果此格式不存在,则使用最终格式。
默认情况下,除非返回了错误,并使用空的 Errors-to: 标题行或空的信封 From: 地址完全抑制了警告,否则将向邮寄主管发送失败和警告状态通知邮件的副本。可以通过以下部分和表 10–11 中介绍的众多通道关键字,来控制进一步精确地向邮寄主管传送通知邮件。
关键字:sendpost、nosendpost、copysendpost、errsendpost
通道程序可能会因长时间服务故障或地址无效而无法传送邮件。发生这种情况时,MTA 通道程序会将邮件返回给发件人,并附带有邮件未传送的原因的说明。可以选择将所有失败邮件的副本发送给本地邮寄主管。这对监视邮件故障十分有用,但是可能会导致邮寄主管必须处理过多的通信量。(请参见表 10–11。)
关键字:warnpost、nowarnpost、copywarnpost、errwarnpost
除了返回邮件,MTA 还可以发送未传送邮件的详细警告。这种现象通常是由于 notices 通道关键字设置引起的超时所致,尽管在某些情况下,通道程序可能在传送尝试失败后生成警告消息。警告消息包含故障和传送尝试持续时间的说明。大多数情况下,警告消息还包含有问题的邮件的标题和前几行。
可选地,所有警告邮件的副本可以发送给本地邮寄主管。在某种程度上,这对监视各个队列的状态十分有用,尽管它确实会产生大量要由邮寄主管处理的通信量。关键字 warnpost、copywarnpost、errwarnpost 和 nowarnpost 用于控制向邮寄主管发送警告消息。(请参见表 10–11。)
returnenvelope 关键字使用单个整数值,这些整数值可解释为一组位标志。位 0(值 = 1)控制由 MTA 生成的返回通知书写的是空的信封地址还是本地邮寄主管的地址。设置该位将强制使用本地邮寄主管地址,清除该位将强制使用空的地址。
RFC 1123 强制使用空的地址。但是,某些系统不能正确处理信封 From: 地址,但可能又需要使用此选项。
位 1(值 = 2)控制 MTA 是否将所有空的信封地址都替换为本地邮寄主管的地址。此选项用于适应不符合 RFC 821、RFC 822 或 RFC 1123 的非兼容系统。
位 2(值 = 4)禁止句法上无效的返回地址。
位 3(值 = 8)与 mailfromdnsverify 关键字相同。
通道程序或定期邮件返回作业将邮件返回给邮寄主管和原始发件人时,邮寄主管副本可以是整个邮件也可以只是标题。将邮寄主管副本限制为标题,可以进一步增加用户邮件的保密级别。但是,此操作本身并不能保证邮件的安全性;如果愿意,邮寄主管和系统管理员通常可以使用 root 系统权限阅读邮件内容。(请参见表 10–11。)
关键字:aliaspostmaster、returnaddress、noreturnaddress、returnpersonal、noreturnpersonal
默认情况下,MTA 构建退回邮件或状态通知邮件时所使用的邮寄主管返回地址为 postmaster@local-host,其中 local-host 为正式的本地主机名(本地通道上的名称),邮寄主管的个人名称为 "MTA e-Mail Interconnect"。选择邮寄主管地址时应小心—非法的选择可能会导致快速的邮件循环并产生大量的错误消息。
可以使用 RETURN_ADDRESS 和 RETURN_PERSONAL 选项设置 MTA 系统的默认邮寄主管地址和个人名称。或者,如果需要控制每个通道,可以使用 returnaddress 和 returnpersonal 通道关键字。returnaddress 和 returnpersonal 分别使用必需参数,以指定邮寄主管地址和个人名称。默认设置为 noreturnaddress 和 noreturnpersonal,表示应使用默认值。默认值通过 RETURN_ADDRESS 和 RETURN_PERSONAL 选项或正常的默认值(如果未设置该选项)建立。
如果通道中含有 aliaspostmaster 关键字,则按正式通道名寄往用户名 postmaster(小写、大写或大小写混合)的所有邮件都将重定向到 postmaster@local-host,其中 local-host 是正式的本地主机名(本地通道上的名称)。注意,Internet 标准要求 DNS 中接收邮件的任何域均需具有用来接收邮件的有效邮寄主管帐户。因此,在需要集中邮寄主管的责任,而不是为单独的域设置单独的邮寄主管帐户时,该关键字是十分有用的。即,虽然 returnaddress 可以控制 MTA 从邮寄主管生成通知邮件时所使用的返回邮寄主管地址,但是 aliaspostmaster 将影响 MTA 对寄往邮寄主管的邮件的处理。
表 10–11 用于将通知邮件发送给邮寄主管和发件人的关键字
邮件处理通知 (MDN) 是由 MTA 发送给发件人和/ 或邮寄主管的电子邮件报告,内容是邮件的传送处理。例如,如果邮件被 Sieve 过滤器拒绝,将给发件人发送 MDN。MDN 也称为已读回执、确认、回执通知或发送收据。Sieve 脚本撰写语言通常用于邮件服务过滤和休假邮件。
修改和本地化 MDN 的说明与自定义和本地化传送状态通知邮件的说明类似,两者只有一些细微的差别(如下所述)。(请参见自定义和本地化传送状态通知邮件和将生成的通知国际化。)
此映射(称为 DISPOSITION_LANGUAGE 映射)与用于国际化状态通知的 notification_language 映射表(请参见自定义和本地化传送状态通知邮件)相当。
但是,采用如下的格式探测 MDN:
type|modifiers|source-channel|header-language|return|recipient
其中:
type 是处理类型,可为下列类型之一:displayed、dispatched、processed、deleted、denied 或 failed。
modifiers 是以逗号分隔的处理修饰符列表。当前列表为:error、warning、superseded 和 expired。
source-channel 是生成 MDN 的源通道。
header-language 是下列之一指定的语言:accept-language、preferred-language 或 x-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 个字符。