Sun Java System Messaging Server 6 2005Q4 管理指南

第 8 章 MTA 概念

本章提供了 MTA 的概念性描述。其中包含以下各节:

MTA 功能

邮件传输代理(即 MTA)是 Messaging Server 的组件(图 8–1)。在最基础的级别上,MTA 是邮件路由器。它从其他服务器接受邮件、读取地址并将其路由到通往最终目的地(通常是用户邮箱)的过程中的下一个服务器。

这些年来,MTA 已增加了许多功能,其大小、功能和复杂性都有所增加。这些 MTA 功能有重叠,但一般情况下,可以分为以下几类:

图 8–2 中显示了支持这些功能的一系列子组件和进程。本章介绍了这些子组件和进程。此外,还介绍了若干允许系统管理员启用和配置这些功能的工具。这些工具包括 MTA 选项、configutil 参数、映射表、关键字、通道和重写规则。将在后面的 MTA 章节中进行介绍:

图 8–1 Messaging Server,简化后的组件视图(未显示 Communications Express)

此图形显示了简化后的 Messaging Server 视图。

图 8–2 MTA 体系结构

此图形显示了简化后的 MTA 体系结构和数据流。

MTA 体系结构和邮件流概述

此部分简要概述了 MTA 体系结构和邮件流(图 8–2)。请注意,MTA 是一个非常复杂的组件,而此图只是对邮件通过该系统的简要说明。事实上,此图并不是所有流经该系统的邮件的非常准确的说明。但对于概念性的讨论,这已经足够了。

分发程序和 SMTP 服务器(从程序)

邮件通过 SMTP 会话从 Internet 或内部网进入 MTA。当 MTA 收到要求进行 SMTP 连接的请求时,MTA 分发程序(多线程连接分发代理)将执行一个程序 (tcp_smtp_server) 以处理 SMTP 会话。分发程序将为每个服务维护多线程进程池。请求其他会话时,分发程序将激活一个 SMTP 服务器程序以处理每个会话。分发程序的进程池中的进程可能会同时处理许多连接。分发程序和从程序将一起对每个外来邮件执行许多不同的功能。其中三个主要功能是:

有关更多信息,请参见分发程序

路由和地址重写

SMTP 服务器和许多其他通道(包括转换通道和再处理通道)均可将邮件加入队列。此传送阶段完成了许多任务,其中的主要任务是:

通道

通道是用于处理邮件的基本 MTA 组件。通道表示邮件与另一个系统的连接(例如,另一个 MTA、另一个通道或本地邮件存储)。邮件传入时,根据邮件的源和目的地,不同的邮件需要不同的路由和处理。例如,要传送到本地邮件存储的邮件与要传送到 Internet 的邮件以及要发送到邮件系统内的另一个 MTA 的邮件,将以不同的方式进行处理。通道提供了用于自定义每个连接所需的处理和路由的机制。在默认安装中,大多数邮件转至处理 Internet、内部网和本地邮件的通道。

也可以创建用于特定情况的专门通道。例如,假设某个 Internet 域处理邮件非常缓慢,导致发到此域的邮件阻塞了 MTA。便可以创建一个专门的通道对发到该慢速域的邮件提供特殊处理,从而消除此域中系统的障碍。

地址的域部分将确定邮件要排入哪个通道。用于读取域和确定正确通道的机制称为重写规则(请参见重写规则)。

通道通常由一个通道队列和一个通道处理程序(称为主程序)组成。从程序将邮件传送到适当的通道队列后,主程序将执行所需的处理和路由。通道和重写规则一样,都是在 imta.cnf 文件中指定和配置的。以下所示为一个通道条目的示例:


tcp_intranet smtp mx single_sys subdirs 20 noreverse maxjobs 7 SMTP_POOL
maytlsserver allowswitchchannel saslswitchchannel tcp_auth
tcp_intranet-daemon

此例中的第一个字 tcp_intranet 是通道名称。最后一个字称为通道标记。中间的字称为通道关键字,它们指定了将如何处理邮件。许多不同的关键字允许用许多方式处理邮件。第 12 章,配置通道定义中提供了对通道关键字的完整描述。

邮件传送

邮件经过处理后,主程序将邮件沿着邮件的传送路径发送到下一个停靠站。这可能是预期收件人的邮箱、另一个 MTA,甚至也可能是其他通道。虽然图中未显示,但转发到另一个通道的情况经常发生。

