您可以配置服务器何时基于特定条件尝试传送邮件。您也可以为作业处理指定参数,例如服务作业的处理限制或何时产生新的 SMTP 通道线程。本节说明了以下内容:
有关邮件处理和传送的概念信息,请参见表 12–24。
配置邮件处理和传送 汇总了本节中说明的关键字。
表 12–24 邮件处理和传送关键字
关键字 |
定义 |
---|---|
立即传送 |
定义邮件立即传送的规范。 |
紧急、正常和不紧急邮件提交后,立即开始传送。 |
|
通道方向性 |
指定为通道服务的程序的类型 |
bidirectional |
主程序和从程序为通道服务。 |
主 |
主程序 (master) 为通道服务。 |
从 |
从程序 (slave) 为通道服务。 |
延迟传送 |
指定延迟作业的传送规范。 |
指定尝试重新传送延迟邮件的频率。可以被 normalbackoff、nonurgentbackoff、urgentbackoff 覆盖。 |
|
识别 Deferred-delivery: 标题行并使其生效。 |
|
默认设置。指定不使 Deferred-delivery: 标题行生效。 |
|
尝试重新传送非紧急邮件的频率。 |
|
尝试重新传送普通邮件的频率。 |
|
尝试重新传送紧急邮件的频率。 |
|
基于大小的邮件优先级 |
定义基于邮件大小的邮件优先级。 |
将超过此大小的邮件强制降到非紧急优先级(二类优先级)以下,意味着邮件将始终等待下一个周期的作业以进一步处理。 |
|
将超过此大小的邮件强制降到非紧急优先级。 |
|
将超过此大小的邮件强制降至普通优先级。 |
|
用于通道执行作业的处理池 |
指定用于处理有各种作业紧急程度和延迟时间的邮件的池 |
指定通道在其中运行的池。 |
|
指定通道运行前的时间延迟。 |
|
服务作业限制 |
指定服务作业的数量和每个作业中处理的邮件文件的最大数量 |
指定可以同时为通道运行的作业的最大数量。 |
|
指定将由单个作业处理的队列条目的数量。 |
|
SMTP 通道线程 | |
使用多线程 SMTP 客户机触发新线程的邮件的数目。 |
|
多个地址扩展 |
定义对具有多个收件人的邮件的处理 |
地址数目超过此限制时,“脱机”处理外来邮件。 |
|
指定由于应用 expandlimit 而在其中执行延迟扩展的通道。 |
|
地址数目超过此限制时保留外来邮件。 |
|
事务限制 |
指定连接事务限制 |
transactionlimit |
限制每个连接允许的邮件数目。 |
无法传送邮件的通知 |
指定何时发送无法传送邮件的通知。 |
指定在发送通知和返回邮件之前可能经过的时间。 |
|
指定在发送通知和返回非紧急优先级邮件前可能经过的时间。 |
|
指定在发送通知和返回普通优先级邮件前可能经过的时间。 |
|
指定在发送通知和返回紧急优先级邮件之前可能经过的时间。 |
关键字:master、slave、bidirectional
这些关键字用于指定通道是由主程序 (master) 或从程序 (slave) 还是这两者 (bidirectional) 为其服务。如果不指定关键字,则默认设置为 bidirectional。这些关键字确定当邮件在通道中排队时,MTA 是否启动传送活动。
这些关键字的使用反映了相应通道程序的某些基本特性。MTA 支持的各种通道的说明表明了应该在何时何处使用这些关键字。
关键字:deferred、nodeferred、immnonurgent
deferred 通道关键字实现 Deferred-delivery: 标题行的识别和生效。具有 deferred 将来传送日期的邮件将保留在通道队列中,直到过期并返回,或者到达延迟传送日期。有关 Deferred-delivery: 标题行格式和操作的详细信息,请参见 RFC 1327。
关键字 nodeferred 是默认设置。请务必注意,尽管 RFC 1327 强制支持对延迟邮件的处理,但事实上该功能的实际实现使人们将邮件系统用作其磁盘配额的扩展。
提交紧急、正常和不紧急邮件后,关键字 immnonurgent 将立即开始传送。
关键字:backoff、nonurgentbackoff、normalbackoff、urgentbackoff、notices
默认情况下曾经传送失败的邮件的传送重试的频率取决于邮件的优先级。传送尝试之间的默认间隔(以分钟计)如下所示。优先级后面的第一个数字表示初始传送失败后经过多少分钟进行第一次传送重试:
urgent: 30, 60, 60, 120, 120, 120, 240 normal: 60, 120, 120, 240, 240, 240, 480 nonurgent: 120, 240, 240, 480, 480, 480, 960
对于紧急邮件,初始传送失败后过 30 分钟尝试重试,第一次传送重试后过 60 分钟重试,第二次重试后过 60 分钟重试,第三次重试后过 120 分钟重试,等等。指定的最后一次尝试之后的重试将以同样的间隔进行。因此,对于紧急邮件来说,每 240 分钟重试一次。
传送尝试将在一定的时间周期内继续,该时间周期由关键字 notices、nonurgentnotices、normalnotices 或 urgentnotices 指定。如果无法进行成功的传送,则生成传送失败通知并将邮件返回给发件人。(有关 notices 关键字的详细信息,请参见设置通知邮件传送间隔。)
backoff 关键字可以使您能为不同优先级的邮件指定传送重试间隔的自定义设置。nonurgentbackoff 指定不紧急邮件的间隔。normalbackoff 指定正常邮件的间隔。urgentbackoff 指定紧急邮件的间隔。如果不指定上述关键字,backoff 将为所有邮件指定间隔,而不考虑优先级。
下面显示了一个示例:
urgentbackoff "pt30m" "pt1h" "pt2h" "pt3h" "pt4h" "pt5h" "pt8h" "pt16h"
此实例中,紧急邮件在初始传送失败后过 30 分钟尝试重新传送,第一次传送尝试后过 1 小时(初始失败后 1 小时 30 分钟)重试,第二次传送尝试后过 2 小时重试,第三次传送尝试后过 3 小时重试,第四次传送尝试后过 4 小时重试,第五次传送尝试后过 5 小时重试,第六次传送尝试后过 8 小时重试,第七次传送尝试后过 16 小时重试。之后每 16 小时进行一次尝试,直到 notices 关键字指定的时间周期结束。如果无法进行成功的传送,则生成传送失败通知并将邮件返回给发件人。请注意,间隔语法位于 ISO 8601P 中,Sun Java System Messaging Server Administration Reference 中对其进行了说明。
在接下来的示例中,
normalbackoff "pt30m" "pt1h" "pt8h" "p1d" "p2d” "p1w"
正常邮件在初始传送失败后过 30 分钟尝试重新传送,第一次传送尝试后过 1 小时重试,第二次尝试后过 8 小时重试,第三次尝试后过 1 天重试,第四次尝试后过 2 天重试,第五次尝试后过 1 周重试,之后每周重复一次,直到 notices 关键字指定的时间周期结束。如果无法进行成功的传送,则生成传送失败通知并将邮件返回给发件人。
在最后的示例中,
backoff "pt30m" "pt120m" "pt16h" "pt36h" "p3d"
无论邮件的优先级是什么,所有传送失败的邮件(除非被 nonurgentbackoff、normalbackoff 或 urgentbackoff 覆盖)将在初始传送失败后过 30 分钟重试,第一次重试后过 2 小时重试,第二次尝试后过 16 小时重试,第三次尝试后过 36 小时重试,第四次尝试后过 3 天重试,之后每 3 天重复一次,直到 notices 关键字指定的时间周期结束。如果无法进行成功的传送,则生成传送失败通知并将邮件返回给发件人。
通过让各种通道在同一池中运行,可以将各种通道配置为共享资源。您可能还希望配置其他通道,使其能够在专用于特定通道的池中运行。在每个池中,根据邮件的优先级将邮件自动分成不同的处理队列。池中高优先级的邮件在低优先级的邮件之前处理。(请参见基于大小的邮件优先级)
通过使用 pool 关键字,可以基于通道在通道中选择创建作业的池。pool 关键字后面必须跟池名称,当前通道的传送作业将应置于该池中。池的名称不能多于 12 个字符。
有关作业控制器的概念和配置的更多信息,请参阅作业控制器文件、作业控制器文件和服务作业限制。
每次将邮件加入通道队列时,作业控制器将确保存有一个运行的作业,用于传送邮件。这可能涉及启动一个新作业进程、添加一个线程或只是通知一个作业已经在运行。但是,单个服务作业可能不足以确保所有邮件的及时传送。(有关作业控制器的概念和配置的更多信息,请参阅作业控制器文件、用于通道执行作业的处理池和作业控制器。)
对于任何给定安装,都存在一个合理的为传送邮件而启动的进程和线程的最大数量。该最大数量取决于诸如处理器的数量、磁盘的速度以及连接的特性等因素。在 MTA 配置中,可以控制以下内容:
为给定通道启动运行的最大进程数(maxjobs 通道关键字)
启动新线程或新进程之前接收的排队邮件的数量(threaddepth 通道关键字)
为给定通道启动运行的最大进程数是通道中 maxjobs 设置的最小值,也是通道在其中运行的池的 JOB_LIMIT 设置的最小值。
假定需要处理一个邮件。通常作业控制器按照以下方法启动新进程:
如果不存在为通道运行的进程,而且未达到池作业限制,则作业控制器将启动新进程。
如果通道程序是单线程的,或者已经达到线程限制,并且待办事项增加到超过多个线程(由 threaddepth 指定),而通道和池作业限制均未达到,则作业控制器将启动新进程。
如果通道程序是多线程的,未达到线程限制,而待处理邮件增加到超过多个 threaddepth,则启动新线程。
特定于 SMTP 通道而言,当邮件加入不同主机的队列时,将启动新线程或新进程。因此,对于 SMTP 通道,作业控制器按照以下方法启动新进程。假定需要处理一个邮件,将进行以下操作:
如果不存在为 SMTP 通道运行的进程,并且未达到池限制,则作业控制器将启动新进程。
如果已经达到线程限制 (MAX_CLIENT_THREADS),邮件加入未被服务的主机队列,而且通道限制 (maxjobs) 和池作业限制 (JOB_LIMIT) 均未达到,则启动新进程。
如果未达到线程限制,邮件加入未被服务的主机队列,则启动新线程。
如果未达到线程限制,而加入队列的邮件使该主机的待处理邮件增加到超过多个 threaddepth,则启动新线程。
另请参见SMTP 通道线程。
filesperjob 关键字可用于使 MTA 创建附加服务作业。该关键字使用一个正整数参数,指定必须将多少队列条目(即文件)发送到关联的通道之后才能创建一个以上的服务作业用以处理队列条目。如果给定的值小于或等于零,则被解释为请求仅加入一个服务作业。不指定关键字等效于指定零。该关键字的效果将被最大化;计算的较大数量为实际创建的服务作业的数量。
filesperjob 关键字按给定值划分实际队列条目或文件的数量。请注意,给定邮件产生的队列条目的数量由许多因素控制,包括但不仅限于关键字 single 和 single_sys 的使用以及邮件列表中标题修改操作的规范。
maxjobs 关键字对于可以同时运行的服务作业的总数设置了上限。此关键字后面必须跟一个整数值,如果计算的服务作业的数量大于该值,则实际只创建 maxjobs 作业。如果未指定 maxjobs,则默认值为 100。通常将 maxjobs 值设置为小于或等于可以在任意服务池或通道使用的池中同时运行的作业的总数。
transactionlimit 限制每个连接允许的邮件数量。可以按照以下的方式使用此关键字来阻止攻击者:
攻击者可以通过 SMTP 进行连接并发送大量 RCPT TO 命令以尝试猜出合法的电子邮件地址。通过限制事务中允许的无效 RCPT TO 的数量,可以阻止这样的攻击。攻击者可能使用多个事务进行应答,但是通过 transactionlimit,您可以限制 SMTP 会话中允许的事务数量。攻击者可以使用多个会话,但是其成本是高昂的。可以使用连接限制以各种方式来限制会话的数量,使其成本在大多数情况下真正变得高昂。
但是,我们也必须付出代价。某些 SMTP 客户机对收件人限制、事务限制或二者的响应相当差。需要对这些客户机设置例外。但是,TCP 通道选项将无条件应用到 SMTP 服务器。解决方案是使用通道关键字和 switchchannel 将有问题的代理路由到限制数量更大的通道。
关键字:urgentblocklimit、normalblocklimit、nonurgentblocklimit
关键字 urgentblocklimit、normalblocklimit 和 nonurgentblocklimit 可用于指示 MTA 根据邮件大小对邮件的优先级进行降级处理。这些关键字影响作业控制器处理邮件时应用的优先级。
多线程 SMTP 客户机将发向不同目标的外发邮件分到不同的线程中。threaddepth 关键字可用于指示多线程 SMTP 客户机在任何一个线程中只处理指定数量的邮件,即使所有邮件都发向同一目标(因此通常在一个线程中进行处理),也对这些邮件使用附加线程。此关键字的默认值为 10。
每当通道的待办事项增加到超过多个 threaddepth 时,作业控制器将试图增加专用于处理在该通道排队的邮件的处理数量。对于多线程通道,作业控制器建议处理该通道邮件的任意作业启动新线程,或者,如果所有作业都具有允许用于此通道的最大线程数(tcp_* 通道的选项中的 MAX_CLIENT_THREADS),则启动新进程。对于单线程通道,将启动新进程。请注意,如果已达到通道的作业限制 (maxjobs) 或池的作业限制 (JOB_LIMIT),作业控制器将不启动新作业。
实质上,threaddepth 控制如何安排主动作业。让我们考虑两种不同的情况:
(1) 正常(出站)SMTP 通道
(2) 转发到智能主机的 SMTP 通道
作业控制器将按照目标主机对发往特定通道的邮件进行排序,并基于这些目标主机上的待办事项安排作业处理邮件的顺序。
在第一个实例中,将有大量目标主机,而且大部分目标主机的代办事项都比较小。将有大量线程处于运行状态并且一切都运行良好,不过,对于像 aol、yahoo、hotmail 这样的通信量非常大的目标主机可能会出现例外。如果使用 128 的线程深度,则当代办事项达到 128 时,您只能将第二个线程传送到 yahoo。这不是一种理想的状况。
在第二个实例中,只有一个目标主机,将多个线程传送到该主机是比较理想的。美中不足的是,默认值 10 可能太小。
当通道连接到的 SMTP 服务器可以处理多个同时连接时,使用 threaddepth 对于在守护进程路由器 TCP/IP 通道(连接到单个特定 SMTP 服务器的 TCP/IP 通道)中实现多线程可能会尤其有用。
关键字:expandlimit、expandchannel、holdlimit
大多数通道支持在每个入站邮件的传输中指定多个收件人地址。在一个邮件中指定多个收件人地址可能会导致邮件传输处理的延迟(联机延迟)。如果延迟时间太长,则可能出现网络超时,这又会导致重复的邮件提交和其他问题。
MTA 提供了一种特殊的功能,如果为一个邮件指定了超过给定数量的地址,则强制执行延迟(脱机)处理。邮件处理的延迟可以大幅度减少联机延迟。但是请注意,处理开销是被延迟,而不是被完全避免了。
例如,通过结合使用普通的 reprocessing 通道和 expandlimit 关键字,可以激活这一特殊功能。expandlimit 关键字使用整数参数,该参数指定进行延迟处理之前来自通道的邮件中应被接受的地址数。如果不指定 expandlimit 关键字,则默认值为无穷大。如果值为 0,则对来自通道的所有外来地址强制执行延迟处理。
在本地通道或 reprocessing 通道本身中不应指定 expandlimit 关键字,如果指定,将产生不可预料的结果。
可以使用 expandchannel 关键字指定用以实际执行延迟处理的通道;如果不指定 expandchannel,将默认使用 reprocessing 通道,但是使用其他某个重新处理通道或处理通道对于某些特殊目的会很有用。如果通过 expandchannel 指定了用于延迟处理的通道,则该通道应为重新处理通道或处理通道;指定其他种类的通道可能会导致不可预料的结果。
必须将 reprocessing 通道或用于执行延迟处理的任意其他通道添加到 MTA 配置文件中,以使 expandlimit 关键字生效。如果您的配置是通过 MTA 配置实用程序构建的,那么您应该已经具有重新处理通道。
收件人地址列表非常大通常是主动提供的批量电子邮件的特点。holdlimit 关键字告诉 MTA,如果进入通道的邮件使收件人超过指定数量,则应该将其标记为 .HELD 邮件,并让其加入 reprocess 通道(或通过 expandchannel 关键字指定的任意通道)队列。该文件将不被处理,它将在 reprocess 队列中等待 MTA 邮寄主管手动介入。
service 关键字无条件启用服务转换,不考虑 CHARSET-CONVERSION 条目。如果设置了 noservice 关键字,则必须通过 CHARSET-CONVERSION 为进入该通道的邮件启用服务转换。