Exchange Server 2003 体系结构中的 Exchange MTA

 

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

Exchange MTA 是 Exchange Server 2003 的核心组件,它负责所有非 SMTP 的邮件传输。这包括向通过 X.400 连接器连接起来的外部 X.400 邮件系统和 Exchange 服务器的邮件传输。向非 Exchange 邮件系统(例如,Lotus Notes 和 Domino 或 Microsoft Exchange - Novell GroupWise 连接器)的邮件传输由 Exchange MTA 通过基于 MAPI 的连接器(例如,Microsoft Exchange - Lotus Notes 连接器或 Microsoft Exchange - Novell GroupWise 连接器)进行控制。Exchange MTA 还负责与 Exchange Server 5.5 进行基于远程过程调用 (RPC) 的通信。在运行 Exchange Server 2003 的所有服务器上实现 Exchange MTA 是最佳选择。

Exchange MTA 是在一个名为 Microsoft Exchange MTA Stacks 的 Microsoft Windows 服务中实现的。在“服务”工具中显示 Microsoft Exchange MTA Stacks 服务的属性,并单击“依存关系”选项卡时,将发现 Microsoft Exchange MTA Stacks 服务依赖于系统助理。系统助理驻留目录服务访问 (DSAccess) 组件,MTA 使用该组件从 Active Directory 获得收件人和配置信息。但是,系统助理不是唯一的依赖项,如下图所示。

6e893144-ee28-4a8d-9fd3-c5b73ca19b0c

Exchange MTA 与以下组件通信:

  • Active Directory 与 Active Directory 通信是必需的,这是因为 MTA 配置对象和 X.400 连接器对象驻留在 Active Directory 的配置目录分区中。如果 Active Directory 不可访问,则 Exchange MTA 无法启动。
  • 注册表数据库 并非所有 MTA 配置设置都是在 Active Directory 中进行维护的。Microsoft Exchange MTA Stacks 服务的重要设置还会存储在服务器的注册表内的以下位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSExchangeMTA。本部分解释的许多设置都可以在“Parameters”项下面找到。通过使用注册表编辑器手动配置注册表参数,可以对 MTA 性能进行微调。
    Caution警告:
    错误地使用注册表编辑器可能导致严重的问题,甚至可能需要重新安装操作系统。Microsoft 无法保证错误使用注册表编辑器所导致的问题可以得到解决。请自行承担使用注册表编辑器的风险。
  • SMTP 服务 在 Exchange Server 2003 中,Exchange MTA 不执行邮件路由。邮件路由是路由引擎的任务,该引擎是 SMTP 服务的一部分。Exchange MTA 通过 Mtaroute.dll 与路由引擎通信,以便作出它的路由决定。
    注意,与 SMTP 服务的通信是双向的。MTA 出于邮件路由目的而与 SMTP 服务进行通信。当路由拓扑发生更改时,SMTP 服务将启动通信,以便通知 MTA 所有邮件必须重新路由。有关在 MTA 和 SMTP 服务之间交互的详细信息,请参阅使用 X.400 连接器连接路由组
  • Exchange 存储 如下图所示,SMTP 服务通过 Exchange 存储中的 MTA 的邮件队列将出站邮件传递给 Exchange MTA。Exchange MTA 还会通过 Exchange 存储将入站邮件传递给 SMTP 服务。如果必须通过由 Exchange MTA 负责的、基于 MAPI 的邮件连接器来传输邮件,那么,与 Exchange 存储的通信是必需的。基于 MAPI 的邮件连接器,与 SMTP 服务相似,用于维护 Exchange 存储中的邮件队列,网关邮件连接器体系结构 ¶Ô´Ë½øÐÐÁ˽âÊÍ¡£
    60ed7096-535e-49a5-9434-b25897d825ce
    为了与 Exchange 存储通信,MTA 使用名为 XAPI 的内部 API,该 API 是 MAPI 的包装。若要成功启动 Microsoft Exchange MTA Stacks 服务,Exchange 存储必须让至少一个邮箱存储驻留邮件队列。在这一部分随后的内容中,可以了解到有关出站和入站邮件处理的详细信息。
    note注意:
    如果运行 Exchange Server 2003 的桥头服务器驻留了很多 X.400 连接器或连接到非 Exchange 的邮件系统(比如 Lotus Notes和 Novell GroupWise),那么,即使 Exchange 存储不包含用户邮箱,也应当考虑将 Exchange 存储的事务日志和数据库文件放在单独的磁盘上。通过将数据库文件分散在多个物理驱动器上,可以提高系统性能。
  • 文件系统 Exchange MTA 使用文件系统上的两个重要目录。这两个目录被命名为 MTA 数据库目录和 MTA 运行目录。在传输期间,数据库目录以 .dat 文件的形式包含队列文件和邮件。这个 .dat 文件的集合被命名为 MTA 数据库。运行目录包含模板文件(被命名为运行文件)。运行文件使用抽象语法表示法一 (ASN.1) 来确定 MTA 如何格式化数据。默认情况下,数据库目录和运行目录都指向文件系统上相同的物理目录。如图 7.2 所示,该目录是 \Program Files\Exchsrvr\Mtadata 目录。最好将数据库目录和运行目录分开,本部分随后对此进行解释。
    note注意:
    运行目录不包含 Microsoft Exchange MTA Stacks 服务的实际的可执行文件 (Emsmta.exe) 和动态链接库 (DLL)。Emsmta.exe 和 DLL(例如 Mtaroute.dll)存储在 \Program Files\Exchsrvr\bin 目录中。
  • 远程 X.400 MTA Exchange MTA 通过 X.400 连接器与远程 X.400 MTA 通信。X.400 连接器是 Active Directory 中的配置对象,它描述了 Exchange MTA 为了进行邮件传输而必须使用的通信参数和邮件格式。远程 X.400 MTA 可以是通过 X.400 连接器连接的非 Exchange MTA 或 Exchange MTA。有关 X.400 通信的详细信息,请参阅 MTA 传输堆栈和 X.400 连接器
  • 同一路由组中的 Exchange 5.5 服务器 对于与本地路由组中运行 Exchange Server 5.5 的服务器通信 Exchange MTA 来说,X.400 连接器对象不是必需的。这些类型的 MTA 还被命名为 LAN-MTA,以强调在它们的通信中不涉及显式的 X.400 连接器这一事实。LAN-MTA 使用 RPC 进行相互通信。有关在 Exchange Server 2003 和 Exchange 5.5 之间进行通信的详细信息,请参阅 混合模式组织中的 Exchange MTA

