SMTP 连接问题疑难解答

 

上一次修改主题: 2005-09-26

SMTP 服务是 Exchange 2003 的内部传输引擎,只要传输邮件就会涉及 SMTP 服务。SMTP 服务使用 SMTP 连接器将邮件传输到目标,与 Exchange MTA 使用 X.400 连接器的方式类似。SMTP 连接器是配置对象,包含确定 SMTP 服务如何建立连接和传输邮件的参数。但是,SMTP 连接器不是 SMTP 连接的绝对要求。Exchange 2003 虚拟 SMTP 服务器也可以直接与远程 SMTP 主机进行通信。

通过 SMTP 传输邮件的问题的常见原因如下:

  • 无法访问主机   如果 SMTP 服务无法与远程 SMTP 主机建立连接,则验证远程主机的地址信息是否正确以及远程主机的名称是否可以解析为有效的 IP 地址。如果知道目标系统的 IP 地址,则可以使用 Telnet.exe 尝试与 TCP 端口 25 建立连接。如果不知道目标系统的 IP 地址,则在命令提示符下启动 NSlookup 工具 (NSlookup.exe),并执行下列步骤来查询目标域的邮件交换器 (MX) 记录:
    1. 在 NSlookup 工具中,确保通过网络连接到 DNS 服务器上,然后键入命令 set type=mx 并按 Enter 键。
    2. 键入您感兴趣的域名(例如 microsoft.com),然后按 Enter 键。在输出屏幕中应注意到一条或多条 MX 记录以及这些主机的 IP 地址(图 1)。
    3. 键入 exit,然后按 Enter 键退出 NSlookup 工具。
      e906dc52-bd1d-403e-b38b-6e1cd4693331
      如果无法使用 Telnet.exe 连接到目标系统上的 TCP 端口 25,请参阅知识库文章 169790“如何解决基本的 TCP/IP 问题”(https://go.microsoft.com/fwlink/?linkid=3052&kbid=169790)。
  • 无法访问目标域   邮件无法到达最终的目标,因为 SMTP 服务无法确定负责该域的 MX 记录。如果无法访问 SMTP 域,SMTP 服务将在未送达报告 (NDR) 中通知邮件发件人在 DNS 中找不到收件人的目标服务器。如果为一个或多个 SMTP 连接器分配的 SMTP 类型的地址空间不正确,也可能会出现此错误。使用 Exchange 系统管理器或 WinRoute 工具验证邮件路由拓扑。
  • SMTP 协议错误   远程 SMTP 主机使用 500 级错误响应本地 SMTP 主机的 EHLO 命令时(例如由于远程主机不支持扩展 SMTP)或 SMTP 命令顺序不正确时(例如在 EHLO 之前尝试运行 MAILFROM),将发生协议错误。如果检测到协议错误,发送系统将退出连接并使用 NDR 报告此错误,表明远程 SMTP 服务器无法处理该协议。要了解远程 SMTP 服务器拒绝协议请求的原因,请对虚拟服务器启用 SMTP 日志记录或使用网络监视器跟踪网络通信。要激活 SMTP 日志记录,在虚拟服务器的“常规”选项卡上,选择“启用日志记录”,并在“活动日志格式”下指定首选的日志记录格式。
  • 没有为入站邮件传输配置 SMTP 地址空间   必须将 Exchange 组织的 SMTP 地址空间标识为入站地址空间,以便通过 Internet 或其他 SMTP 邮件系统访问 Exchange 2003 用户。例如,如果 SMTP 地址为 administrator@fourthcoffee.com,并且没有将 fourthcoffee.com 标识为入站地址空间,则通过 Internet 发送给 administrator@fourthcoffee.com 的邮件将无法到达您的邮箱。要验证 Exchange 组织的配置是否正确,在 Exchange 系统管理器中,打开“收件人策略”容器中的“默认收件人策略”,然后切换到“电子邮件地址”选项卡。验证 SMTP 地址生成规则是否包含正确的域信息。如果地址信息不符合您的要求(例如,如果为 Exchange 组织指定了 @contoso.com,而您还需要 @fourthcoffee.com),则再创建一个 SMTP 地址生成规则,并确保选中了“此 Exchange 组织负责处理传递到此地址的所有邮件”复选框。
  • 检测到环回   如果在 Exchange 服务器上配置了多个 SMTP 虚拟服务器,请确保它们提供唯一的传入端口,还要确保传出 SMTP 端口配置有效,以避免在本地虚拟服务器之间出现循环。确保如果在桥头服务器上配置了多个虚拟 SMTP 服务器,则在虚拟服务器的“常规”选项卡上的“IP 地址”列表中没有任何虚拟服务器设置为“所有未分配”。
    如果使用 SMTP 连接器,还应确保没有任何 SMTP 连接器拥有本地组织的地址空间。如果必须与其他邮件系统共享本地组织的 SMTP 地址空间,请确保将所有邮件转发到指定的智能主机。在 SMTP 连接器配置中不要选择“使用 DNS 路由到此连接器上的每个地址空间”。有关如何配置 SMTP 连接器的详细说明,请参阅从非 Exchange 邮件系统迁移到 Exchange Server 2003 时如何配置 SMTP 连接器

测试邮件连接

要测试邮件连接,请通过 Internet 邮件系统(例如 Microsoft Hotmail®)向 Exchange 用户发送电子邮件。在显示用户帐户的属性并切换到“电子邮件地址”选项卡时,可以指定“Active Directory 用户和计算机”中的某个 Exchange 收件人的 SMTP 地址。记住回复测试邮件,并确保在 Hotmail 中收到回复,以验证邮件是否可以双向路由。

还可以使用 Telnet.exe 快速测试到 Exchange 2003 收件人的入站邮件传输,请参阅知识库文章 153119“Telnet 到端口 25 以测试 SMTP 通信”(https://go.microsoft.com/fwlink/?linkid=3052&kbid=153119)。

检查 SMTP 邮件流

SMTP 服务由下列内部组件组成,这些组件处理一端的 SMTP 主机和基于 Internet 的电子邮件客户端与另一端的 Exchange 2003 之间的邮件传输:

  • SMTP 协议服务   处理与远程 SMTP 主机和客户端的 SMTP 通信。此服务执行 Exchange 2003 支持的 SMTP 协议命令。
  • 存储驱动程序   使 SMTP 服务可以与 Exchange 存储进行通信,以保存通过 SMTP 服务传递的邮件。存储驱动程序还处理到本地收件人的邮件传递。
  • 高级队列引擎   为邮件传递、路由和中继提供队列管理和逻辑。
  • 分类程序   为入站邮件和出站邮件提供分类服务,例如使用轻型目录访问协议 (LDAP) 和 Active Directory 的通讯组列表扩展。
  • 路由引擎   为将出站邮件传递到正确的邮件连接器提供所需的路由逻辑。
  • 队列管理器   管理链路队列,用于存储等待传输到下一个远程目标的邮件。

图 2 显示邮件如何通过 SMTP 服务的组件传递。

21faab23-61f3-4c77-a662-20449189a037

按照以下顺序检查 SMTP 邮件流:

  1. 检查 SMTP 日志   启用 SMTP 日志记录时,按照本主题前面所述,验证来自远程主机的邮件是否成功地传输到本地 SMTP 协议服务,或来自本地 SMTP 协议服务的邮件是否成功地传输到远程主机。以下是日志清单示例,显示前面讨论的 Telnet 通信的结果:
    #Software: Microsoft Internet Information Services 6.0
    #Version: 1.0
    #Date: 2003-11-30 22:33:03
    #Fields: date time c-ip cs-username s-sitename s-computername s-ip s-port cs-method cs-uri-stem cs-uri-query sc-status sc-win32-status sc-bytes cs-bytes time-taken cs-version cs-host cs(User-Agent) cs(Cookie) cs(Referer)
    2003-11-30 22:33:03 192.168.202.223 - SMTPSVC1 SERVER01 192.168.202.199 0 HELO - - 250 0 50 4 10 SMTP - - - -
    2003-11-30 22:34:05 192.168.202.223 - SMTPSVC1 SERVER01 192.168.202.199 0 MAIL - +FROM:<user@contoso.com> 250 0 41 28 40 SMTP - - - -
    2003-11-30 22:35:03 192.168.202.223 - SMTPSVC1 SERVER01 192.168.202.199 0 RCPT - +TO:<Administrator@contoso.com> 250 0 38 35 10 SMTP - - - -
    2003-11-30 22:37:42 192.168.202.223 - SMTPSVC1 SERVER01 192.168.202.199 0 DATA - <SERVER01MTwKnhoKQXw00000001@server01.contoso.com> 250 0 133 30 134223 SMTP - - - -
    2003-11-30 22:38:16 192.168.202.223 - SMTPSVC1 SERVER01 192.168.202.199 0 QUIT - - 240 331987 69 4 10 SMTP - - - -

  2. 检查“暂缓提交的邮件”队列   在 Exchange 系统管理器中,在“队列”容器中选择“暂缓提交的邮件”,然后单击“查找邮件”。SMTP 协议服务接受并确认邮件后,会将邮件放入此队列。“暂缓提交的邮件”队列也称为预提交队列,因此此队列中的邮件尚未由分类程序进行处理。预提交队列是进入高级队列引擎的入口点。

    note注意:
    如果邮件在预提交队列中不断堆积,则可能表明存在性能问题。偶尔的 CPU 性能峰值可能会使邮件间歇性地出现在此队列中。事件接收器的问题(例如,用于防病毒屏蔽和免责声明的自定义 SMTP 处理代码)通常会导致邮件在此队列中堆积。
  3. 检查“等待目录查找的邮件”队列   高级队列引擎将预提交队列中的邮件放入此队列,以便分类程序进行处理。“等待目录查找的邮件”队列也称为预分类队列,因为此队列是分类程序的调节队列。“等待目录查找的邮件”队列包含邮件,而分类程序根据 Active Directory 解析发件人和收件人信息,展开通讯组列表,检查限制,并应用每个发件人和收件人的限制等等。
    如果分类程序无法处理邮件,则这些邮件可能会在预分类队列中堆积。分类程序可能无法访问全局编录来访问收件人信息,或者执行全局编录查找的速度可能很慢。在前端服务器上,如果禁用了 Exchange 存储,则邮件也会保留在“等待目录查找的邮件”队列中。建议您在前端服务器上将 Exchange Information Store 服务保持为运行状态,以便能够成功地处理邮件。
    如果要获取有关分类程序处理的信息,请为 MSExchangeDSAccess 和 MSExchangeTransport 服务提高事件日志记录的级别。将所有类别的日志记录级别设置为“最高”,以获取最详细的信息。

    note注意:
    将诊断日志记录级别设置为“最高”可能会造成大量的事件写入应用程序事件日志。最佳做法是,将应用程序事件日志和系统事件日志的大小设置为 30 MB,并根据需要启用覆盖事件的选项。请记住,在完成连接器测试之后,重新应用默认设置“无”。
  4. 检查“本地传递”队列   收件人邮箱位于本地 Exchange 2003 服务器上时,邮件分类程序会将收件人标记为本地,方法是设置每个收件人的属性,此属性根据收件人的 homeMDB 属性指示目标服务器,该属性指向收件人邮箱所处的专用存储。(此时,邮件位于分类后队列中。)对于本地收件人,将跳过路由,高级队列引擎将邮件传输到“本地传递”队列,Exchange 存储驱动程序从该队列获取邮件,将其传递到本地 Exchange 邮箱。如果 Exchange Information Store 服务不接受邮件或性能出现问题,则邮件会在此队列中堆积。要在应用程序事件日志中获取有关邮件在“本地传递”队列中堆积的原因的详细信息,可以为 MSExchangeIS 服务和 MSExchangeTransport 服务启用诊断日志记录。

  5. 检查“等待路由的邮件”队列   此队列存放进行远程传递的邮件。高级队列引擎将非本地收件人的邮件从分类后队列传输到此队列中,此队列也称为预路由队列。然后,高级队列引擎调用路由引擎来将邮件移动到各自的链路队列。如果存在路由问题,则邮件可能会在预路由队列中堆积。如果邮件在预路由队列中堆积,则提高“路由”类别的 MSExchangeTransport 服务的诊断日志记录级别,以便获取更多信息。

  6. 检查远程传递(链路)队列   链路队列本身是动态的,由队列管理器组件管理。队列名称与远程传递目标匹配。如果队列处于重试状态(即已发生连接尝试失败),则使用 Telnet.exe 尝试连接到目标主机,如本节前面所述。要立即重新尝试发送排队的邮件,请重新启动虚拟 SMTP 服务器。

  7. 检查“具有无法送达目标的邮件”队列   此队列中的邮件无法到达其最终的目标服务器。例如,Exchange 无法确定到最终目标的路由或连接器,或者所有可用路由或连接器都标记为关闭。检查 Exchange 2003 组织中的路由配置,以确保至少有一个到该目标的连接器可用。要重新尝试发送排队的邮件,请重新启动虚拟 SMTP 服务器。

  8. 检查“正在排队等待稍后传递的邮件”队列   此队列包含排队等待稍后传递的邮件。设置此选项时,“正在排队等待稍后传递的邮件”队列包含由旧版本的 Microsoft Outlook(例如 Microsoft Outlook 2000)发送的邮件。在较新版本的 Outlook 中,这些类型的邮件在 Exchange 存储中排队。在安排的传递时间之前,邮件将保留在“正在排队等待稍后传递的邮件”队列中。邮件可以在此队列中结束的其他原因包括:

    • 邮件被发送到一个已发生移动的用户邮箱。
    • 用户还没有邮箱,并且没有与该用户关联的主帐户安全标识符 (SID)。有关详细信息,请参阅知识库文章 316047“XADM: Addressing Problems That Are Created When You Enable ADC-Generated Accounts”(英文)(https://go.microsoft.com/fwlink/?linkid=3052&kbid=316047)。
    • SMTP 邮件路由的配置方式使邮件出现循环。SMTP 将循环邮件移入此队列,所以,可以在没有立即返回 NDR 的邮件的情况下解决问题。将邮件移动到“正在排队等待稍后传递的邮件”队列还有助于防止影响服务器资源的性能。
  9. 检查“暂缓提交的 DSN 邮件”队列   此队列包含正在等待 Exchange 生成的传递状态通知 (DSN)。例如 NDR 就是传递状态通知。在下列情况下,邮件可能会在“暂缓提交的 DSN 邮件”队列中堆积:

    • Information Store 服务不可用或未运行。
    • 专用存储未装入。
    • IMAIL Exchange 存储组件存在问题。IMAIL 是执行邮件转换的组件。
      要在应用程序事件日志中获取有关邮件在“暂缓提交的 DSN 邮件”队列中堆积的原因的详细信息,请提高 MSExchangeIS 服务的所有类别的诊断日志记录级别。

检查“重试已失败邮件”队列   此队列包含队列提交失败的邮件。邮件可能由于几个原因而导致队列提交失败,并且失败可能发生在执行其他任何处理之前。如果邮件被破坏或系统资源不足,则邮件将出现在此队列中。如果邮件出现在“重试已失败邮件”队列中,请检查服务器配置,以确定是否安装了可能会干扰邮件排队的非 Microsoft 程序或事件接收器,例如病毒扫描程序。如果计算机响应速度缓慢,则使用 Windows 任务管理器来确定占用过多系统资源的进程。在确定问题的根本原因之前,重新启动 Internet 信息服务 (IIS) Admin 服务可能会得到暂时的缓解。默认情况下,“重试已失败邮件”队列中的邮件将每 60 分钟重新处理一次。