Sun Java System Messaging Server 6.3 管理指南

26.3.6 邮件未被排出队列

在 TCP/IP 传送期间遇到的错误通常是瞬态的,遇到问题时 MTA 通常会保留邮件并定期重试传送。在大型网络的特定主机上遇到周期性故障而其他主机连接运行完好,这是正常的。要验证该问题,请检查日志文件以查看与传送尝试相关的错误。您可能会看到错误消息,例如“来自 smtp_open 的致命错误”。此类错误很常见并通常与瞬态网络问题相关联。要调试 TCP/IP 网络问题,请使用诸如 PING、TRACEROUTE 和 NSLOOKUP 之类的实用程序。

以下示例显示了要查看邮件停留在等待传送到 xtel.co.uk 的队列中的原因时可能使用的步骤。要确定邮件未被排出队列的原因,可以创建 MTA 用于在 TCP/IP 上传送 SMTP 邮件的步骤。


% nslookup -query=mx xtel.co.uk (步骤 1)
            
Server: LOCALHOST
Address: 127.0.0.1

Non-authoritative answer:
XTEL.CO.UK  preference = 10, mail exchanger = nsfnet-relay.ac.uk (步骤 2)

% telnet nsfnet-relay.ac.uk 25 (步骤 3)
Trying... [128.86.8.6]
telnet: Unable to connect to remote host: Connection refused
  1. 使用 NSLOOKUP 实用程序以查看此主机的 MX 记录(如果有)。如果没有 MX 记录,则应尝试直接连接到主机。如果确实有 MX 记录,则必须连接到指定的 MX 中继。MTA 优先使用 MX 信息,除非明确地配置为不这样做。另请参见12.4.3.5 TCP/IP MX 记录支持

  2. 在此示例中,DNS(Domain Name Service,域名服务)为 xtel.co.uk 返回了指定的 MX 中继的名称。这是 MTA 将实际连接到的主机。如果列出了不止一个 MX 中断,则 MTA 将连续尝试每个 MX 记录,首先尝试最低的首选项值。

  3. 如果与远程主机之间确实存在连接,则应该通过 TELNET 连接到 SMTP 服务器端口 25 以检查远程主机是否接受外来 SMTP 连接。


    注 –

    如果使用 TELNET 时未指定端口,您将发现远程主机接受常规 TELNET 连接。这并不表示远程主机接受 SMTP 连接,许多系统接受常规 TELNET 连接但拒绝 SMTP 连接(反之亦然)。因此,您应该始终在 SMTP 端口上进行测试。


    在上一个示例中,远程主机拒绝连接到 SMTP 端口。这就是 MTA 无法传送邮件的原因。连接可能被拒绝是由于远程主机的错误配置或远程主机上的某种资源的耗尽。在这种情况下,无法在本地进行任何操作以解决该问题。通常应该让 MTA 继续重试对邮件进行操作。

如果在未使用 DNS 的 TCP/IP 网络上运行 Messaging Server,则可以跳过前两步。而可以使用 TELNET 以直接访问所述主机。要注意与 MTA 使用同一个主机名。查看 MTA 上一次尝试的相关日志文件以确定主机名。如果使用的是主机文件,则应该确保主机名信息正确。强烈建议使用 DNS 而不使用主机名。

请注意,如果使用交互式测试测试与 TCP/IP 主机的连接性时未遇到任何问题,则问题很可能在 MTA 上次尝试传送邮件后就已经完全解决了。您可以在相应的通道上重新运行 imsimta submit tcp_channel 以查看邮件是否正在被排出队列。

26.3.6.1 创建新通道

在某些情况下,某个远程域可能出现故障,发送到该服务器的邮件数量可能会很大,以致外发通道队列将被无法传送的邮件填满。MTA 会尝试定期重新传送这些邮件(重试的频率和次数可以使用 backoff 关键字进行配置),正常情况下,不需要进行任何操作。但是,如果太多邮件阻塞在队列中,则其他邮件可能无法及时传送,因为所有通道作业都在处理积压的无法传送的邮件。

在这种情况下,您可以将这些邮件重新路由到在其自己的作业控制器池中运行的新通道。这将避免处理资源的争用并允许其他通道传送其邮件。下面介绍了此过程。我们先假定一个名为 siroe.com 的域。

Procedure创建新通道

  1. 创建名为 tcp_siroe-daemon 的新通道并为 pool 关键字添加新值。

    /msg-svr-base/ config/imta.cnf 的通道块部分创建通道。该通道与常规外发 tcp_* 通道应具有相同的通道关键字。通常,该通道是处理所有出站 (Internet) 通信的 tcp_local 通道。由于 siroe.com 在 Internet 上,因此这就是要模仿的通道。新通道可能类似于如下所示:

    tcp_siroe smtp nomx single_sys remotehost inner allowswitchchannel     \
    dentnonenumeric subdirs 20 maxjobs 7 pool SMTP_SIROE maytlsserver      \
    maysaslserver saslswitchchannel tcp_auth missingrecipientpolicy 0      \    
    tcp_siroe-daemon

    注意新关键字-值对池 SMTP_SIROE。它指定传送到此通道的邮件将仅使用 SMTP_SIROE 池的计算机资源。另请注意,新通道的前后都需要留一个空白行。

  2. 将两个重写规则添加到 imta.cnf 文件的重写规则部分以将发往 siroe.com 的电子邮件定向到新通道。

    新重写规则类似于如下所示:


    siroe.com     $U%$D@tcp_siroe-daemon
    .siroe.com      $U%$H$D@tcp_siroe-daemon
                         

    这些重写规则将发往 siroe.com(包括如 host1.siroe.com 或 hostA.host1.siroe.com 的地址)的邮件定向到正式主机名为 tcp_siroe-daemon 的新通道。这些规则的重写部分,$U%$D 和 $U%$H$D,将保留邮件的原始地址。$U 复制原始地址的用户名。% 为分隔符,@ 位于用户名和域之间。$H 复制主机/域说明的不匹配部分(位于模式中点的左侧)。$D 复制域说明的匹配部分。

  3. 定义名为 SMTP_SIROE 的新作业控制器池。

    /msg-svr-base/ config/job_controller.cnf 中添加以下内容:


    [POOL=SMTP_SIROE]
    job_limit=10
                         

    这将创建名为 SMTP_SIROE 的邮件资源池,该池最多可以允许 10 个作业同时运行。确保没有在该池定义和其他项之间留下任何空白行。有关作业和池的详细信息,请参见8.7 作业控制器

  4. 重新启动 MTA。

    发出以下命令:imsimta cnbuild;imsimta restart

    该命令重新编译配置并重新启动作业控制器和分发程序。

    本示例中,内部用户的大量电子邮件被发往名为 siroe.com 的特定远程站点。由于某些原因,siroe.com 临时不能接受外来 SMTP 连接,因此无法传送电子邮件。(此类情况并不是只在极少数情况下才发生。)

    发往 siroe.com 的电子邮件传入时,外发通道队列(通常为 tcp_local)将被无法传送的邮件填满。MTA 会尝试定期重新传送这些邮件(重试的频率和次数可以使用 backoff 关键字进行配置),正常情况下,不需要进行任何操作。

    但是,如果太多邮件阻塞在队列中,则其他邮件可能无法及时传送,因为所有通道作业都在处理积压的 siroe.com 邮件。在这种情况下,您可能希望将 siroe.com 邮件重新路由到在其自身的作业控制器池中运行的新通道(请参见8.7 作业控制器)。这将允许其他通道传送它们的邮件,而无需争用 siroe.com 邮件所使用的处理资源。下面将介绍如何创建新通道以解决此问题。