Exchange MTA 从本地注册表和 Active Directory 内的 MTA 对象中获得它的配置设置。MTA 目录对象位于配置目录分区中每个 Exchange 服务器对象的下面。例如,下面是在 tailspintoys.com 域中称为 SERVER01 的服务器上的 MTA 对象的可分辨名称: CN=Microsoft MTA,CN=SERVER01,CN=Servers,CN=First Administrative Group,CN=Administrative Groups,CN=Tailspin Toys,CN=Microsoft.

在 Exchange 系统管理器中,MTA 配置对象的位置稍微有所不同。可以在服务器对象下面的“协议”容器中找到 MTA 配置对象,如下图所示。对象名为 X.400,尽管您实际上是在配置 MTA 而不只是 X.400 设置。可以使用 X.400 配置对象来定义 MTA 的名称及其本地密码。还可以指定在其中驻留邮件队列的 MTA 数据库目录。在“邮件默认设置”选项卡上,可以配置常规通信参数,例如,MTA 与 LAN-MTA 通信时要使用的重试值。配置 X.400 连接器时,可以替代这些设置。

afb4da5e-3d46-47ed-89c3-89ad5eeba032

MTA 配置对象是 MTA 对象类的实例。例如,可以在轻型目录访问协议 (LDAP) 筛选器中使用该信息,以便将 Exchange 组织内的所有 MTA 中的所有设置导出到文本文件中。以下 LDAP 数据交换格式目录交换 (LDFIDE) 命令演示了如何执行该步骤:ldifde -f c:\AllMTAs.ldf -s localhost -d "CN=First Organization,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=contoso,DC=com" -p subtree -r "(objectClass=mTA)"。您必须拥有该组织内所有管理组的读取权限。

下表列出了 MTA 目录对象的重要属性及其用途。

MTA 目录对象的重要属性

目录属性 用途

objectClass

将目录对象标识为 MTA 对象。

cn

包含 MTA 的公用名 (cn)。

transRetryMins

定义传输重试的间隔时间段,以分钟为单位。默认为 5 分钟。

transTimeoutMins

定义邮件传输的超时时间段,以分钟为单位。默认为 20 分钟。

mTALocalDesig

指定本地 MTA 的 X.400 名称。该名称最多 32 个字符,用来向远程 MTA 和 LAN-MTA 标识本地 Exchange MTA。

delivContLength

定义可以通过 MTA 发送的最大可投递邮件大小,以 KB 为单位。

diagnosticRegKey

指定诊断注册表项的位置。如果该项不存在,MTA 将使用以下注册表项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSExchangeMTA\Diagnostics。

expandDLsLocally

对应于 MTA 属性中的在本地展开远程通讯组列表设置。如果 expandDLsLocally 是 True,并且用户向远程通讯组列表发送邮件,则 MTA 将在本地展开通讯组列表。然后,Exchange MTA 将根据收件人在该列表中的位置来确定邮件的最佳路由。这种方法可以确保对邮件进行最有效的处理。但是,当处理大型通讯组列表时,可能影响到服务器的性能。

msExchHomeRoutingGroupDNBL

指向该 MTA 所属路由组的后部链接。

associationLifetime

指定在发送邮件之后系统向远程 X.400 MTA 保持关联打开的时间量(秒)。默认为 300 秒。

numOfOpenRetries

指定 Exchange MTA 在发送未送达报告 (NDR) 之前尝试打开连接的最大次数。默认为 144 次。

numOfTransferRetries

指定 Exchange MTA 尝试通过打开的连接传输邮件的最大次数。默认是两次。

openRetryInterval

指定在出现错误之后在试图重新打开连接之前系统等待的秒数。默认为 600 秒。

rTSCheckpointSize

指定在插入检查点之前传输的数据数量 (KB)。如果因出错而必须重新发送邮件,处理过程将从最近的检查点重新开始。值为零表示没有插入检查点。

rTSRecoveryTimeout

指定在断开的连接之后、在删除信息(及其检查点)和从头开始重新启动传输之前,MTA 等待重新连接的时间量。

rTSWindowSize

指定数据传输被挂起之前可以不经过确认的检查点数。如果检查点大小是零,则窗口大小没有意义。

sessionDisconnectTimer

指定在通过该连接建立的所有关联终止之后、在结束连接之前 Exchange MTA 等待的时间量(秒)。

tempAssocThreshold

指定系统可以发送到远程系统的排队邮件的最大数目。超过该值后,MTA 将打开另一个关联。

transferRetryInterval

指定在邮件传输失败之后、在通过打开的连接重新发送邮件之前系统等待的秒数。默认为 120 秒。

transferTimeoutNonUrgent

指定在为非紧急邮件发送未送达报告 (NDR) 之前系统等待的时间量(秒/KB)。

transferTimeoutNormal

指定在为正常邮件发送未送达报告 (NDR) 之前系统等待的时间量(秒/KB)。

transferTimeoutUrgent

指定在为紧急邮件发送未送达报告 (NDR) 之前系统等待的时间量(秒/KB)。

msExchMTADatabasePath

指示 MTA 数据库目录的路径。

msExchResponsibleMTAServerBL

包含驻留 MTA 的服务器的可分辨名称。

msExchEncryptedPassword

指定远程 MTA 在连接到该 MTA 时必须使用的 MTA 密码。密码长度可以是最多 64 个字符,并以加密形式存储在 Active Directory 中。

note注意:
MTA 密码以加密形式存储在 Active Directory 中,但这并不意味着 MTA 名称和密码是安全的。在建立连接时,X.400 MTA 将以明文交换它们的名称和密码。

Exchange MTA 的内部体系结构基于线程池、邮件队列和数据库队列。线程执行 Exchange MTA 进程 (Emsmta.exe) 中的实际处理过程。邮件队列(由下图中的箭头表示)则处理线程之间的交互和通知。数据库队列中包含等待由线程池中的某个线程处理的邮件。例如,工作队列(如下图所示)是持有邮件的数据库队列,这些邮件将一直停留在该队列中,直到 MTA 已经成功传输它们,或者直到它们已过期并用未送达报告 (NDR) 返回给发件人。运行多个线程允许 Exchange MTA 并发地执行多个任务。该图显示了 Exchange MTA 的内部体系结构。