请注意,地址的本地部分和接收的字段通常是 7 位字符。如果 MTA 在这些字段中读到 8 位字符,它将把每个 8 位字符替换为星号。

分发程序

分发程序是一个多线程的分发代理,能够使多个多线程服务器进程共同负责提供 SMTP 连接服务。使用分发程序时,可以同时运行若干个多线程 SMTP 服务器进程,并且所有处理均与同一个端口连接。此外,每个服务器可能会有一个或多个活动连接。

分发程序充当在其配置中列出的 TCP 端口的中心接收程序。对于每个已定义的服务,分发程序可能会创建一个或多个 SMTP 服务器进程,在建立了连接之后处理这些连接。

通常,当分发程序接收到已定义的 TCP 端口的连接时,将为该端口上的服务检查可用的工作进程池并为新的连接选择最佳候选池。如果没有合适的候选池,则在配置允许的情况下,分发程序可能会创建一个新的工作进程以处理此连接和以后的连接。分发程序也可能会为预期的将来外来连接创建新的工作进程。有若干配置选项可用于调整各种服务中分发程序的控制,特别是控制工作进程的数量以及每个工作进程所处理的连接的数量。

有关更多信息,请参见分发程序配置文件

服务器进程的创建和终止

分发程序内的自动内务处理功能控制着新服务器进程的创建和旧的或闲置的服务器进程的终止。控制分发程序性能的基本选项为 MIN_PROCSMAX_PROCSMIN_PROCS 通过使若干服务器进程准备就绪并等待传入连接,提供了一种保证级别的服务。另一方面,MAX_PROCS 设置了对于给定服务可以同时运行的服务器进程数量的上限。

当前运行的服务器进程可能不能接收任何连接,因为它处理的连接已经达到其所能处理的最大数量,或者此进程已被安排终止。分发程序可能会创建其他进程以帮助将来的连接。

MIN_CONNSMAX_CONNS 选项提供了一种有助于在服务器进程之间分发连接的机制。MIN_CONNS 指定了将服务器进程标记为“足够忙”时连接的数量;而 MAX_CONNS 指定了服务器进程达到“最忙”时连接的数量。

通常,当前服务器进程数量少于 MIN_PROCS 或所有现有服务器进程均为“足够忙”(每个进程具有的当前活动连接数量至少为 MIN_CONNS)时,分发程序将创建一个新的服务器进程。

如果服务器进程意外中止(例如,通过 UNIX 系统的 kill 命令),则分发程序仍将在新连接传入时创建新的服务器进程。

有关配置分发程序的信息,请参见分发程序配置文件

启动和停止分发程序

要启动分发程序,请执行以下命令:

start-msg dispatcher

此命令涵盖以前用于启动 MTA 组件(已经配置了分发程序以进行管理)的任何其他 start-msg 命令的功能,将不再使用这些旧有的命令。特别是,不应再使用 imsimta start smtp 命令。尝试执行任何已废弃的命令将导致 MTA 发出警告。

要关闭分发程序,请执行以下命令:

stop-msg dispatcher

关闭分发程序时,服务器进程发生的情况取决于基本的 TCP/IP 软件包。如果修改了用于分发程序的 MTA 配置或选项,则必须重新启动分发程序以便使新配置或选项生效。

要重新启动分发程序,请执行以下命令:

imsimta restart dispatcher

重新启动分发程序与关闭当前运行的分发程序再立即启动新的分发程序具有同样的效果。

重写规则

重写规则用于回答以下问题:

每个重写规则均由一个模式和一个模板组成。模式是与地址的域部分匹配的字符串。模板指定了域部分与模式匹配时采取的操作。它由以下两部分组成:1) 一组指定应如何重写地址的说明(即,一个由控制字符组成的字符串)和 2) 邮件将发送到的通道的名称。重写地址后,邮件将排入目标通道,以传送到预期收件人。

以下所示为一个重写规则的示例:

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

siroe.com 是域模式。地址中包含 siroe.com 的所有邮件都将按照模板说明 ($U%$D) 被重写。$U 指定重写的地址使用相同的用户名。% 指定重写的地址使用相同的域分隔符。$D 指定重写后的地址使用与模式匹配的相同域名。@tcp_siroe-daemon 指定将带有重写地址的邮件发送至名为 tcp_siroe-daemon 的通道。有关详细信息,请参见第 11 章,配置重写规则

