在早于 Messaging Server 6 2003Q4 的版本中,Messaging Server 通常可以访问由 LDAP 服务器中存储的信息编译得到的数据库中的所有用户、域和组数据。更新 LDAP 服务器中的目录信息时,将通过称为 dirsync 的程序同步更新数据库信息。现在,Messaging Server MTA 可以直接访问 LDAP 目录。本章介绍使用直接 LDAP 数据访问时 MTA 中的数据流。本章包含以下各节:
以下各节介绍直接 LDAP 处理。
以 user@domain 格式的地址启动时,地址转换和路由进程将首先检查 domain 是否是本地域。
MTA 重写规则机制添加了新的功能,可以检查给定字符串是否为需要在本地处理的域。通过 $V 或 $Z 元字符可以激活此新增功能。这些新增元字符在句法上与现有的 $N、$M、$Q 和 $C 元字符类似,即这些元字符之后都要跟模式字符串。就 $N、$M、$Q 和 $C 而言,此模式与源通道或目标通道相匹配。就 $V 和 $Z 而言,此模式是一个域,并将检查该域是否为本地域。$V 导致非本地域的规则失败,$Z 导致本地域的规则失败。
按以下过程可以实现对这些元字符的处理:
Messaging Server 将检查当前域与目录中的有效域条目是否匹配。如果不存在该条目,则转至步骤 3。
如果目录中有该域的条目,则将从域条目中检索由 LDAP_DOMAIN_ATTR_ROUTING_HOSTS MTA 选项(默认值为 mailRoutingHosts)指定的属性。如果存在该属性,它将列出能够处理该域中的用户的一组主机。该列表将与由 local.hostname configutil 参数指定的主机和由 local.imta.hostnamealiases configutil 参数指定的主机列表进行对比。这些选项可以分别由 LDAP_LOCAL_HOST 和 LDAP_HOST_ALIAS_LIST MTA 选项覆盖。 如果存在匹配或者域中不存在该属性,则该域为本地域。如果未出现匹配,则该域为非本地域。
由于 mailRoutingHosts 属性取决于 ROUTE_TO_ROUTING_HOST MTA 选项的设置,因此将这些域作为非本地域进行处理。如果将选项设置为 0(默认设置),地址将仅被视为非本地地址,MTA 重写规则用于确定路由。如果将选项设置为 1,源路由(由 LDAP_DOMAIN_ATTR_ROUTING_HOSTS MTA 选项中列出的第一个值组成)将被附加到地址之前。
如果找不到任何域条目,则从域的左侧删除组件,然后转至步骤 1。如果没有剩余组件,则继续执行步骤 4。
回溯域树的结果就是如果 siroe.com 被识别为本地域,则 siroe.com 的任何子域均将被识别为本地域。也可能会出现不需要这么做的情况,因此提供了 MTA 选项 DOMAIN_UPLEVEL 来控制该性能。特别是,如果清除 DOMAIN_UPLEVEL 的位 0(值为 1),则会禁用删除域组件的重试操作。DOMAIN_UPLEVEL 的默认值为 0。
现在需要执行虚名域检查。虚名域没有域条目,而是通过将特定的域属性附加到一个或多个用户条目指定的。通过使用由 DOMAIN_MATCH_URL MTA 选项指定的 LDAP URL 来执行 LDAP 搜索可以完成虚名域检查。应该将该选项的值设置为:
ldap:///$B?msgVanityDomain?sub?(msgVanityDomain=$D)
$B 将替换 local.ugldapbasedn configutil 参数的值;这是目录中用户树的基目录。LDAP_USER_ROOT MTA 选项专用于为 MTA 覆盖该 configutil 选项的值。
该搜索的实际返回值并不重要。重要的是,是否会返回值。如果返回值,该域将被视为本地域;如果未返回值,该域将被视为非本地域。
提醒您注意在目录中查找有效域条目执行哪些步骤。这些步骤是特定于模式级别的。就 Sun LDAP Schema 1 而言,这些步骤包括:
将域转换为域树中的基本 DN。通过将域转换为一系列 dc 组件,然后添加域根后缀可以完成此操作。默认后缀可通过 service.dcroot configutil 参数获得。默认后缀为 o=internet。因此 a.b.c.d 格式的域通常被转换为 dc=a,dc=b,dc=c,dc=d,o=internet。通过设置 LDAP_DOMAIN_ROOT MTA 选项可以覆盖 service.dcroot configutil 参数。
查找具有在步骤 1 中找到的基本 DN 的条目,以及对象类为 inetDomain 或 inetDomainAlias 的条目。通过设置 LDAP_DOMAIN_FILTER_SCHEMA1 MTA 选项(默认设置为 (|(objectclass=inetDomain)(objectclass=inetdomainalias)))可以覆盖用于此目的的搜索过滤器。
如果未找到任何条目,则以失败退出。
如果找到条目的对象类为 inetDomain,请检查以确保该条目具有与域条目相关联的 inetDomainBaseDn 属性。如果存在该属性,系统会将其保存以供后续搜索用户条目以及终止处理时使用。如果不存在该属性,则假定该条目为域别名,并继续进行步骤 5。MTA 选项 LDAP_DOMAIN_ATTR_BASEDN 可用于覆盖 inetDomainBaseDN 的使用。
条目必须为域别名;查找 aliasedObjectName 属性所引用的新条目并返回步骤 4。如果不存在 aliasedObjectName 属性,则处理过程会因故障而终止。可以通过 MTA 选项 LDAP_DOMAIN_ATTR_ALIAS 指定 aliasedObjectName 属性的替代使用方法。
请注意,处理最多只能返回步骤 4 一次;不允许使用指向域别名的域别名。
在 Sun LDAP Schema 2 中,所采取的操作更简单:搜索目录,查找具有对象类 sunManagedOrganization 的条目,其中域显示为 sunPreferredDomain 或 associatedDomain 属性的值。如果需要,可以使用 MTA 选项 LDAP_ATTR_DOMAIN1_SCHEMA2 和 LDAP_ATTR_DOMAIN2_SCHEMA2 分别覆盖用于此目的的 sunPreferredDomain 和 associatedDomain 属性的使用。在由 service.dcroot configutil 参数指定的根目录下执行搜索。通过设置 LDAP_DOMAIN_ROOT MTA 选项可以覆盖 service.dcroot configutil 参数。此外,Schema 2 中的域条目不需要具有 inetDomainBaseDn 属性;如果没有这些属性,用户树的基目录将被假定为域条目本身。
由于执行域重写操作很频繁并且目录查询(尤其是虚名域检查)很耗时,因此需要缓存有关域的负向和正向指示。使用内存中的开放链的动态扩展散列表可以实现此操作。通过 DOMAIN_MATCH_CACHE_SIZE MTA 选项(默认值为 100000)可以设置高速缓存大小的最大值,通过 DOMAIN_MATCH_CACHE_TIMEOUT MTA 选项(默认值为 600 秒)可以设置高速缓存中条目的超时值。
必须小心处理在此过程中出现的临时服务器故障,发生这些故障以后,系统将无法知道给定域是否为本地域。在这种情况下,基本上会出现两种结果:
将临时 (4xx) 错误返回客户机,通知其稍后重试该地址。
接受该地址,但将其排入到重新处理的通道,这样可以在本地稍后重试该地址。
这些选项并不适合所有的情况。例如,当与远程 SMTP 中继通话时,则对应于结果 1。但处理来自本地用户的 SMTP 提交时,则对应于结果 2。
虽然从理论上来说,可以通过在同一模式下使用多个规则来处理临时故障,但是,即使具备高速缓存,由于重复进行此类查询所带来的系统开销也无法接受。由于这些原因,域重写的简单成功/失败转到下一规则匹配的模型是不足的。在域查找失败的情况下,将使用通过 MTA 选项 DOMAIN_FAILURE 指定的特殊模板。$V 操作失败后,该模板将替换要处理的当前重写规则模板的剩余部分。
在有可能运行其他重写规则操作之前,需要先执行该域检查。通过在规则的左侧使用特殊的 $* 可以确保此要求。在检查所有其他规则之前,先检查 $* 模式。
考虑到目前为止所述的所有机制,imta.cnf 中所需的新重写规则为:
$* $E$F$U%$H$V$H@localhost
并且 option.dat 文件中的DOMAIN_FAILURE MTA 选项的值应为:
reprocess-daemon$Mtcp_local$1M$1~-error$4000000?Temporary lookup failure
在此重写规则中,localhost 是与本地通道相关联的主机名。此处所示的 DOMAIN_FAILURE 选项的值是默认值,因此在一般环境下不需要将该值显示在 option.dat 中。
此处的排序特别需要慎重对待。MTA 对 $V 的检查应在重新建立地址后以及在添加路由前进行。在临时查找失败的情况下,MTA 将更改路由。只要插入点发生了更改,就将应用暂挂通道匹配检查,以使第二个 $H 之后的 @ 调用检查。如果检查成功,将应用模板的剩余部分并重写处理结论。如果检查失败,重写就会失败,重写将继续执行下一个适用的重写规则。如果由于临时故障而无法执行检查,将使用通过 DOMAIN_FAILURE MTA 选项指定的值继续进行模板处理。首先,使用该模板的值将路由主机设置为 reprocess-daemon。然后,模板将检查 MTA 是否正在处理某类重新处理通道或 tcp_local。如果 MTA 正在处理此类通道,则规则将继续,因此使路由主机非法并将临时故障指定为结果。如果 MTA 没有处理此类通道,则规则将被截断并成功终止,因此将地址重写到重新处理通道。
确定地址要与本地通道相关联后,该地址将自动进行别名扩展。别名扩展处理将检查若干信息源,包括:
别名文件(已编译配置的一部分)。
别名数据库。
别名 URL。
要检查的确切别名源以及检查顺序取决于 option.dat 文件中的 ALIAS_MAGIC MTA 选项的设置。对于直接 LDAP,将选项设置为 8764。这表示首先检查由 ALIAS_URL0 MTA 选项指定的 URL,再检查由 ALIAS_URL1 MTA 选项指定的 URL,接着检查由 ALIAS_URL2 MTA 选项指定的 URL,最后检查别名文件。此设置有效时,将不检查别名数据库。
通过将两个特殊 LDAP URL 指定为别名 URL,可以实现 LDAP 中的别名检查。上述第一个 URL 用于处理常规用户和组;后续别名 URL 用于处理虚名域。第一个 URL 被指定为 ALIAS_URL0:
ALIAS_URL0=ldap:///$V?*?sub?$R
元字符扩展发生在 URL 查找之前。在 ALIAS_URL0 值中使用的两个元字符分别为 $V 和 $R。
$V 元字符将地址的域部分转换为基本 DN。这与前面标题为重写规则机制一节所述的 $V 重写规则元字符执行的初始步骤类似。$V 处理由以下步骤组成:
获取当前域中用户条目的基本 DN。
获取与当前域相关联的规范域。在 Sun LDAP Schema 1 中,规范域名由域条目的 inetCanonicalDomainName 属性(如果该属性存在)指定。如果不存在该属性,规范域名则是通过实际域条目的 DN 以明显的方式构建的。如果当前域是一个别名,这将与当前域不同。可以使用 option.dat 文件中的 LDAP_DOMAIN_ATTR_CANONICAL MTA 选项覆盖用于存储规范名称的名称属性。
如果存在基本 DN,则使用该 DN 替换 URL 中的 $V。
现在确定了该条目的所有可用托管域。通过将规范域(如果清除了 DOMAIN_UPLEVEL 的位 2 [值为 4])或当前域(如果设置了 DOMAIN_UPLEVEL 的位 2 [值为 4])与 service.defaultdomain configutil 参数相比较来完成此操作。如果不匹配,则该条目是托管域的成员。通过设置 option.dat 文件中的 LDAP_DEFAULT_DOMAIN MTA 选项可以覆盖 service.defaultdomain configutil 参数。
如果基本 DN 确定失败,则从域的左侧删除组件,然后转至步骤 1。如果没有剩余任何组件,则替换将失败。
$V 还接受可选数字变量。如果将其设置为 1(例如 $1V),将忽略解析域树中的域时出现的失败,并返回由 local.ugldapbasedn configutil 选项指定的用户树的基目录。
如果尝试检索域的基本 DN 成功,MTA 还将检索稍后会需要的若干有用的域属性。通过 option.dat 文件中的以下 MTA 选项设置检索到的属性的名称:
LDAP_DOMAIN_ATTR_CATCHALL_ADDRESS(默认值为 mailDomainCatchallAddress)
LDAP_DOMAIN_ATTR_REPORT_ADDRESS(默认值为 mailDomainReportAddress)
LDAP_DOMAIN_ATTR_CONVERSION_TAG(默认值为 mailDomainConversionTag)
以某些其他方式完成从域到基本 DN 的映射时可能会出现一些特殊情况。为了容纳此类设置,URL 解析过程可以调用 MTA 映射。可使用以下通用格式的元字符序列完成此操作:
$|/mapping-name/ mapping-argument|
双引号 (") 将启动和终止调用。紧跟在 $ 后的字符是映射名称和变量之间的分隔符;应该选择不会与映射名称和变量中通常使用的字符值发生冲突的字符。
$R 元字符为 URL 提供了适当的过滤器。目的在于生成一个过滤器,该过滤器可以搜索可能包含特定用户或组的电子邮件地址的所有属性。要搜索的属性的列表来自于 configutil 参数 local.imta.mailaliases。如果未设置此参数,则将检查 local.imta.schematag configutil 参数,并根据它的值选择一组相应的默认属性,如下所示:
nms41 mail,mailAlternateAddress
ims50 mail,mailAlternateAddress,mailEquivalentAddress
local.imta.schematag 的值可以是以逗号分隔的列表。如果支持多种模式,则使用消除了复制功能的属性的组合列表。LDAP_SCHEMATAG MTA 选项专用于为 MTA 覆盖 local.imta.schematag 的设置。
此外,过滤器不但搜索原来提供的地址,而且还搜索具有相同本地部分但实际上是在域树(该域树是在标题为$V 元字符一节中的第二步保存的)中找到的域的地址。域树查找的重复性意味着两个地址可能不同。此附加检查由 option.dat 文件中的 DOMAIN_UPLEVEL MTA 选项的位 1(值为 2)来控制。设置位将启用附加地址检查。DOMAIN_UPLEVEL 的默认值为 0。
例如,假定域 siroe.com 显示在域树中。假设 Sun LDAP Schema 1 有效,要查找的地址是
u@host1.siroe.com
扩展 $R 和 ims50 schematag 得到的过滤器将类似于:
(|(mail=u@siroe.com) (mail=u@host1.siroe.com) (mailAlternateAddress=u@siroe.com) (mailAlternateAddress=u@host1.siroe.com) (mailEquivalentAddress=u@siroe.com) (mailEquivalentAddress=u@host1.siroe.com))
另一方面,如果将 DOMAIN_UPLEVEL 设置为 1 而不是 3,则过滤器将为:
(|(mail=u@host1.siroe.com) (mailAlternateAddress=u@host1.siroe.com) (mailEquivalentAddress=u@host1.siroe.com))
如果 URL 将要返回的属性的列表指定为 *,则将用 MTA 能够使用的属性的列表替换星号。此列表是由指定 MTA 所使用选项的各个 MTA 选项设置动态生成的。
此时,所得到的 URL 用于执行 LDAP 搜索。如果出现某种 LDAP 错误,处理将终止并指示临时故障(SMTP 中的 4xx 错误)。如果 LDAP 操作成功,但无法生成结果,则将检查通过 LDAP_DOMAIN_ATTR_CATCHALL_ADDRESS MTA 选项检索到的域的替换邮件地址属性。如果设置了该属性,则该属性的值将替换当前地址。
如果未设置此替换邮件地址属性,则检查通过 LDAP_DOMAIN_ATTR_SMARTHOST MTA 属性检索到的域的智能主机属性。如果设置了该属性,则创建
@smarthost: user@domain
格式的地址,并且别名处理将以此结果成功终止。此外,通过 LDAP_DOMAIN_ATTR_CONVERSION_TAG MTA 选项获得的域的转换标记(如果存在)将被附加到地址中,以便在转发给智能主机之前可以先完成转换操作。如果该域不存在替换邮件地址或智能主机,则此别名 URL 的处理将不会成功终止。
LDAP 搜索返回了结果之后,它将验证其中是否只有一个条目。如果具有多个条目,则检查每个条目以确定其是否具有用户或组的正确对象类、不可删除的状态以及具有用户的 UID。忽略未通过此检查的条目。如果通过此检查将多个条目的列表减少到只有一个条目,则处理将继续进行。如果没有减少,将返回一个复制或模糊目录错误。
ALIAS_URL0 检查是针对常规用户或托管域中的用户的。如果此检查失败,还会进行虚名域检查。使用以下别名 URL 可以完成此操作:
ALIAS_URL1=ldap:///$B?*?sub?(&(msgVanityDomain=$D)$R)
最后,需要在 mailAlternateAddress 属性中检查 @host 格式的替换邮件地址。此格式的通配符允许在托管域和虚名域中使用,因此地址的正确别名 URL 为:
ALIAS_URL2=ldap:///$1V?*?sub?(mailAlternateAddress=@$D)
在直接 LDAP 模式中,+* 子地址替换机制始终用于处理替换邮件地址,但被替换的字符串仅为子地址,而非整个本地部分。这种情况已改变,使用这种构造时原始地址的整个本地部分将作为子地址插入替换邮件地址。
例如,给定形式为 foo+bar@domain.com 的地址(domain.com 域中没有本地用户 foo)以及 domain.com 的替换邮件地址 bletch+*@example.com,最终得到的地址为 bletch+foo+bar@example.com。而原来是 bletch+bar@example.com。
可以通过若干顺序独立的阶段完成 LDAP 别名结果的处理。以下各节介绍了这些阶段。
如果别名搜索成功,将检查条目的对象类以确保其包含用户或组的一组相应的对象类。通常,用户和组的所需对象类的可能设置由有效的模式来确定。这由 local.imta.schematag 设置确定。
表 9–1 显示了从各种 schematag 值得到的用户对象类和组对象类。
表 9–1 从各个 schematag 值得到的对象类
schematag |
用户对象类 |
组对象类 |
---|---|---|
inetMailRouting+inetmailuser |
inetMailRouting+inetmailgroup |
|
mailRecipient + nsMessagingServerUser |
mailGroup |
|
inetLocalMailRecipient+inetmailuser |
inetLocalMailRecipient + inetmailgroup |
很难编码该表中的信息(如处理其余的模式标记)。但是,在 option.dat 文件中还有两个 MTA 选项 LDAP_USER_OBJECT_CLASSES 和 LDAP_GROUP_OBJECT_CLASSES,可以设置这两个选项以分别指定用户对象类集和组对象类集。
例如,模式标记设置 ims50,nms41 将等价于以下选项设置:
LDAP_USER_OBJECT_CLASSES=inetLocalMailRecipient+inetmailuser, mailRecipient+nsMessagingServerUser
LDAP_GROUP_OBJECT_CLASSES=inetLocalMailRecipient+inetmailgroup, mailGroup
如果 LDAP 结果不具有适用于用户或组的一组正确的对象类,将只会忽略该结果。MTA 还确定其是否处理用户或组,并保存该信息。稍后将重复使用此处保存的信息。
请注意,此处所述的对象类设置还用于构建实际的 LDAP 搜索过滤器,该过滤器可用于检查以查看条目是否具有用户或组的正确对象类。可以通过 $K 元字符访问该过滤器。该过滤器还存储在 MTA 的配置内,以备通道程序使用,并作为 LDAP_UG_FILTER 选项(在使用命令 imsimta cnbuild -option 时)写入到 MTA 选项文件 option.dat 中。该选项只写入到文件中。MTA 不通过选项文件读取该选项。
接下来检查条目的状态。有两个状态属性,一个用于常规条目,另一个专用于邮件服务。
表 9–2 介绍了在生效的模式标记条目中要检查的常规和特定于邮件的用户或组属性
表 9–2 要进行检查的属性
schematag |
类型 |
General |
邮件特定 |
---|---|---|---|
sims40 |
用户 |
inetsubscriberstatus |
mailuserstatus |
sims40 |
组 |
无 |
inetmailgroupstatus |
nms41 |
用户 |
无 |
mailuserstatus |
nms41 |
组 |
无 |
无 |
Messaging Server 5.0 |
用户 |
inetuserstatus |
mailuserstatus |
Messaging Server 5.0 |
组 |
无 |
inetmailgroupstatus |
如果需要,option.dat 文件中的LDAP_USER_STATUS 和 LDAP_GROUP_STATUS MTA 选项可分别用于选择用户和组的备用常规状态属性。特定于邮件的用户和组状态属性分别由 LDAP_USER_MAIL_STATUS 和 LDAP_GROUP_MAIL_STATUS MTA 选项控制。
起控制作用的另一个因素是域本身的状态(LDAP_DOMAIN_ATTR_STATUS 和 LDAP_DOMAIN_ATTR_MAIL_STATUS)。总共有四种状态属性。以下列顺序考虑这些属性的组合:
域状态
域邮件状态
用户或组状态
邮件用户或邮件组状态
这些属性中的第一个属性,如果指定了除“活动”状态以外的其他状态,则优先于所有其他属性。其他允许的状态值包括“非活动”、“已删除”、“已移除”、“已禁用”、“保留”和“超过配额”。“保留”、“已禁用”和“已移除”状态仅可以用于邮件域、邮件用户或邮件组。“超过配额”状态仅能指定为邮件域或邮件用户状态。
如果不存在特定状态属性,则所有状态都默认为“活动”。未知状态值将被解释为“非活动”。
组合使用四种状态时,可能出现用户或组的下列状态:“活动”、“非活动”、“已删除”、“已移除”、“已禁用”、“保留”和“超过配额”。活动状态会使别名处理继续进行。不活动或超过配额状态将会立即拒绝具有 4xx(临时)错误的地址。已删除、已移除和已禁用状态将会立即拒绝具有 5xx(永久)错误的地址。就状态处理而言,可以将“保留”状态视为“活动”状态,但它设置了内部标志,以便以后发送选项,此处所有选项都将被仅包含一个“保留”条目的选项列表覆盖。
下一步将考虑条目的 UID。UID 可用于各种目的,它必须是所有用户条目的一部分,并且可以包含在组条目中。不具有 UID 的用户条目将被忽略,并且该别名 URL 的处理也会不成功终止。托管域中条目的 UID 可以包含实际 UID、分隔符以及域。MTA 只使用实际 UID,因此会使用通过 option.dat 文件中的 LDAP_DOMAIN_ATTR_UID_SEPARATOR MTA 选项获得的域分隔符来删除其余部分(如果存在)。
万一使用了非 uid 的某个属性来存储 UID,则可使用 LDAP_UID MTA 选项来强制使用该属性。
接下来检查用于指定一个或多个邮件捕获地址的 LDAP 属性。必须使用 LDAP_CAPTURE MTA 选项指定用于此目的的属性。没有默认值。该属性的值将被视为地址,生成一个特殊的“捕获”通知,并将该通知发送到以附件方式包含当前邮件的这些地址。此外,如果捕获地址用于初始化地址反向高速缓存,该地址以后将显示为信封 from: 地址。
接下来将考虑主地址和附加到用户条目的所有别名。该信息可用于初始化地址反向高速缓存。此操作在当前地址转换进程中不起作用。首先,考虑主地址、个人名称、收件人限制、收件人截止日期和源块限制属性。主地址通常存储在 "mail" 属性中;另一属性可以通过相应地设置 LDAP_PRIMARY_ADDRESS MTA 选项来指定。(当然,主地址的反向结果与其自身相同。)所有其他属性都没有默认属性。如果要使用这些属性,您必须通过 LDAP_PERSONAL_NAME(请参见休假自动回复属性)、 LDAP_RECIPIENTLIMIT、LDAP_RECIPIENTCUTOFF(请参见对邮件收件人进行限制)和 LDAP_SOURCEBLOCKLIMIT(请参见指定绝对邮件大小限制)MTA 选项指定这些属性。此时还要考虑相应的域级别收件人限制、收件人截止日期和源块限制属性。用户级别设置将完全覆盖所有域级别设置。
接下来,将考虑所有次地址,并为每个地址设置一个高速缓存条目。次地址包括两类:一类进行地址反向,另一类则不进行。必须考虑这两类地址以便正确初始化地址反向高速缓存,因为在所有情况下都需要检查邮件捕获请求。
进行反向的辅助地址通常存储在 mailAlternateAddress 属性中。另一属性可以通过设置 LDAP_ALIAS_ADDRESSES MTA 选项来指定。不进行反向的辅助地址通常存储在 mailEquivalentAddress 属性中。另一属性可以通过 LDAP_EQUIVALENCE_ADDRESSES MTA 选项来指定。
现在来考虑 mailhost 和 mailRoutingAddress 属性。可以使用 LDAP_MAILHOST 和 LDAP_ROUTING_ADDRESS MTA 选项分别覆盖要使用的实际属性。这些属性协同工作以确定此时这些属性是否应作用于地址或转发给其他系统。
第一步要确定 mailhost 对于该条目是否有意义。执行作用于条目的有效传送选项的初步检查,以查看该条目是否为邮件主机特定的。如果不是,则省略 mailhost 检查。要了解该检查的执行方法,请参见传送选项处理(尤其是 # 标志)的说明。
就用户条目而言,mailhost 属性必须标识本地系统,才能使该属性对本地系统起作用。将 mailhost 属性与 local.hostname configutil 参数的值相比较,并与 local.imta.hostnamealiases configutil 参数指定的值的列表相比较。如果出现任一匹配,则 mailhost 属性将被视为本地主机标识。
成功匹配意味着别名可以在本地起作用,并且别名处理将继续进行。不成功匹配则意味着需要将邮件转发给邮件主机才能起作用。将构建格式为
@mailhost:user @domain
的新地址,该地址将成为别名扩展操作的结果。
根据该条目是用户还是组,对缺少 mailhost 属性情况的处理有所不同。就用户而言,邮件主机是必需的,因此如果不存在 mailhost 属性,则格式为
@smarthost: user@domain
的新地址可以使用通过 LDAP_DOMAIN_ATTR_SMARTHOST MTA 选项确定的域的智能主机来构造。如果该域不存在智能主机,则会报告错误。
另一方面,组不需要邮件主机,因此缺少邮件主机将被解释为意味着可以随处扩展组。因此别名处理将继续进行。
mailRoutingAddress 属性将添加一个最终难题。如果该问题存在,则别名处理将终止,结果为 mailRoutingAddress。但是,如果邮件主机存在,会将该问题添加到作为源路由的 mailRoutingAddress 中。
接下来,考虑 mailMsgMaxBlocks 属性。首先,使用通过 LDAP_DOMAIN_ATTR_BLOCKLIMIT MTA 选项返回的域块限制将其最小化。如果已知当前邮件的大小超过限制,别名处理将终止,产生一个超过大小的错误。如果大小未知或未超过限制,则会存储该限制并在稍后检查邮件自身时重新检查限制。可以用 LDAP_BLOCKLIMIT MTA 选项覆盖 mailMsgMaxBlocks 的使用。
下一步将访问并保存若干属性。最终,这些属性将被写入到队列文件条目中以供 ims_master 通道程序使用,然后该程序将使用这些属性来更新存储的用户信息高速缓存内容。如果未找到单个用户的属性,可以使用域级别属性设置默认属性。
如果 LDAP 条目适用于组而不适用于用户,或者如果 LDAP 条目来自别名高速缓存而不是来自 LDAP 目录,则跳过此步骤。后一个标准的逻辑是不需要经常更新此信息,如果需要更新,应使用别名高速缓存提供合理的标准。检索到的属性的名称由各个 MTA 选项设置。
表 9–3 显示了设置检索到的磁盘配额和邮件配额属性的 MTA 选项。
表 9–3 设置检索到的磁盘配额和邮件配额属性的 MTA 选项
MTA 选项 |
属性 |
---|---|
mailMsgQuota |
接下来,将存储若干属性,以备稍后可能与元字符替换结合使用。
表 9–4 显示了 MTA 属性、默认属性和元字符。
表 9–4 MTA 选项、默认属性和元字符
MTA 选项 |
默认属性 |
元字符 |
---|---|---|
mailProgramDeliveryInfo |
$P |
|
mailDeliveryFileURL |
$F |
|
没有默认属性 |
$1E $1G $E |
|
没有默认属性 |
$2E $2G $G |
|
LDAP_SPARE_3 |
没有默认属性 |
$3E $3G |
LDAP_SPARE_4 |
没有默认属性 |
$4E $4G |
LDAP_SPARE_5 |
没有默认属性 |
$5E $5G |
还包含用于其他属性的备用插槽,以便您可以使用这些插槽构建自定义地址扩展设备。
接下来,将把与 mailconversiontag 属性相关联的所有值添加到当前的一组转换标记中。可以使用 LDAP_CONVERSION_TAG MTA 选项更改该属性的名称。如果存在与该域的 mailDomainConversionTag 属性相关联的任何值,也将附加这些值。
接下来,将检查 mailDeliveryOption 属性。可以用 LDAP_DELIVERY_OPTION MTA 选项更改该属性的名称。这是一个多值选项,该选项的各个值确定了由别名转换进程生成的地址。此外,用于用户和组的允许值是不同的。通用允许的值包括 program、forward 和 hold。仅限用户使用的值包括 mailbox、native、unix 和 autoreply。仅限组使用的值包括 members、members_offline 和 file。
mailDeliveryOption 属性到相应地址的转换由 DELIVERY_OPTIONS MTA 选项来控制。该选项不仅指定每个允许的 mailDeliveryOption 值生成哪些地址,而且还指定允许的 mailDeliveryOption 值以及每个值是否适用于用户或/和组。
该选项的值由 deliveryoption=template 对的以逗号分隔的列表组成,每对都具有一个或多个可选单字符前缀。
DELIVERY_OPTIONS=*mailbox=$M%$\\$2I$_+$2S@ims-ms-daemon, \ &members=*, \ *native=$M@native-daemon, \ /hold=@hold-daemon:$A, \ *unix=$M@native-daemon, \ &file=+$F@native-daemon, \ &@members_offline=*, \ program=$M%$P@pipe-daemon, \ #forward=**, \ *^!autoreply=$M+$D@bitbucket
每个传送选项对应于可能的 mailDeliveryOption 属性值,相应的模板使用元字符替换方案(与 URL 处理使用的相同)来指定结果地址。
表 9–5 显示了可用于 DELIVERY_OPTIONS 选项的单字符前缀。
表 9–5 用于 DELIVERY_OPTIONS MTA 选项中的选项的单字符前缀。
字符前缀 |
说明 |
---|---|
@ |
设置一个标志,表明需要将邮件重定向至重新处理通道。放弃处理当前用户/组。忽略源自重新处理通道的邮件的标志。 |
* |
传送选项应用于用户。 |
& |
传送选项应用于组。 |
$ |
设置一个标志,表明要延迟该用户或组的扩展。 |
^ |
设置一个标志,表明应检查休假开始时间和结束时间以查看此传送选项是否真正有效。 |
# |
设置一个标志,表明在条目的指定邮件主机中不需要进行此传送选项的扩展。即后面的条目独立于邮件主机。这将使 MTA 进行检查,以查看给定的用户或组的所有传送选项是否均独立于邮件主机。如果满足此条件,则 MTA 可以立即操作此条目,而无需将此邮件转发给邮件主机。 |
/ |
设置一个标志,该标记会保留由该传送选项生成的所有地址。包含这些收件人地址的邮件文件将具有 .HELD 扩展名。 |
! |
设置一个标志,表明自动回复操作应该由 MTA 进行内部处理。只有在自动回复选项中使用此前缀才有意义。选项的值应将邮件定向到 bitbucket 通道。 |
如果 * 和 & 都不存在,则将传送选项应用于用户和组中。
已经添加了若干附加元字符以支持使用此 MTA 的 URL 模板的新增功能。这些元字符包含:
表 9–6 显示了其他元字符以及在传送选项中使用这些元字符的说明。
表 9–6 传送选项中使用的附加元字符
元字符 |
说明 |
---|---|
$\ |
强制后续文本转为小写。 |
$^ |
强制后续文本转为大写。 |
$_ |
不对后续文本执行大小写转换。 |
$nA |
插入地址的第 n 个字符。第一个字符是字符 0。如果省略 n,则替换整个地址。这适用于构建自动回复目录路径。 |
$D |
插入地址的域部分。 |
$nE |
插入第 n 个备用属性的值。如果省略 n,则使用第一个属性。 |
$F |
插入传送文件的名称(mailDeliveryFileURL 属性)。 |
$nG |
插入第 n 个备用属性的值。如果省略 n,则使用第二个属性。 |
$nH |
在从 0 计数的原地址中插入域的第 n 个组件。如果省略 n,则默认值为 0。 |
$nI |
插入与别名相关联的托管域。该元字符接受整数参数 n,其语义如表 9–7 所述。 |
$nJ |
插入从 0 计数的托管域的第 n 部分。n 的默认值为 0。 |
$nO |
插入与当前地址关联的源路由。该元字符接受整数参数 n,其语义如表 9–7 所述。 |
$K |
插入与用户或组的对象类相匹配的 LDAP 过滤器。请参见 LDAP_UG_FILTER 仅用于输出的 MTA 选项的说明。 |
$L |
插入地址的本地部分。 |
$nM |
插入 UID 的第 n 个字符。第一个字符是字符 0。如果省略 n,则替换整个 UID。 |
$P |
插入程序名称(通过 mailProgramDeliveryInfo 属性)。 |
$nS |
插入与当前地址关联的子地址。该元字符接受整数参数 n,其语义如表 9–7 所述。 |
$nU |
插入当前地址的邮箱部分的未用引号引起格式的第 n 个字符。第一个字符是字符 0。如果省略 n,则替换整个未用引号引起的邮箱。 |
$nX |
插入邮件主机的第 n 个组件。如果省略 n,则插入整个邮件主机。 |
表 9–7 显示整数参数如何控制 $nI 和 $nS 元字符的性能。
表 9–7 控制 $nI 和 $nS 元字符的性能修改的整数
整数 |
性能说明 |
---|---|
0 |
如果没有可用的值,则失败(默认值)。 |
1 |
如果有可用的值,则插入该值。如果没有,则不插入任何值。 |
2 |
如果有可用的值,则插入该值。如果没有可用值,则不插入任何值,并删除前面的字符(ims-ms 通道需要此特殊性能)。 |
3 |
如果有可用的值,则插入该值。如果没有可用值,则不插入任何值并忽略后面的字符。 |
除这些元字符之外,表 9–8 还显示了两个特殊的模板字符串。
表 9–8 特殊的模板字符串
特殊的模板字符串 |
说明 |
---|---|
* |
执行组扩展。该值对于用户条目无效。 |
** |
扩展由 LDAP_FORWARDING_ADDRESS MTA 选项命名的属性。默认值设置为 mailForwardingAddress。 |
以组扩展为例,如果将用户的 mailDeliveryOption 值设置为 mailbox,将形成一个新地址,该地址由以下几部分组成:已拆开的 UID、百分比符号(后面跟托管域,如果有托管域)、加号(后面跟子地址,如果指定了子地址)和最后的 @ims-ms-daemon。
如果此时活动传送选项列表为空,则为用户激活列表中的第一个选项(通常为邮箱),并为组激活列表中的第二个选项(通常为成员)。
读取传送选项列表后,将检查开始和结束日期。有两个属性,其名称分别由 LDAP_START_DATE(默认值为 vacationStartDate)和 LDAP_END_DATE(默认值为 vacationEndDate)MTA 选项控制。如果一个或多个活动传送选项指定了 ^ 前缀字符,则将针对当前日期检查这些选项的值。如果当前日期超出这些选项所指定的范围,将从活动集中删除带有 ^ 前缀的传送选项。有关更多信息,请参见休假自动回复属性。
LDAP_OPTIN MTA 选项可用于指定包含垃圾邮件过滤器选定值的列表的 LDAP 属性。如果指定了该选项并且存在该属性,则将其附加到当前垃圾邮件过滤器选定列表中。域级别属性(由 LDAP_DOMAIN_ATTR_OPTIN MTA 选项设置)设置的所有值也将被附加到列表中。
LDAP_PRESENCE MTA 选项可用于指定 URL,解析此 URL 后可以返回有关用户的当前信息。如果指定了该选项并且存在该属性,则会保存该属性的值以备与 Sieve 存在测试结合使用。如果用户条目不存在值,则会将 LDAP_DOMAIN_ATTR_PRESENCE MTA 选项所设置的域级别属性用作此 URL 的源。
接下来将检查应用于此条目的 Sieve 过滤器的 mailSieveRuleSource 属性。如果存在该属性,此时将分析并保存该属性。该属性的值的两种可能的格式为包含一个完整 Sieve 脚本的单个值或每个值包含一段 Sieve 脚本的多个值。后一种格式由 Web 过滤器构造界面生成。特殊代码用于对这些值进行排序并将其正确组合在一起。
特别是,通过使用 LDAP_FILTER MTA 选项可以覆盖 mailSieveRuleSource 属性的使用。
接下来将检查 mailDeferProcessing 属性。通过使用 LDAP_REPROCESS MTA 选项可以更改此属性。如果存在该属性并被设置为 no,则通常将继续进行处理。但如果该属性被设置为 yes,并且当前源通道不是重新处理通道,则该条目的扩展将被终止并且原 user@domain 地址将只被排入到重新处理通道中。如果不存在该属性,将检查与传送选项处理相关联的延迟处理字符前缀的设置。(请参见传送选项处理一节,用户默认值为 no。组的默认设置由 MTA 选项 DEFER_GROUP_PROCESSING 控制,其默认值为 1(是)。此时将结束用户条目的别名处理。
许多附加属性与组扩展相关联,此时必须对这些属性进行处理。这些属性的名称都可以通过各个 MTA 选项进行配置。
表 9–9 列出了默认属性名、设置属性名的 MTA 选项和 MTA 处理属性的方式。此表中元素的排序显示了处理各个组属性的顺序。该排序对于正确操作极为重要。
表 9–9 组扩展默认属性和用于设置属性名称的 MTA 选项
在组扩展作为 SMTP EXPN 命令一部分的特殊情况下,将检查一个最终属性:mgmanMemberVisibility 或可扩展属性。LDAP_EXPANDABLE MTA 选项可用于选择要检查的其他属性。可能的值包括:anyone,表示任何人都可以扩展组;all 或 true,表示用户必须先通过 SASL 成功验证后才允许扩展;none,表示不允许扩展。不可识别的值被解释为 none。如果不存在该属性,EXPANDABLE_DEFAULT MTA 选项将控制是否允许扩展。
以此方式缓存的别名条目类似于域条目。控制别名高速缓存的 MTA 选项为 ALIAS_ENTRY_CACHE_SIZE(默认值为 1000 个条目)和 ALIAS_ENTRY_CACHE_TIMEOUT(默认值为 600 秒)。给定别名的整个 LDAP 返回值保留在高速缓存中。
别名条目的负缓存由 ALIAS_ENTRY_CACHE_NEGATIVE MTA 选项控制。非零值启用别名匹配的缓存失败。零值将其禁用。默认情况下,禁用别名条目的负缓存。理论上可以重复说明无效地址,实际上不可能经常发生。此外,负缓存可能会影响及时识别已添加到目录中的新用户。但是,在频繁使用虚名域的情况下,站点应该考虑重新启用别名的负缓存。由 ALIAS_URL0 指定的 URL 所执行的搜索不大可能会成功。
使用直接 LDAP 的地址反向以 USE_REVERSE_DATABASE 值 4 开始,该值禁用所有反向数据库。然后,它将构建于先前讨论过的路由设备上。特别是,在以前的版本中,它以反向 URL 说明的格式开始:
REVERSE_URL=ldap:///$V?mail?sub?$Q
$V 元字符已在别名 URL 的上下文中进行了介绍。但是,$Q 元字符(在功能上与在别名 URL 中使用的 $R 元字符非常类似)专用于地址反向。与 $R 不同,它会生成一个过滤器,该过滤器搜索包含地址(为地址反向的候选项)的属性。要搜索的属性列表来自 MTA 选项 LDAP_MAIL_REVERSES。如果未设置该选项,将检查 local.imta.schematag configutil 参数,并根据该参数的值选择一组相应的默认属性。
表 9–10 显示了所选择的 local.imta.schematag 值和默认属性。
表 9–10 local.imta.schematag 值和属性
模式标记值 |
属性 |
---|---|
sims40 |
mail,rfc822mailalias |
nms41 |
mail,mailAlternateAddress |
ims50 |
mail,mailAlternateAddress |
但是,不应再继续使用 $Q。为了使邮件捕获和其他功能可以正常工作,已增强了地址反向功能以注意除了出现匹配的事实之外所匹配的属性。这表示 $R 应该用于指定过滤器而不是 $Q。此外,还添加了 $N 元字符,该元字符将返回地址反向感兴趣的属性的列表。得到的选项值为:
REVERSE_URL=ldap:///$V?$N?sub?$R
通常,local.imta.schematag 可以是以逗号分隔的列表。如果支持多种模式,则使用消除了复制功能的属性的组合列表。
此外,过滤器不但搜索原来提供的地址,而且还搜索具有相同本地部分但实际上是在 域树(保存在重写规则机制的步骤 2 中)中找到的域的地址。域树查找的重复性意味着两个地址可能不同。
例如,假定域 siroe.com 显示在域树中,并且 MTA 查找地址:
u@host1.siroe.com
扩展 $R 和 ims50 模式标记得到的过滤器将类似于:
(|(mail=u@siroe.com) (mail=u@host1.siroe.com) (mailAlternateAddress=u@siroe.com) (mailAlternateAddress=u@host1.siroe.com) (mailEquivalentAddress=u@siroe.com) (mailEquivalentAddress=u@host1.siroe.com)) |
请注意,反向 URL 明确指定该属性包含规范的地址。通常,该属性将是邮件属性。
构建 URL 之后,将执行 LDAP 搜索。如果搜索成功,返回的第一个属性值将替换原始地址。如果搜索不成功或出现错误,则保留原始地址不变。
由于执行地址反向操作的频率,特别是给出可以显示在邮件标题中的一系列地址,以及目录查询所涉及的损耗,因此负和正结果都需要被缓存。使用内存中的开放链的动态扩展散列表可以实现此操作。通过 REVERSE_ADDRESS_CACHE_SIZE MTA 选项(默认值 100000)可以设置高速缓存大小的最大值,通过 REVERSE_ADDRESS_CACHE_TIMEOUT MTA 选项(默认值为 600 秒)可以设置高速缓存中的条目的超时值。高速缓存实际上存储地址本身,而不存储 LDAP URL 和 LDAP 结果。
异步查找无需在内存中存储完整的大量 LDAP 结果,从而避免在一些情况下可能出现的性能问题。MTA 提供了通过 MTA 异步完成执行各种类型的查找的功能。
异步 LDAP 查找的使用由 MTA 选项 LDAP_USE_ASYNC 控制。此选项是按位编码的值。每一位(如果设置)可结合 MTA 中具体的 LDAP 使用方法来进行 LDAP 异步查找。
表 9–11 显示了 option.dat 文件中的 LDAP_USE_ASYNC MTA 属性的位和值设置。
表 9–11 LDAP_USE_ASYNC MTA 选项的设置
位 |
值 |
LDAP 的具体使用 |
---|---|---|
0 |
1 |
LDAP_GROUP_URL1 (mgrpDeliverTo) URL |
1 |
2 |
LDAP_GROUP_URL2 (memberURL) URL |
2 |
4 |
LDAP_GROUP_DN (UniqueMember) DN |
3 |
8 |
auth_list、moderator_list、sasl_auth_list 和 sasl_moderator_list 非位置列表参数 URL |
4 |
16 |
cant_list 和 sasl_cant_list 非位置列表参数 URL |
5 |
32 |
originator_reply 非位置列表参数 URL |
6 |
64 |
deferred_list、direct_list、hold_list 和 nohold_list 非位置列表参数 URL |
7 |
128 |
username_auth_list、username_moderator_list 和 username_cant_list 非位置列表参数 URL |
8 |
256 |
别名文件列表 URL |
9 |
512 |
别名数据库列表 URL |
10 |
1024 |
LDAP_CANT_URL (mgrpDisallowedBroadcaster) 外层 URL |
11 |
2048 |
LDAP_CANT_URL 内层 URL |
12 |
4096 |
LDAP_AUTH_URL (mgrpAllowedBroadcaster) 外层 URL |
13 |
8192 |
LDAP_AUTH_URL 内层 URL |
14 |
16384 |
LDAP_MODERATOR_URL (mgrpModerator) URL |
LDAP_USE_ASYNC MTA 选项的默认值为 0,表示默认情况下禁用异步 LDAP 查找。
为了启用直接 LDAP,需要设置以下 MTA 选项:
ALIAS_MAGIC=8764 ALIAS_URL0=ldap:///$V?*?sub?$R USE_REVERSE_DATABASE=4 USE_DOMAIN_DATABASE=0 REVERSE_URL=ldap:///$V?mail?sub?$Q |
如果要支持虚名域,必须设置以下附加选项:
DOMAIN_MATCH_URL=ldap:///$B?msgVanityDomain?sub? \ (msgVanityDomain=$D) ALIAS_URL1=ldap:///$B?*?sub? (&(msgVanityDomain=$D)$R) ALIAS_URL2=ldap:///$1V?*?sub?(mailAlternateAddress=@$D) |
请注意,这些选项中的最后一个选项还处理托管域以及虚名域中的通配符的本地部分的情况。如果需要支持通配符的本地部分,但不需要支持虚名域,则应该使用以下选项:
ALIAS_URL1=ldap:///$V?*?sub?&(mailAlternateAddress=@$D)
需要删除 MTA 配置文件 (imta.cnf) 中 ims-ms 通道定义中的 filter ssrd:$A 子句。