mappings 文件中的所有映射都以一致的方式应用。从一个映射到下一个映射的唯一变化就是输入字符串的源和映射输出的用途。
映射操作始终以输入字符串和映射表开始。按照条目在映射表中显示的顺序,从上到下每次扫描一个条目。每个条目的左侧都用作模式,并使用该模式以不区分大小写的方式比较输入字符串。有关 MTA 进程所使用的表以及何时使用的详细信息,请参见表 10–2。本节包含以下几个部分:
模式可以包含通配符。特别地,允许使用以下常用通配符:星号 (*) 匹配零个或多个字符,每个百分比符号 (%) 匹配一个字符。可以在星号、百分比符号、空格和制表符前加一个美元符号 ($) 来引用它们。引用星号或百分比符号将使其不具有特殊意义。必须引用空格和制表符以防止它们过早地结束模式或模板。文字美元符号字符应该采用双写的形式 ($$),第一个美元符号引用第二个美元符号。
表 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 个通配符字段。 |
$#...# |
序列号替换。 |
$]...[ |
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 个通配符相匹配的内容。通配符从 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 的情况下匹配。有关可以应用于该表的任何特殊标志,请参见特定映射表说明。(请参见表 18–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)。
$]url [ 格式的替换是特殊处理的。url 可以是任何支持的 URL 类型,其中包括 file: 和 data:。也可以使用标准的 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 中使用。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 使用 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 位置的字符。