2be3f684-8230-49e2-a0e5-d39564139a5d

内部 Exchange MTA 体系结构基于以下元素:

  • XFER IN 和 XFER OUT 线程 这两个线程处理进出 MTA 进程的实际邮件传输。该通信通过以下机制发生:
    • X.400 使用 X.400 连接器与远程路由组中的远程 X.400 MTA 或 Exchange 服务器的通信。
    • RPC 与 LAN-MTA(即本地路由组中运行 Exchange Server 5.5 的服务器)的通信。
    • XAPI 使用 MAPI 与 Exchange 存储的通信。
    可以使用以下注册表参数来控制传输线程的数量。

     

    位置

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\

    MSExchangeMTA\Parameters

    Transfer threads

    类型

    REG_DWORD

    数值数据

    0x1

    描述

    确定 MTA 传输线程的数量。对于传输线程的两个子类型(XFERIN 和 XFEROUT),这个值应乘以 2。

    默认值为 0x1。如果该 MTA 与多个远程 MTA 通信(在路由组以内或者在路由组之间),则建议值是 0x3。

  • 工作队列 Exchange MTA 将所有邮件写入文件系统上 MTA 数据库目录中的 .dat 文件。然后,它为工作队列中的每个 .dat 文件创建一个指针。工作队列维护对 MTA 所负责的每个邮件的引用。MTA 数据库和 .dat 文件将在该部分随后的内容中进行讨论。
  • 发送器 发送器处在 MTA 进程的核心,它负责邮件路由和结果处理。发送器使用路由器、扇出和结果线程来进行邮件处理。发送器执行以下关键任务:
    • 邮件路由、扇出和传输 发送器使用路由线程与路由引擎通信,并确定邮件传输的下一个跃点。如果邮件要发送到不同目的地的收件人,而这些目的地需要通过分开的连接(例如,安装在同一服务器上的两个 X.400 连接器)才能到达,则发送器将使用扇出线程。扇出线程将创建多个邮件副本并将它们放在合适的链路队列中。然后,发送器将触发 XFER OUT 线程来处理扇出邮件副本。
      note注意:
      在 MTA 中创建多个邮件副本的过程被称为扇出。这是相对于分叉而言的,分叉是指在 SMTP 传输子系统的分类程序中创建多个邮件副本的过程。SMTP 传输体系结构详细讨论了分类程序。
    • 结果处理 发送器还会基于路由、扇出和传输操作的结果来执行报告操作。例如,如果成功通过 X.400 连接器传输邮件,则发送器将更新工作队列中邮件收件人的责任标记,以指示传输获得成功。
      工作队列中的每个邮件都有一个由每个收件人一个位所构成的位图。一开始,MTA 设置所有收件人的位以指示邮件尚未传输。一旦邮件的扇出副本被 XFER-OUT 线程成功传输,发送器将清除在该扇出副本上与收件人对应的位。如果邮件已成功传输给收件人,或邮件已过期,MTA 会从工作队列中删除该邮件。这时,MTA 会为没有收到邮件的每个收件人生成 NDR。
    使用以下注册表参数,可以控制发送器线程的数目。

     

    位置

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\

    MSExchangeMTA\Parameters

    Dispatcher threads

    类型

    REG_DWORD

    数值数据

    0x1

    描述

    确定 MTA 发送器线程数,发送器线程负责邮件处理。对于发送器线程的三个子类型(即路由器、扇出和结果线程),该值应乘以 3。

    默认值为 0x1。如果该 MTA 与五个以上 LAN-MTA 通信,则建议值是 0x3。

  • 提交和传递线程 这些线程池是从 Exchange Server 5.5 留下来的。在典型环境下,在 Exchange 2000 Server 和 Exchange Server 2003 中不使用它们,因为在 Exchange 2000 Server 和 Exchange Server 2003 中没有直接的提交或传递。所有邮件必须通过 SMTP 服务进行传递。SMTP 服务通过 Exchange 存储驱动程序将邮件传递到本地收件人,SMTP 传输体系结构对此进行了解释。
    Exchange MTA 对待 SMTP 服务的方式类似于对待基于 MAPI 的连接器,都是将邮件队列放在 Exchange 存储中。XAPI 网关在 Exchange 存储中处理进出邮件队列的邮件传输。XAPI 网关是 Exchange 存储中的线程,这些线程与 XFER IN 和 XFER OUT MTA 线程执行接口操作。

Exchange MTA 使用以下线程进行进程间的通信和执行系统功能(例如,在发生更改时更新配置信息)。

  • OSI 堆栈 Exchange MTA 使用很多线程池来处理开放式系统互联 (OSI) 堆栈的各个层之间的通信任务。这些线程池包括可靠传输服务 (RTS) 线程、内核线程、RPC 线程、传输线程和 TCP/IP 或 X.25 线程。有关这些线程的用途的详细信息,请参阅 MTA 传输堆栈和 X.400 连接器
  • 计时器 Exchange MTA 在各种情况下运行计时器线程;例如,在邮件传输失败之后,通过打开的连接重新发送邮件之前执行等待时。
  • 目录轮询 Exchange MTA 使用单独的线程每十分钟轮询 Active Directory 一次,以确定配置是否有更改。
  • 不属于 MTA 的线程 路由引擎和 DSAccess 模块拥有在 MTA 进程中运行的线程,用于在发生更改时通知 Exchange MTA。例如,如果路由拓扑发生更改,触发所有在队列中的邮件执行邮件重新路由,则路由引擎将调用 MTA 的 RoutingReset() 函数。DSAccess 与 Exchange MTA 通信,以提供缓存的目录信息。

Exchange MTA 在 MTA 数据库中维护它所传输的所有邮件。MTA 数据库是无结构文件数据库,它由 .dat 文件组成,如下图所示。数据库队列和实际邮件各自有单独的 .dat 文件。注意,数据库队列包含对实际邮件的引用或指针,但数据库队列不包含邮件本身。MTA 将每个邮件存储在 MTA 数据库目录内单独的邮件 .dat 文件中。在活动数据库中,有一个 DBREFS 文件,该文件包含对象的引用计数,该数据提供了第三级备份信息。在 MTA 重新启动或 MTA 检查工具运行时,将重建 DBREFS。