有关配置重写规则的更多信息,请参见MTA 配置文件第 11 章,配置重写规则

通道

通道是用于处理邮件的基本 MTA 组件。通道表示与另一个计算机系统或系统组的连接。各个通道中实际的硬件连接或软件传输或者这两者,可能大大不同。

通道执行以下功能:

邮件在进入 MTA 的过程中由通道排队,离开 MTA 的过程中被取消排队。通常,邮件经由一个通道进入,然后通过另一个通道离开。通道可以将邮件取消排队、处理邮件或将邮件排入另一个 MTA 通道。

主程序和从程序

通常(并非总是),通道与两个程序相关联:主程序和从程序。从程序从其他系统接收邮件并将其添加至通道的邮件队列中。主程序将邮件从通道传输到其他系统。

例如,SMTP 通道有一个用来传输邮件的主程序和一个用来接收邮件的从程序。分别为 SMTP 客户机和服务器。

主通道程序通常在 MTA 已启动操作的地方负责外发的连接。主通道程序:

从通道程序通常在 MTA 响应外部请求的地方接受外来连接。从通道程序:

例如,图 8–3 显示了两个通道程序,Channel 1 和 Channel 2。Channel 1 中的从程序从远程系统接收邮件。它将查看地址,根据需要应用重写规则,然后基于重写的地址将邮件排入适当的通道邮件队列。

主程序从队列中将邮件取消排队并启动邮件的网络传输。请注意,主程序只能将邮件从其自己的通道队列中取消排队。

图 8–3 主程序和从程序

此图形显示了主程序和从程序交互式操作。

虽然典型通道有一个主程序和一个从程序,但也有可能一个通道仅包含一个从程序一个主程序。例如,Messaging Server 提供的 ims-ms 通道仅包含一个主程序,因为此通道仅负责将邮件从队列退回到本地邮件存储系统,如图 8–4 所示。

图 8–4 ims-ms 通道

此图形显示了 ims-ms 通道。

通道邮件队列

所有通道均具有邮件队列与其关联。邮件进入邮件服务系统时,从程序确定将此邮件排入哪个邮件队列。排入的邮件存储在通道队列目录的邮件文件中。默认情况下,这些目录存储在以下位置:msg_svr_base/data/queue/channel /*。有关调整邮件队列大小的信息,请参见 《Sun Java System Communications Services 6 2005Q4 Deployment Planning Guide》中的“Disk Sizing for MTA Message Queues”


注意 – 注意 –

请勿在 MTA 队列目录(即 imta_tailor 文件中 IMTA_QUEUE 的值)中添加任何文件或目录,因为这样会出现问题。将单独的文件系统用于 MTA 队列目录时,请在该安装点下创建子目录并将该子目录指定为 IMTA_QUEUE 的值。


通道定义

通道定义显示在 MTA 配置文件 (imta.cnf) 的下半部分,在重写规则之后(请参见MTA 配置文件中的规则部分和通道定义的开始部分)。

通道定义包含通道的名称(后跟一个定义通道配置的可选关键字列表)和唯一的通道标记(在重写规则中将使用该标记将邮件路由到该通道)。通道定义由单个空白行分隔。通道定义中可能会有注释,但不会有空白行。


[blank line]
! sample channel definition
Channel_Name keyword1 keyword2
Channel_Tag
[blank line]

多个通道定义在一起被称为通道主机表。单个通道定义被称为通道块。例如,在以下示例中通道主机表包含三个通道定义(块)。


! test.cnf - An example configuration file.
!
! Rewrite Rules
      .
      .
      .

! BEGIN CHANNEL DEFINITIONS
! FIRST CHANNEL BLOCK
l
local-host

! SECOND CHANNEL BLOCK
a_channel defragment charset7 usascii
a-daemon

! THIRD CHANNEL BLOCK
b_channel noreverse notices 1 2 3
b-daemon

典型的通道条目类似如下:


tcp_intranet smtp mx single_sys subdirs 20 noreverse maxjobs 7 SMTP_POOL
maytlsserver allowswitchchannel saslswitchchannel tcp_auth
tcp_intranet-daemon

此例中第一个字 tcp_intranet 是通道名称。此例中的最后一个字 tcp_intranet-daemon 称为通道标记。通道标记是重写规则用来定向邮件的名称。通道名称和通道标记之间的字称为通道关键字,用于指定如何处理邮件。许多不同的关键字允许用许多方式处理邮件。在第 12 章,配置通道定义中列出并介绍了通道关键字的完整列表。

通道主机表定义了 Messaging Server 可以使用的通道以及与每个通道相关联的系统的名称。

在 UNIX 系统上,文件中的第一个通道块往往是本地通道 l。(特殊情况是 defaults 通道,它可以出现在本地通道之前。)本地通道用于决定路由和发送由 UNIX 邮件工具发送的邮件。

也可以在 MTA 选项文件 option.dat 中为通道设置全局选项,或在通道选项文件中为特定通道设置选项。有关选项文件的更多信息,请参见选项文件TCP/IP (SMTP) 通道选项文件。有关配置通道的详细信息,请参见第 12 章,配置通道定义。有关创建 MTA 通道的更多信息,请参见MTA 配置文件

MTA 目录信息

对于 MTA 要处理的每封邮件,MTA 均需要访问有关其支持的用户、组和域的目录信息。此信息是在提供 LDAP 目录服务时存储的。MTA 直接访问 LDAP 目录。第 9 章,MTA 地址转换和路由中对此进行了完整说明。

作业控制器

每次将邮件排入通道时,作业控制器均确保有一个运行的作业以传送该邮件。这可能涉及启动一个新作业进程、添加一个线程或只是通知一个作业已经在运行。如果因为已达到通道或池的作业限制而不能启动作业,则作业控制器将等待直到其他作业退出。不再超出作业限制时,作业控制器将启动其他作业。

通道作业在作业控制器内的处理池中运行。可以将池看作是一个运行通道作业的“地方”。池提供了一个计算区域,一组作业可以在其中运行而不与池外的作业竞争资源。有关池的更多信息,请参见作业控制器文件用于通道执行作业的处理池

通道的作业限制由 maxjobs 通道关键字确定。池的作业限制由池的 JOB_LIMIT 选项确定。

Messaging Server 通常尝试立即传送所有邮件。如果在第一次尝试传送邮件时未将其送出,则将延迟一段时间再次发送该邮件,该时间由相应的 backoff 关键字确定。一旦过了 backoff 关键字中指定的时间,就可以传送延迟的邮件,并且如果需要,将启动通道作业来处理该邮件。

内存中当前正在处理和等待处理的邮件的作业控制器数据结构,通常反映了存储在磁盘的 MTA 队列区域上的完整邮件文件集。但是,如果磁盘上待处理的邮件文件累计超出了作业控制器的内存中数据结构大小的限制,则作业控制器仅在内存中跟踪磁盘上的邮件文件总数的一部分。作业控制器仅处理那些它正在内存中跟踪的邮件。传送足够数量的邮件,释放足够的内存中存储空间后,作业控制器将通过扫描 MTA 队列区域以更新其邮件列表来自动刷新其内存中存储。然后作业控制器开始处理其他刚从磁盘检索的邮件文件。作业控制器自动执行对 MTA 队列区域的这些扫描。

如果您的站点日常要处理大量邮件,则您需要使用 MAX_MESSAGES 选项调整作业控制器。通过增大 MAX_MESSAGES 选项值来允许作业控制器使用更多内存,可以减少待处理邮件溢出作业控制器的内存中高速缓存的次数。这减少了作业控制器必须扫描 MTA 队列目录时有关的系统开销。但是请记住,当作业控制器必须要重建内存中高速缓存时,由于高速缓存增大,进程将花费更长时间。也请注意,因为每次启动或重新启动作业控制器时,它必须扫描 MTA 队列目录,所以大的待处理邮件意味着作业控制器的启动或重新启动将比没有此类待办事项存在时需要更多开销。

有关池和配置作业控制器的信息,请参见作业控制器文件配置邮件处理和传送

启动和停止作业控制器

要启动作业控制器,请执行以下命令:

start-msg job_controller

要停止作业控制器,请执行以下命令:

stop-msg job_controller

要重新启动作业控制器,请执行以下命令:

imsimta restart job_controller

重新启动作业控制器与关闭当前运行的作业控制器再立即启动新的作业控制器具有同样效果。