SMTP 分类程序

 

上一次修改主题: 2005-05-23

SMTP 分类程序(也称分类程序)是 Exchange Server 2003 传输引擎的一个组件。当邮件提交到传输进程时,分类程序使用邮件中的头信息来查询 Active Directory,以了解有关必须如何传递邮件以及邮件必须传递至何处的信息。例如,分类程序根据 SMTP 地址(如 Ted@contoso.com)识别出该用户的邮箱所在的 Exchange Server 2003 服务器,并确定如何将邮件路由到该服务器。分类程序还展开通讯组列表,并对邮件应用针对每个用户的限制。有关 SMTP 传输引擎的体系结构的详细信息,请参阅 SMTP 传输体系结构

分类程序依赖 DSAccess 来获取应当用来查找的 Active Directory 服务器列表。但是,与 DSProxy 类似,在获取该服务器列表后,分类程序便开始使用它自己的机制来从 Active Directory 中读取信息。

有两种类型的分类程序:一种是随同 IIS SMTP 传输堆栈一起安装的基础分类程序,另一种是随同 Exchange 一起安装的 Exchange 分类程序。基础分类程序是在 Aqueue.dll 中实现的。基础分类程序执行一些基本的功能,如使用 LDAP 查询在 Active Directory 中解析收件人信息。它还执行高效的批处理,例如,将许多查询作为一个查询发送。基础分类程序还执行通讯组列表展开操作。它具有 SMTP 转发功能,并触发分类程序服务器事件。Exchange Server 2003 通过安装一个名为 PhatCat.dll 的 DLL 来增强基础分类程序的功能。PhatCat.dll 增加基础分类程序所提供的功能。它不是取代基础分类程序的默认功能,而是扩展基础分类程序的功能来供自己使用。

Exchange 分类程序的体系结构如下图所示。

4360e0d2-8ca8-42ba-af22-017153c405f7

邮件分类和 Active Directory

当邮件进入分类前队列中时,分类程序选择邮件进行处理。分类程序通过在 Active Directory 的 proxyAddresses 属性中搜索地址来解析邮件发件人。分类程序还通过在 Active Directory 的 proxyAddresses 属性中搜索地址来解析邮件收件人。在收件人列表中包含通讯组的情况下,如果可以在服务器上展开通讯组,便会展开该组以列出这些成员。否则,Exchange 会将邮件传输到通讯组中指定用于通讯组展开的展开服务器。

分类程序还通过检查来确认邮件属性存在于 Active Directory 中,并将邮件属性标记为 SMTP 地址。分类程序还负责应用针对每个发件人和每个收件人的限制,然后相应地标记收件人。然后分类程序针对每个域将出站和入站 Internet 邮件格式设置应用于发件人和收件人,然后对 IMAIL 转换属性设置相应的标记。当在 Exchange 系统管理器中选择“全局设置”容器时,可以配置邮件格式设置。

对于要在本地传递的邮件,分类程序在邮件上设置针对每个收件人的属性,以指示每个收件人的目标服务器,从而将收件人标记为本地收件人。该属性的通常格式为收件人服务器的完全限定域名 (FQDN)。收件人的 homeMDB 属性指示收件人邮箱所在的服务器。

分类程序的工作是作为高级排队引擎的分类程序事件部分内部的一系列传输事件接收器来运行的。基础分类程序包含十个事件接收器。下面的七个事件接收器用于查询 Active Directory:

  • Register 在邮件分类的开始阶段调用该事件接收器以使其初始化。
  • BeginMessageCategorization 对于每个提交到分类程序的邮件都调用该事件接收器一次。
  • EndMessageCategorization 在指示邮件分类结束时调用该事件接收器。
  • BuildQuery 对于每个必须在目录中进行验证的用户,都调用该事件接收器一次。
  • BuildQueries 对于每个批查找操作都调用该事件接收器一次。在上述每一种情况中,分类程序都为用户构造与 LDAP 兼容的筛选器。
  • SendQuery 该事件接收器发送批查找命令。它在 Request 属性下运行目录服务器工作,并在目录服务器上执行异步的 LDAP 查找。
  • SortQueryResult 该事件接收器将从 Active Directory 返回的结果与各个用户进行匹配。

下面的三个事件接收器是在每个用户的基础上使用的,并在目录服务后查找事件之后使用:

  • ProcessItem 该事件接收器解析地址。例如,如果本地的 MAPI 客户端提交邮件,MAPI 客户端将解析其他所有地址,如 X.400、X.500 DN、Legacy-Exchange-DN 以及 SMTP 地址,并在邮件上恢复其原有的形式。
  • ExpandItem 该事件接收器可为邮件添加更多收件人,例如,在执行邮件日志记录、通讯组展开以及内容转换时都可执行此操作。这是添加成员的服务器事件,例如 SMTP 转发过程中的展开操作就是这样的事件。
  • CompleteItem 该事件接收器在其他所有分类程序事件接收器都完成了其工作后才执行处理。此事件接收器采用之前的事件接收器返回的状态代码,并将这些代码与电子邮件的收件人对应起来。然后错误代码将引起高级排队引擎为受影响的收件人生成未送达报告 (NDR)。

PhatCat.dll 中的 Exchange 分类程序通过添加下面三个事件接收器来扩展 IIS 分类程序:

  • Register Sink 该事件接收器可以初始化 Exchange 分类程序组件,但它还可以初始化 DSAccess、路由引擎以及存储驱动程序代码。如果其中的任何一个失败,那么 PhatCat.dll 将无法对自身进行初始化。
  • BuildQuery 该事件接收器可验证用户是否驻留在 DSAccess 缓存中。如果验证结果是肯定的,将返回 ICategorizerItemAttributes 对象。这使得 IIS 分类程序不必获得目录服务查找代码。接下来要处理的是 ProcessItem 事件。
  • ProcessItem Exchange PhatCat 具有一个特殊的代码来处理特殊情况下的联系人和一次性事件。在这种情况下,只有上下文的目标地址添加到电子邮件中。