区分活动 MTA 数据库中的各种 .dat 文件类型是困难的。“Exchange 2000 Server 资源工具包”(可在书店购买)包括一个名为 MTAView 的工具。可以使用 MTAView 来查看 MTA 的队列内容和这些队列中的邮件的标题。下图显示在活动 MTA 数据库打开时的 MTAView 工具。前景窗口显示 MTA 邮件队列目录中的 .dat 文件。

fe98e85b-8550-40be-807b-af3da4b6b3be

MTA.dat 文件被划分为两个类别:

  • 核心 .dat 文件 核心 .dat 文件充当了 MTA 数据库的引用行和列。邮件队列目录 (\Program Files\Exchsrvr\Mtadata) 中有 38 个核心 .dat 文件,它们都是运行 Exchange MTA 所必需的。大多数核心 .dat 文件与 Exchange Server 2003 一起交付。在产品 CD 的 \Setup\i386\Exchange\Bootenv 目录中,可以找到这些文件。在安装期间,Exchange Server 2003 安装程序将把这些文件复制到 \Program Files\Exchsrvr\Mtadata 目录。Exchange Server 2003 所附带的核心 .dat 文件的编号是从 DB000001.dat 到 DB000026.dat(十六进制数字)。
    Exchange MTA 为重要的数据库队列动态地创建其他 .dat 文件。例如,在 MTA 每次重新启动时,MTA 将重建 MTA 工作队列。在该重建期间,不传递任何邮件,因为 MTA 必须首先解决所有 .dat 文件。在解决所有文件后,才开始邮件传输。
    活动 MTA 数据库上最重要的核心 .dat 文件是:
    • DB000001.dat 这是最重要的数据库队列,名为主队列。主队列包含队列对象 ID 的列表以及对其他工作队列的引用,这些队列每一个都有它们自己单独的 .dat 文件。
    • DB000020.dat 这是 XAPI 工作队列,用于维护对准备发送到 SMTP 服务或基于 MAPI 的网关连接器(例如,Lotus Notes 连接器和 Novell GroupWise 连接器,这些连接器在 Exchange 存储中有自己的邮件队列)的邮件的引用。
    • DB000025.dat 这是外出信息队列,其中包含外出通知的对象。
    • DB000026.dat 这是对数据队列的引用。为了实现冗余,在队列 .dat 文件中 .dat 文件被多次引用。
    • DB000027.dat 这是 MTA 工作队列,其中包含等待传输的邮件的列表。
  • 邮件和占位符 .dat 文件 数据库目录中的其余 .dat 文件是邮件和占位符文件。MTA 为它必须传输的每个邮件创建邮件 .dat 文件。因为文件名的数字部分是随机分配的 (DB######.dat),因此可能有重复的文件名。为了避免覆盖现有文件,Exchange MTA 创建了一个与每个邮件 .dat 文件放在一起的占位符 .dat 文件。占位符 .dat 文件的大小是一个字节,如果因为出现重复的文件名而无法创建邮件 .dat 文件,则会使用占位符 .dat 文件。上图显示了一个 2 MB 的邮件 .dat 文件 (DB00002D.dat) 和一个 0 KB 的占位符 .dat 文件 (DB00002E.dat)。MTA 为每个邮件创建两个 .dat 文件。
    邮件传输之后,Exchange MTA 将擦除 .dat 文件中的数据,并将文件重置为一个字节(而不是删除 .dat 文件)。然后,Exchange MTA 可以让未来的邮件重用 .dat 文件。该机制增强了 MTA 的性能,因为创建和删除文件要耗费时间。在邮件队列目录中找到的 .dat 文件数反映了在任何时间队列中的最大邮件数。在运行 Exchange Server 2003 的繁忙的桥头服务器上,可能在 MTA 数据库目录中找到数百个 .dat 文件。

Exchange 系统管理器使您能够将 MTA 数据库目录移动到文件系统中的另一个位置(在服务器的“协议”容器中,用鼠标右键单击 X.400 配置对象,再单击“属性”,然后单击“常规”选项卡,在“邮件队列目录”下面单击“修改”)。在 Exchange 系统管理器中修改队列目录的位置时,需要将数据库文件移动到新位置,并更改 MTA 目录对象的 msExchMTADatabasePath 属性,使其指向新的位置。但是,msExchMTADatabasePath 属性只用作告知目的。更重要的是下面的注册表项,Exchange 系统管理器也会更新这些注册表项。

 

位置

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\

MSExchangeMTA\Parameters

MTA database path

类型

REG_SZ

数值数据

C:\Program Files\Exchsrvr\Mtadata

描述

指向 Exchange MTA 的数据库文件(队列文件和邮件文件)的位置。如果路径不是有效的或指向空目录,则 MTA 无法启动。

不应当将 MTA 数据库目录放在文件分配表 (FAT) 分区上。FAT16 分区支持的最多文件数是 65,535 个。在繁忙的桥头服务器上,该大小限制会产生问题。队列开始填充时,用来创建新文件的可用条目可以在仅仅一天中被耗尽。这个问题是双重的,因为每个邮件都要求有两个 .dat 文件。此外,在大型卷上 FAT 的性能不佳,它只提供最低程度的容错能力,并且在发生意外的系统停止之后没有恢复能力。

在繁忙的运行 Exchange Server 2003 的 X.400 桥头服务器上,通过将 MTA 数据库目录放在高性能的磁盘子系统(例如,独立磁盘冗余阵列 (RAID))上,可以优化性能。有八到十个磁盘的 RAID 0+1 是高容量邮件传输的良好起点。具有大于 64MB 缓存的 RAID 控制器也会对性能有所帮助。

note注意:
在“MTA database path”注册表项的下面,可以找到称为“MTA Run Directory”的注册表项。该注册表项指向 Exchange MTA 的运行文件所在的目录。最佳做法是将数据库和运行目录放在不同磁盘上。

MTA 工作队列中的邮件被称为安全邮件,这是因为它们总是保存在 .dat 文件中。这些 .dat 文件将持久存在,即使 Exchange MTA 进程发生意外终止。发送器使用工作队列中的安全邮件作为源文件,并创建不安全的邮件副本。然后,发送器会附加合适的连接器链路队列或下一个跃点链路,以便传输邮件。如果邮件预期发往多个目标,并且通过分开的连接到达这些目标,那么,发送器将为每个连接创建一个扇出副本。每个扇出副本将引用 MTA 工作队列中的安全邮件。在成功传输邮件后,MTA 将从队列中删除安全的和不安全的邮件副本。

链路队列中的邮件被表示为指向邮件对象的引用指针,而不是表示为对象本身。安全邮件在 .dat 文件中可用,但对不安全副本来说,并非必须是这样。不安全副本保留在内存中主要是为了提高 MTA 性能。只有当没有足够的缓存空间可用于将对象保存在内存中时,发送器才会将不安全副本保存在 .dat 文件中。缓存是一个固定的 4k 缓冲池,并且是针对每个对象的结构,它基于线程池大小。使用以下注册表参数,可以调整内存中每个对象的数据缓冲区数目。

 

位置

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\

MSExchangeMTA\Parameters

DB data buffers per object

类型

REG_DWORD

数值数据

0x3

描述

用于确定为每个数据库对象配置的数据库服务器缓冲区数。缓冲区越多,需要的内存越多,但会减少数据库对象因缺少缓冲区空间而转出到磁盘的机会。

默认值为 0x3。如果该 MTA 在路由组内或在路由组之间与多个 MTA 通信,则建议值是 0x6。另外,如果基于 MAPI 的连接器安装在该服务器上,则应当调整该设置。

不可能将 MTA 数据库和 .dat 文件分开,以便让多个 MTA 实例可以并发地使用 MTA 数据库。在某些情况下则需要这样做,例如,如果想要基于 Microsoft Windows Server 2003 群集服务在服务器群集中的多个群集节点上运行 MTA。由于只有一个 MTA 可以拥有 MTA 数据库,因此,Exchange MTA 可以只运行在群集中第一个被初始化的节点上。发生故障转移时,群集服务将在失败节点上停止 MTA,并在另一个节点上启动它,然后从相同 .dat 文件恢复系统并重新建立连接。

Exchange Server 2003 以基于 MAPI 的连接器为目标、通过 Exchange 存储向 MTA 传输邮件。邮件通过 Exchange 存储从 MTA 返回到连接器邮箱。默认情况下,只有两个线程(一个用于传入传输,另一个用于传出传输)与 MTA 通信。这意味着,损坏邮件(在 MTA 中网关链路队列的顶部)可以阻塞进出 Exchange 存储的所有邮件流。若要疏通邮件队列,可以使用 Exchange 系统管理器中的队列查看器管理单元来删除关键的邮件。

note注意:
不应当直接从 MTA 数据库目录中删除 .dat 文件,因为意外地删除核心 .dat 文件可以损坏整个数据库。

通过使用以下注册表参数,还可以为每个邮箱存储增加 Exchange 存储进程中的网关进出线程数。如果 Exchange 存储使用多个线程与 Exchange MTA 通信,则损坏邮件可能阻塞一个线程,但另一个线程可能仍然能够继续处理邮件。如果所有网关被多个损坏邮件阻塞,则可能表示出现了严重的问题(例如,硬盘控制器发生故障)。

 

位置

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services \MSExchangeIS\<server_name>\Private-<database_guid>

Gateway In Threads Gateway Out Threads

类型

REG_DWORD

数值数据

0x1

描述

这两个参数的默认值都是 0x1。如果该 MTA 与多个 LAN-MTA 通信或对基于 MAPI 的邮件连接器负责,则建议的设置是 0x3。

必须在注册表中将这些参数添加到邮箱存储的所有项中。每个进入网关线程和离开网关线程都会消耗大约 1 MB 虚拟内存。在有许多私人数据库的服务器上,这可能会是个问题。例如,如果有 10 个私人数据库,并将这些参数由 0x1 增加到 0x3(共增加四个线程),则创建了 4 x 10 = 40 个线程,它们共占用 40 MB 虚拟内存。

如果从邮件队列中删除损坏邮件后并没有解决与 MTA 队列相关的所有问题,请使用 MTA 检查工具 (Mtacheck.exe) 来分析和纠正 MTA 数据库中的问题。如果怀疑 MTA 数据库有损坏或看见事件日志中写入了错误,请运行 MTA 检查工具。必须直接在服务器上使用 MTA 检查工具,并且必须停止 Microsoft Exchange MTA Stacks 服务。MTA 检查工具可以检查数据库队列中的指针,并确保队列文件中指示的 .dat 文件的确存在。工具将删除损坏的邮件(即带有不一致指针的邮件)。损坏邮件将被移动到 \Program Files\Exchsrvr\Mtadata\Mtacheck.out 目录中。可以使用命令行参数来删除公用文件夹复制邮件和其他系统邮件,但是必须小心使用这些参数。有关进一步的信息,请参阅 MTA 检查工具文档。可以从 Downloads for Exchange Server 2003 网站得到 MTA 检查工具及其文档。

在具有多个 X.400 或基于 MAPI 的连接器的、繁忙的桥头服务器上,MTA 数据库目录中可以填充大于 10,000 个 .dat 文件。如果出现由于损坏的邮件或网络问题而造成的传输问题,该问题会很复杂。对于可以写入磁盘的 .dat 文件数的相关物理限制是可用的磁盘空间的数量。在 MTA 数据库所在的硬盘驱动器上,当可用的磁盘空间低于 10 MB 时,Microsoft Exchange MTA Stacks 服务将关闭。

若要重新启动 Microsoft Exchange MTA Stacks 服务,必须确保可用的磁盘空间在 10 MB 以上。这可能需要临时将所有 .dat 文件从 MTA 数据库目录移动到另一个驱动器或网络共享上。移动文件以创建空数据库目录的过程称为 MTA 擦除。在诊断并解决 MTA 数据库问题(例如,许多损坏的邮件滞留在数据库队列中)时,MTA 擦除是有帮助的。

有关如何擦除 MTA 元数据库的详细说明,请参阅如何擦除 MTA 数据库

Caution警告:
如果需要擦除 MTA 数据库,应当与 Microsoft 产品支持服务联系,以获得协助,确保正确执行步骤。如果错误地应用步骤,有可能释放当前在 MTA 邮件队列中的电子邮件。

若要投递在进行 MTA 数据库擦除时位于 MTA 数据库中的邮件,必须重播 .dat 文件。可以用三不同方式重播 DAT 文件。

  • 完整重播 重播 .dat 文件的最容易方式是在最初驻留它们的服务器上全部一次性地重播这些文件。要这样做,原始 Exchange 服务器上的 MTA 的队列中应当没有任何内容。如果 MTA 队列中有邮件,则应当允许 MTA 完成发送邮件的操作,直到所有队列为空。
  • 远程重播 不必在原始驻留 .dat 文件的 Exchange 服务器上重播这些 .dat 文件。例如,如果原始 Exchange 服务器是一个繁忙的桥头服务器,它连续地传输大量电子邮件并且没有达到空的 MTA 工作队列,那么,您可以选择在另一个运行 Exchange Server 的服务器上重播邮件。
  • 增量重播 增量重播是通过将 .dat 文件划分成几个更小的组来执行的,每次重播一个这样的组。该方式比完整重播或远程重播更复杂,但在处理数量非常大的 .dat 文件时很有用。在必须传递重要邮件时,增量重播也可能是个好办法,但在邮件队列中某个位置出现的损坏邮件会导致 MTA 意外停止。可以在原始 Exchange 服务器或组织中的另一个 Exchange 服务器上执行增量重播。

有关如何执行每个步骤的详细说明,请参阅如何在 MTA 数据库擦除之后重播 DAT 文件

用来监视 MTA 的主要工具是系统监视器(在性能监视器工具中)和事件查看器。可以使用系统监视器来实时监视邮件连接器的行为。可以确定在入站和出站邮件队列中处于等待状态的邮件数。可以确定自从 MTA 启动以来已由连接器传输的邮件总数。一个好的做法是使用系统监视器来检查邮件队列,因为如果有许多邮件在邮件连接器中排队,则可能说明存在性能瓶颈或连接器组件有故障。事件查看器工具可以帮助您识别并诊断系统问题的起源,或帮助您预报潜在的问题。Exchange MTA 将关键事件写入应用程序事件日志。事件是 Exchange MTA 中出现的可能需要管理员加以注意的活动。

性能监视涉及到查找分散的系统组件。在 Windows 中,对象代表单个进程、一段共享内存或一个物理设备。对象可以有与之关联的几个性能计数器。例如,MSExchangeMTA 对象有很多性能计数器,其中包括名为 Work Queue Length 的计数器,该计数器指示 MTA 工作队列中的邮件数。

若要将性能计数器添加到系统监视器中,请启动性能监视器工具,然后在工具栏中单击以加号 (+) 表示的“添加”。然后可以从“添加计数器”对话框的“性能对象”下拉列表中选择“MSExchangeMTA”对象。按照您的选择,将在“选择计数器”列表中列出合适的性能计数器。

下表列出了对 MSExchangeMTA 性能对象可用的性能计数器。

MSExchangeMTA 性能计数器

性能计数器 描述

Adjacent MTA Associations

该 MTA 拥有的、与其他 MTA 的打开关联数。

Messages/Sec

邮件的处理速率。

Message Bytes/Sec

邮件字节的处理速率。

Free Elements

MTA 池中的可用缓冲区元素数。

Free Headers

MTA 池中的可用缓冲区头数。

Admin Connections

连接到 MTA 的 Microsoft Exchange Administrator 程序数。

Threads In Use

正在被 MTA 使用的线程数。这个数字可以用来确定增加处理器是否可能有好处。

Work Queue Length

工作队列中未完成的邮件数。它表示还没有被 MTA 处理完的邮件数。

XAPI Gateways

使用 XAPI 接口连接到 MTA 的 XAPI 网关数。单个网关可以有多个 XAPI 网关会话。

XAPI Clients

使用 XAPI 接口连接到 MTA 的 XAPI 客户端数。单个客户端可以有多个 XAPI 客户端会话。

Disk file deletes

每秒的磁盘文件删除操作数。

Disk file syncs

每秒的磁盘文件同步操作数。

Disk file opens

每秒的磁盘文件打开操作数。

Disk file reads

每秒的磁盘文件读取操作数。

Disk file writes

每秒的磁盘文件写入操作数。

ExDS Read Calls/sec

读取调用目录服务的速率。

XAPI Receive Bytes/sec

通过 XAPI 连接接收字节的速率。

XAPI Transmit Bytes/sec

通过 XAPI 连接传输字节的速率。

Admin Interface Receive Bytes/sec

通过 admin 连接接收字节的速率。

Admin Interface Transmit Bytes/sec

通过 admin 连接传输字节的速率。

LAN Transmit Bytes/sec

通过 LAN 向 MTA 传输字节的速率。

LAN Receive Bytes/sec

通过 LAN 从 MTA 接收字节的速率。

RAS Receive Bytes/sec

通过 RAS 连接接收字节的速率。基于 RAS 的 X.400 连接器在 Exchange Server 2003 中不可用。

RAS Transmit Bytes/sec

通过 RAS 连接传输字节的速率。基于 RAS 的 X.400 连接器在 Exchange Server 2003 中不可用。

TCP/IP Receive Bytes/sec

通过 TCP/IP 连接接收字节的速率。

TCP/IP Transmit Bytes/sec

通过 TCP/IP 连接传输字节的速率。

TP4 Receive Bytes/sec

通过 TP4 连接接收字节的速率。基于TP4 的 X.400 连接器在 Exchange Server 2003 中不可用。

TP4 Transmit Bytes/sec

通过 TP4 连接传输字节的速率。基于TP4 的 X.400 连接器在 Exchange Server 2003 中不可用。

X.25 Receive Bytes/sec

通过 X.25 连接接收字节的速率。

X.25 Transmit Bytes/sec

通过 X.25 连接传输字节的速率。

Exchange MTA 还为 MTA 建立的每个连接提供了性能对象。在“添加计数器”对话框中,从“性能对象”下拉列表中选择“MSExchangeMTA Connections”对象。然后,可以在“从列表选择实例”下面找到单个连接实例。每个 MSExchangeMTA 连接实例都描述了一个连接,但也可以选择同时监视所有实例。

d80aed52-0fb5-4874-95e1-26f9ca72824f

下表列出了可用于 MSExchangeMTA Connections 性能对象的性能计数器。

MSExchangeMTA 连接性能计数器

性能计数器 描述

Associations

在 MTA 和所连接的 MTA 之间的关联数。如果需要额外的传输吞吐量,MTA 可以打开多个关联。

Receive Bytes/sec

从所连接的实体接收字节的速率。

Send Bytes/sec

向所连接的实体发送字节的速率。

Receive Messages/sec

从所连接的实体接收邮件的速率。

Send Messages/sec

向所连接的实体发送邮件的速率。

note注意:
将很多邮件发送到 Exchange MTA 时,在“MSExchangeMTA Connections - SMTP Server <GUID>”中显示的 Send Messages/sec 值将在邮件流动时上下起伏。但是,“MSExchangeMTA - Work Queue Length”总是位于零。使用 X.400 连接器从 Exchange 向远程 MTA 发送邮件时,“MS Exchange MTA - Work Queue Length”和“MS Exchange MTA Connections - X.400 Connector”都会显示活动情况。这是 MTA 处理入站和出站 XAPI 邮件时采用了不同机制的结果。对于进入 SMTP 邮箱(XAPI 网关)的入站邮件来说,MTA 立即将邮件传输到 XAPI 工作队列 (DB000020.dat)。这不是 MTA 工作队列 (DB000028.dat)。但是,对于 X.400 MTA 或 LAN-MTA 来说,MTA 将邮件放在 MTA 工作队列中,并且直到远程 MTA 确认邮件已接收时才完成传输。在该方式中,可以用系统监视器来确定内部 MTA 处理过程的详细信息。

诊断并解决 MTA 问题应当包括检查应用程序事件日志。Exchange MTA 自动跟踪关键的事件,但您也可以按针对 MTA 的类别来设置诊断日志记录级别,以增加 Exchange MTA 写入事件日志的信息量。在 Exchange 系统管理器中,显示需要注意的服务器对象的属性,然后单击“诊断日志记录”选项卡。在“服务”下面,选择“MSExchangeMTA”,然后选择“类别”以列出 MTA 的类别。每个 MTA 类别都有一个诊断日志记录级别。当 MTA 以一个小于或等于该日志记录级别的重要性编号生成事件时,该事件就会记录在事件日志中。如果事件的重要性编号大于日志记录级别,则不记录该事件。下表列出了可以对诊断日志记录启用的 Exchange MTA 类别。

在正常操作期间,Exchange MTA 的所有类别都应当有一个为“无”的日志记录级别。在该级别,只有错误事件和关键消息会写入事件日志。如果增加日志记录级别,请只选择那些与问题相关的类别。如果将太多类别的日志记录级别设置得太高,则会很快地以不相关的信息填充事件日志。在完成 MTA 检查后,不要忘记将所有类别的日志记录级别重置为“无”。

tip提示:
还有可能按照事件源和类别来筛选事件。在“事件查看器”中,选择“应用程序日志”,再单击“查看”,然后单击“筛选”。在“事件来源”下面,选择“MSExchangeMTA”。若要在事件查看器中显示 Exchange MTA 的所有事件,请确保“类别”设置为“全部”。可以在本地或远程查看事件日志,并且可以将它们保存到 *.EVT 文件中。

Exchange MTA 的诊断日志记录类别

类别 描述

X.400 服务

报告与 X.400 协议处理相关的事件,例如将邮件传递到远程 MTA。

资源

报告与 MTA 资源的使用相关的事件。

安全性

报告与 MTA 安全性和安全违反情况相关的事件。

接口

报告与 MTA 和 Exchange 存储之间的通信、以及使用 RPC 的 MTA 之间的通信相关的事件。

字段工程

报告与调试 MTA 操作相关的事件。这些事件揭示了 Exchange MTA 中的内部处理过程的详细信息,对 Microsoft 产品支持服务的支持专家有用。

MTA 管理

报告与邮件队列相关的事件。使用 Exchange 系统管理器中的队列查看器管理单元,可以使 MTA 队列生成这些事件。

配置

报告与 MTA 配置设置中的问题相关的事件。无效的注册表参数或 \Mtadata 目录中损坏的运行文件可以导致这些事件。

目录访问

报告与 Active Directory 通信相关的事件。

操作系统

报告与 MTA 用来创建和管理文件和线程的操作系统服务相关的事件。

内部处理

报告与 Exchange MTA 中的内部处理相关的事件,这对 Microsoft 产品支持服务的支持专家可以是有用的。

互操作性

该类别不会导致 MTA 将信息写入应用程序事件日志。而是跟踪协议消息的二进制内容。将该类别与“接口”类别结合使用,可以记录通过内部接口发送到 AP*.log 文件(位于 \Program Files\Exchsrvr\Mtadata 目录)的邮件。例如,可以使用 AP*.log 文件来创建 MTA 堆栈跟踪和 XAPI 跟踪。在跟踪 MTA 的配置问题时,互操作性日志可以是有作用的。

将“互操作性”和“接口”类别的诊断日志记录级别都提高到“中”或更高将会生成 AP*.log 文件。当前日志始终命名为 Ap0.log。前面的日志命名为 AP#.log,# 随日志年龄增长。日志达到 5 MB 时,它将被重命名并创建一个新的 AP*.log 文件。

note注意:
AP*.log 文件可以非常快速地增长,并且对 Exchange MTA 的性能有影响。

APDU(应用程序协议数据单元)

该类别不会导致 MTA 将信息写入应用程序事件日志。而是跟踪 MTA 发送和接收的邮件的邮件信封内容 (P1),以及在 MTA 之间传输的完全编码的应用程序协议数据单元 (APDU)。

将该类别与“X.400 服务”类别结合使用,可以将信息记录到位于 \Program Files\Exchsrvr\Mtadata 目录内的 BF*.log 文件中。在诊断互操作性或一致性问题(例如,来自远程 MTA 的邮件被损坏或格式不正确时),BF*.log 文件是有用的。ASN.1 语法分析程序工具(例如 Aspirin 工具,该工具包括在可在书店购买到的“Exchange 2000 Server 资源工具包”中)可以用来对 Bf*.log 中的数据解码。

将“APDU”和“X.400 服务”类别的诊断日志记录级别都提高到“中”或更高将会生成 BF*.log 文件。当前日志始终命名为 Bf0.log。前面的日志命名为 BF#.log,# 随日志年龄增长。日志大小达到 5 MB 时,它将被重命名并创建一个新的 BF*.log 文件。

note注意:
BF*.log 文件可以非常快速地增长,并且对 Exchange MTA 有性能影响。

若要将所有 MTA 事件信息记录到 \Exchsrvr\Mtadata 目录内的 EV*.log 文件中,请设置以下注册表参数。EV*.log 文件是记录到应用程序事件日志中的同一个 MSExchangeMTA 事件的非本地化的文本副本。被写入日志文件的事件的类别和级别会受到控制,如表 7.4 所述。在诊断和解决 MTA 问题时,与相应的应用程序事件日志相比,EV*.log 文件更容易读取、搜索和复制。

 

位置

HKEY_LOCAL_MACHINE\CurrentControlSet\Services\MSExchangeMTA\Parameters

TextEventLogging

类型

REG_DWORD

数值数据

0x1

描述

如果将该值设置为 0x1,将使文本能够记录到 EV*.log 文件中。

有关 Exchange MTA 可以创建的各种日志的详细信息,请参阅 Microsoft 知识库文章 153188“XCON: Description of MTA Diagnostics Logging Options”。

诊断日志记录级别越高,在应用程序事件日志中找到的与 MTA 相关的事件越多。这些额外的信息提高了您确定邮件流问题的原因的能力。若要获得有关 Exchange MTA 的最详细信息,请将 MTA 类别的诊断日志记录级别设置到跟踪级别。跟踪级别日志记录不会显示在 Exchange 系统管理器中,只能使用注册表编辑器来设置它。

note注意:
跟踪级别日志记录会使服务器性能显著降低。在诊断和解决复杂的 Exchange MTA 问题时,请在 Microsoft 产品支持服务的指导下使用跟踪级别日志记录。
Caution警告:
错误地使用注册表编辑器可能导致严重的问题,甚至可能需要重新安装操作系统。Microsoft 无法保证错误使用注册表编辑器所导致的问题可以得到解决。请自行承担使用注册表编辑器的风险。

若要将 MSExchangeMTA 类别的诊断日志记录级别设置到跟踪级别,请使用以下步骤:

  1. 启动注册表编辑器,并打开以下注册表项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSExchangeMTA\Diagnostics
  2. 双击各个 MSExchangeMTA 类别的每个条目,并将值设置为 0x7。例如,双击右窗格中的 1 X.400 Service 条目,然后将值更改为 0x7
  3. 重新启动 Microsoft Exchange System Stacks 服务。通常,不必须重新启动服务,就能使更改生效。但是,在手动编辑注册表时,可能必须执行该步骤。

一个未充分利用的故障排除工具是当前详细的 Mtacheck.log 文件。该日志文件显示了运行 Mtacheck.exe 的结果。您可以手动运行 MTA 检查工具,但当 Microsoft Exchange MTA Stacks 服务确定 MTA 先前被不正确关闭时,该工具也可以自动运行。如果 MTA 检查工具自动运行,则事件将记录到应用程序事件日志中,并且会在 \Program Files\Exchsrvr\Mtadata\Mtacheck.out 目录中生成 Mtacheck.log 文件。可以使用 Mtacheck.log 文件执行以下任务:

  • 获得所有安全队列的快速列表及其关联的对象 ID。
  • 在 MTA 启动时快速识别邮件对象驻留在哪个队列中。
  • 在启动时将工作队列中的数据和引用对象相互关联。

有关 Mtacheck.log 文件的详细信息,请参阅 Microsoft 知识库文章 163323“XCON: Mtacheck.log”(英文)。

对于 Exchange MTA 所处理的每个对象来说,它们都有一个关联的八位数对象 ID。对象 ID 的前两个数字标识对象类。ID 的最后六个数字对应于 DB<6digit>.dat 文件(如果对象被写入磁盘)。MTA 对象类的范围是从 01 到 0E(以十六进制表示)。两个最重要的类是 01(队列)和 06(邮件)。例如,以下事件引用了 ID 为 0600002D 的邮件对象。

Event ID: 272

Source: MSExchangeMTA

Type: Information

Category: X.400 Service

received from entity /DC=COM/DC=CONTOSO/CN=CONFIGURATION/CN=SERVICES/CN=MICROSOFT EXCHANGE/CN=FIRST ORGANIZATION/CN=CONNECTIONS/CN=SMTP (SERVER01-{43D5C017-4A4B-4AFD-85AF-06EAB90057AA}). The entity is a XAPI-Gateway , object is a Normal priority Message, the MTS identifier is C=US;A= ;P=First Organizati;L=SERVER01-040503155933Z-4, and content length is 1719. The number of objects sent so far = 1. External trace information (first 100 bytes) = 3080638061801302555300006280130120000013104669727374204F7267616E697A61746900003180800D3034303530333136303234315A8201008302060000000000. (10)

note注意:
并非 MTA 处理的所有对象都会写入磁盘。不安全的对象可能只存在于内存中。

每个邮件还有一个关联的 ID,它被称为邮件 ID 或邮件传输服务 (MTS) 标识符。与只由本地 Exchange MTA 使用的对象 ID 不同,邮件 ID 是邮件本身的一部分,并且可以跨 MTA 进行跟踪。

由 Exchange MTA 生成的典型的邮件 ID 具有以下格式:C=<country>;A= ;P=<organization>;L=<server>-<date><greenich mean time>-<message number>。正如刚才所显示的内容,在事件 272 中示例采用了黑体。L= 值有几个变体,这取决于邮件来源。来自 Exchange 外部的邮件 ID 可能有所不同,但它们的目的是相同的。MTS 标识符帮助将邮件副本与特定的邮件源关联起来。例如,如果将一封邮件发送到具有数百个收件人的通讯组,那么甚至在邮件离开 MTA 之后,每个所生成的邮件扇出副本都会有相同的邮件 ID。

 
显示: