Sun Java System Messaging Server MTA 可以在使用多层邮件服务器部署的情况下使用 LMTP(Local Mail Transfer Protocol,本地邮件传输协议)(在 RFC 2033 中定义)将邮件传送到邮件存储。在这些情况下,您使用入站中继和后端邮件存储时,中继将负责地址扩展和传送方法(例如自动回复和转发),还负责邮递列表扩展。过去传送到后端存储的操作已经通过 SMTP,这需要后端系统在 LDAP 目录中再次查找收件人地址,从而使用 MTA 的整个方法。为了快速而高效的工作,MTA 可以使用 LMTP(而不是 SMTP)将邮件传送到后端存储。Sun Java System Messaging Server 的 LMTP 服务器并非旨在作为一般用途的 LMTP 服务器,而是用作中继和后端邮件存储之间的专用协议。为了简化讨论,将使用涉及两层部署的示例。
按照设计,LMTP 用于多层部署。无法将 LMTP 用于单系统部署。此外,Messaging Server 已实现的 LMTP 服务不适用于与其他 LMTP 服务器或其他 LMTP 客户机结合使用。
本章包含以下几个部分:
MTA 的 LMTP 服务器能够更有效地将邮件传送到后端邮件存储,因为它具有以下功能:
减少后端存储中的负载。
因为中继是横向可伸缩的,而后端存储不是,所以将尽可能多的处理推向中继是很好的操作。
减少 LDAP 服务器上的负载。
LDAP 基础结构通常是大型邮件服务部署中的一个限制因素。
减少邮件队列的数目。
对于邮件服务部署的管理员来说,在中继和后端存储上均存在队列将使查找丢失的邮件更困难。
图 15–1 以图解形式显示了不使用 LMTP 的两层部署方案中邮件处理的以下说明。
不使用 LMTP 的情况下,在存储系统前面带有中继的两层部署中,入站邮件的处理从 SMTP 端口上的连接开始,该连接由中继计算机上的分发程序选取并传递到 tcp_smtp_server 进程。此进程对入站邮件执行了一系列操作,包括:
在目录中查找用户
确定用户是否在由此电子邮件部署托管的域内
确定用户是否为该域中的有效用户
将信封地址重写为 @mailhost:user@domain
将邮件加入队列以传送到邮件主机
然后 smtp_client 进程从队列中选取邮件并将其发送至邮件主机。在邮件主机上,将发生某些非常类似的处理。分发程序将选取 SMTP 端口上的一个连接,并将其传递到 tcp_smtp_server 进程。此进程对邮件执行了一系列操作,包括:
在目录中查找用户
确定用户是否在由此电子邮件部署托管的域内
确定用户是否为该域中的有效用户
重写信封地址以将邮件定向至 ims_ms 通道
将邮件加入队列以传送到存储
然后 ims_ms 进程选取邮件并尝试将其传送至存储。在此方案中,执行了两次加入队列处理,并且每个 MTA 均执行一次 LDAP 查找。
带有 LMTP 的两层部署中的邮件服务处理以图解形式显示了使用 LMTP 的两层部署方案中邮件处理的以下说明。
在 LMTP 就位的情况下,分发程序将选取中继计算机的 SMTP 端口上的一个连接,并将其传递到 tcp_smtp_server 进程。此进程对入站邮件执行了一系列操作,包括:
在目录中查找用户
确定用户是否在由此电子邮件部署托管的域内
确定用户是否为该域中的有效用户
确定托管用户的邮箱的后端邮件存储计算机
将邮件加入队列以传送到邮件主机
在存储计算机上,分发程序将接收与 LMTP 端口的连接,并将其传递到 lmtp_server 进程。然后 LMTP 服务器将邮件插入到用户的邮箱或者插入到 UNIX 的本地邮箱。如果邮件传送成功,将在中继计算机上取消该邮件的排队。如果未成功,该邮件将仍旧留在中继计算机上。请注意,邮件存储上的 LMTP 进程不使用任何 MTA 机制以用于处理地址或邮件。
通常,后端服务器基本上可以不具备 MTA 本身。必需的 MTA 组件仅包括:
分发程序
libimta
LMTP 服务器
imta.cnf 文件
mappings 文件
imta.tailor 文件
当分发程序需要 MTA 配置文件时,这些文件可以非常短。分发程序必须在后端服务器上运行,以便其可以启动在该程序下运行的 LMTP 服务器。因为分发程序和 LMTP 服务器使用 libimta 的各种功能,因此也需要将其显示在后端服务器上。
LMTP 服务器不执行任何常规的 MTA 加入队列或取消排队功能、标题处理或地址转换。中继系统执行邮件和地址内容的所有操作,然后将这些邮件和地址显示给 LMTP 服务器,邮件的格式与要传送到邮件存储的格式完全相同,并且传送地址格式已经是存储所需的格式。通常在邮件被传送到存储时可获取的其他收件人信息(例如用户的配额)将与收件人地址一起显示为 LMTP 参数。如果传送尝试失败,邮件将留在中继系统上的 LMTP 队列中排队。
配置 LMTP 传送机制需要在中继计算机和后端存储上均进行配置。在中继上,必须更改 DELIVERY_OPTIONS MTA 选项(在 option.dat 中),以便将要传送到存储的邮件传递到 LMTP 通道。必须用分发程序(但不需要作业控制器)配置后端存储。必须配置分发程序以运行 LMTP 服务器。
在典型的多层部署中,用户置备于不同的后端邮件存储计算机中。这些后端计算机中的一台或多台可能未打开 LMTP,因此前端中继需要了解哪些存储计算机可以识别 LMTP。通过使用常规数据库功能明确命名那些配置为接受 LMTP 传送的邮件存储,可以实现此目的。
要配置入站 MTA 中继以使用 LMTP,请执行以下操作:
修改 imta.cnf 文件并更改 LMTP 重写规则,使之如下所示:
! lmtp .lmtp $E$F$U%$H.lmtp@lmtpcs-daemon .lmtp $B$F$U%$H@$H@lmtpcs-daemon ! ! lmtp native .lmtpn $E$F$U%$H.lmtpn@lmtpcn-daemon .lmtpn $B$F$U%$H@$H@lmtpcn-daemon ! |
将邮箱 DELIVERY_OPTIONS 设置为:
#*mailbox=@$X.LMTP:$M%$\$2I$_+$2S@lmtpcs-daemon |
将本机 DELIVERY_OPTIONS 子句设置为:
#*native=@$X.LMTPN:$M+$2S@native-daemon |
为每个 tcp_lmtp* 通道块添加通道关键字 multigate connectcanonical 。
为 tcp_lmtpcs 通道添加以下通道关键字:
fileinto @$4O:$U+$S@$D |
请注意,以上关键字中的 "O" 为大写字母 O,而不是数字零。
外来 MTA 中继的配置设置应该如下所示:
DELIVERY_OPTIONS 的 option.dat 条目应该如下所示:
!------------------------------------------ ! Modified DELIVERY_OPTIONS to activate LMTP ! delivery from a frontend to the backend store !-------------------------------------------- ! DELIVERY_OPTIONS=\ #*mailbox=@$X.LMTP:$M%$\$2I$_+$2S@lmtpcs-daemon,\ #&members=*,\ #*native=@$X.LMTPN:$M+$2S@native-daemon,\ #*unix=@$X.LMTPN:$M,\ #*file=@$X.LMTPN:+$F,\ #&@members_offline=*,\ #/hold=@hold-daemon:$A,\ #program=$M%$P@pipe-daemon,\ #forward=**,\ #*^!autoreply=$M+$D@bitbucket ! |
完成更改之后,已修改的 imta.cnf 重写规则应该如下所示:
! lmtp .lmtp $E$F$U%$H.lmtp@lmtpcs-daemon .lmtp $B$F$U%$H@$H@lmtpcs-daemon ! ! lmtp native .lmtpn $E$F$U%$H.lmtpn@lmtpcn-daemon .lmtpn $B$F$U%$H@$H@lmtpcn-daemon ! |
更改的通道块应该如下所示:
! ! tcp_lmtpcs (LMTP client - store) tcp_lmtpcs defragment lmtp multigate connectcanonical \ fileinto @$4O:$U+$S@$D port 225 nodns single_sys \ subdirs 20 maxjobs 7 pool SMTP_POOL dequeue_removeroute lmtpcs-daemon ! ! tcp_lmtpcn (LMTP client - native) tcp_lmtpcn defragment lmtp multigate connectcanonical port 226 \ nodns single_sys subdirs 20 maxjobs 7 pool SMTP_POOL dequeue_removeroute lmtpcn-daemon |
如果后端存储要通过 LMTP 接收邮件,则它们不需要 MTA。这意味着它们没有作业控制器,并且没有与 MTA 相关联的任何地址重写机制。但是,它们确实仍需要分发程序和简单的 MTA 配置。特别是需要 dispatcher.cnf 文件和 mappings 文件,这两个文件将构成 MTA 配置的唯一重要部分。
dispatcher.cnf 文件必须包含以下内容:
! rfc 2033 LMTP server - store ! [SERVICE=LMTPSS] PORT=225 IMAGE=IMTA_BIN:tcp_lmtp_server LOGFILE=IMTA_LOG:tcp_lmtpss_server.log PARAMETER=CHANNEL=tcp_lmtpss STACKSIZE=2048000 ! Uncomment the following line and set INTERFACE_ADDRESS to an ! appropriate host IP (dotted quad) if the dispatcher needs to ! listen on a specific interface (e.g. in a HA environment). ! INTERFACE_ADDRESS=! ! rfc 2033 LMTP server - native ! [SERVICE=LMTPSN] PORT=226 IMAGE=IMTA_BIN:tcp_lmtpn_server LOGFILE=IMTA_LOG:tcp_lmtpsn_server.log PARAMETER=CHANNEL=tcp_lmtpsn STACKSIZE=2048000 ! Uncomment the following line and set INTERFACE_ADDRESS to an ! appropriate host IP (dotted quad) if the dispatcher needs to !listen on a specific interface (e.g. in a HA environment). !INTERFACE_ADDRESS= |
请注意,默认情况下,dispatcher.cnf 文件中的 LMTP 服务被注释掉。您必须取消其注释才能使 LMTP 工作。
还可以设置 MAX_CONNS、MAX_PROCS、MAX_LIFE_CONNS 和 MAX_LIFE_TIME 的常规分发程序选项,但是需要针对您的硬件相应地进行设置。
PORT_ACCESS 映射很重要。后端服务器的 LMTP 实现旨在用作 Sun Java System Messaging Server 中继和后端存储之间的专用协议。您必须使用 PORT_ACCESS 映射以确保只有此类中继可以连接到这些服务。您的映射文件应类似于此:
PORT_ACCESS TCP|*|225|1.2.3.4|* $Y TCP|*|226|1.2.3.4|* $Y TCP|*|225|1.2.3.5|* $Y TCP|*|226|1.2.3.5|* $Y TCP|*|*|*|* $N500$ Do$ not$ connect$ to$ this$ machine |
您应该用连接到后端存储的网络中的中继 IP 地址替换此处在 PORT_ACCESS 映射表中指定的示例 IP 地址。
必须有一个 imta.cnf 文件,但是它只用于完成配置。最小的 imta.cnf 文件由以下通道定义组成:
! tcp_lmtpss (LMTP server - store) tcp_lmtpss lmtp tcp_lmtpss-daemon ! ! tcp_lmtpsn (LMTP server - native) tcp_lmtpsn lmtp tcp_lmtpsn-daemon
请注意,默认情况下,LMTP 通道定义已被注释掉。如果需要 LMTP 工作,必须取消其注释。
存在这样的情况,您可能希望后端存储具有 MTA 的全部功能,但是仍旧具有使用 LMTP 的装入保存功能。例如,您可能需要在后端存储上的程序传送。在这种情况下,中继应按照上述配置与 LMTP 配合使用的入站 MTA 中继中的说明进行配置
从后端存储邮件服务系统的配置到使用 LMTP 直接传送到存储的配置的唯一更改是,需要将以下行添加到 dispatcher.cnf 文件的结尾:
! rfc 2033 LMTP server - store ![SERVICE=LMTPSS] PORT=225 IMAGE=IMTA_BIN:tcp_lmtp_server LOGFILE=IMTA_LOG:tcp_lmtpss_server.log PARAMETER=CHANNEL=tcp_lmtpss STACKSIZE=2048000 ! Uncomment the following line and set INTERFACE_ADDRESS to an ! appropriate host IP (dotted quad) if the dispatcher needs to ! listen on a specific interface (e.g. in a HA environment). !INTERFACE_ADDRESS= ! ! rfc 2033 LMTP server - native ! [SERVICE=LMTPSN] PORT=226 IMAGE=IMTA_BIN:tcp_lmtpn_server LOGFILE=IMTA_LOG:tcp_lmtpsn_server.log PARAMETER=CHANNEL=tcp_lmtpsn STACKSIZE=2048000 ! Uncomment the following line and set INTERFACE_ADDRESS to an ! appropriate host IP (dotted quad) if the dispatcher needs to ! listen on a specific! interface (e.g. in a HA environment). !INTERFACE_ADDRESS= ! |
请注意,默认情况下,dispatcher.cnf 文件中的 LMTP 服务均已被注释。您必须取消其注释才能使 LMTP 工作。此外,LMTP 端口号仅为示例,您可以任意选择。
这与上述用于仅为 LMTP 配置后端存储时的整个 dispatcher.cnf 文件相同。映射文件还需要 PORT_ACCESS 映射,正如 LMTP 需要后端存储一样。
本节提供了 LMTP 对话样例,并带有在该对话中看到的解释。中继上的 LMTP 客户机使用标准的 LMTP 协议与后端存储上的 LMTP 服务器联系。但是,该协议以特定方式使用。例如:
---> LHLO <--- 250 OK |
对 LHLO 邮件没有采取任何操作。回复始终是 250 OK。
---> MAIL FROM: address size=messageSizeInBytes <--- 250 OK |
对创始人地址没有进行任何检查或转换。size= 参数给出了要传送的邮件的大小(以字节为单位)。此邮件的大小与协议中显示的大小完全相同。邮件的大小可以不必完全相同,但是实际邮件的大小不能超过此大小。LMTP 服务器将按此大小分配内存缓冲区以接收邮件。
---> RCPT TO: uid+folder@domain xquota=size,number xdflg=xxx <--- 250 OK |
在收到收件人地址时不对其进行任何检查,但是将生成一个收件人列表以便以后使用。请注意,对于主域中的 uids,地址的 @domain 部分将被忽略,并且 +folder 部分是可选的。这与 MTA 中的邮件存储通道所使用的地址格式相同。
xquota= 参数给出了用户的邮件配额,它包括邮件的最大总大小和最大数目。MTA 提供了在对用户执行 LDAP 查找以进行地址转换时检索到的信息。此信息用于使邮件存储中的配额信息与目录保持同步。获取配额信息不会导致其他性能受到打击。
xdflg= 参数指定了一个数字,该数字可以解释为位字段。这些位将控制传送邮件的方式。例如,值为 2(如果设置)的位将保证邮件的传送,即使用户超出配额。(请注意,xdflg 是内部参数并且其中的位如有更改或添加,恕不另行通知。我们不支持使用此扩展的其他客户机与我方服务器结合使用,也不支持将我方客户机与某些其他服务器和此参数结合使用。)
此交互式操作可能重复许多次,每个收件人一次。
--->DATA ---> <the message text> --->. |
然后 LMTP 客户机发送整个邮件(充满点的),类似于 SMTP 执行的操作。完成邮件传送后,每行上将带有一个点 (.)。如果超过邮件大小,则 LMTP 服务器将发送:
<--- 500 message too big
并结束连接。
假设正确接收了邮件,则 LMTP 服务器将向 LMTP 客户机发送回每个收件人(在 RCPT TO: 行中给定的)的状态。例如,如果成功传送了邮件,则响应为:
<--- 250 2.5.0 address OK
其中 address 与在 RCPT TO: 行中显示的完全相同。
对话可以使用另一个 MAIL FROM: 行重复,或使用以下交互式操作结束:
---> quit <--- 221 OK |
表 15–1 显示了每个收件人的可能的状态代码。此三列表在第一列中显示了短代码,在第二列中显示了其等效的长代码,在第三列中显示了状态文本。2.x.x 状态代码是成功代码,4.x.x 代码是可重试错误,5.x.x 代码是不可重试错误。
表 15–1 收件人的 LMTP 状态代码
短代码 |
长代码 |
状态文本 |
---|---|---|
250 |
2.5.0 |
确定 |
420 |
4.2.0 |
邮箱被锁定 |
422 |
4.2.2 |
超出配额 |
420 |
4.2.0 |
邮箱格式错误 |
420 |
4.2.0 |
邮箱不受支持 |
430 |
4.3.0 |
IMAP IOERROR |
522 |
5.2.2 |
超出永久配额 |
523 |
5.2.3 |
邮件太大 |
511 |
5.1.1 |
邮箱不存在 |
560 |
5.6.0 |
邮件包含空字符 |
560 |
5.6.0 |
邮件包含 nl |
560 |
5.6.0 |
邮件标题错误 |
560 |
5.6.0 |
邮件无空白行 |
否则,将存在对邮箱、本机系统(因此为 UNIX)和文件的传送选项的更改。这些规则的目标是要生成地址,这些地址将导致邮件通过相应的 LMTP 通道被发送到后端服务器。生成的地址是以下格式的源路由地址:
@sourceroute:localpart@domain |