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

第 15 章 LMTP 传送

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 客户机结合使用。


本章包含以下几个部分:

LMTP 传送功能

MTA 的 LMTP 服务器能够更有效地将邮件传送到后端邮件存储,因为它具有以下功能:

不使用 LMTP 的两层部署中的邮件服务处理

图 15–1 以图解形式显示了不使用 LMTP 的两层部署方案中邮件处理的以下说明。

图 15–1 不带有 LMTP 的两层部署

图形显示了不使用 LMTP 的两层部署方案中的邮件处理。

不使用 LMTP 的情况下,在存储系统前面带有中继的两层部署中,入站邮件的处理从 SMTP 端口上的连接开始,该连接由中继计算机上的分发程序选取并传递到 tcp_smtp_server 进程。此进程对入站邮件执行了一系列操作,包括:

然后 smtp_client 进程从队列中选取邮件并将其发送至邮件主机。在邮件主机上,将发生某些非常类似的处理。分发程序将选取 SMTP 端口上的一个连接,并将其传递到 tcp_smtp_server 进程。此进程对邮件执行了一系列操作,包括:

然后 ims_ms 进程选取邮件并尝试将其传送至存储。在此方案中,执行了两次加入队列处理,并且每个 MTA 均执行一次 LDAP 查找。

带有 LMTP 的两层部署中的邮件服务处理

带有 LMTP 的两层部署中的邮件服务处理以图解形式显示了使用 LMTP 的两层部署方案中邮件处理的以下说明。

图 15–2 带有 LMTP 的两层部署

图形显示了使用 LMTP 的两层部署方案中的邮件处理。

在 LMTP 就位的情况下,分发程序将选取中继计算机的 SMTP 端口上的一个连接,并将其传递到 tcp_smtp_server 进程。此进程对入站邮件执行了一系列操作,包括:

在存储计算机上,分发程序将接收与 LMTP 端口的连接,并将其传递到 lmtp_server 进程。然后 LMTP 服务器将邮件插入到用户的邮箱或者插入到 UNIX 的本地邮箱。如果邮件传送成功,将在中继计算机上取消该邮件的排队。如果未成功,该邮件将仍旧留在中继计算机上。请注意,邮件存储上的 LMTP 进程不使用任何 MTA 机制以用于处理地址或邮件。

LMTP 概述

通常,后端服务器基本上可以不具备 MTA 本身。必需的 MTA 组件仅包括:

当分发程序需要 MTA 配置文件时,这些文件可以非常短。分发程序必须在后端服务器上运行,以便其可以启动在该程序下运行的 LMTP 服务器。因为分发程序和 LMTP 服务器使用 libimta 的各种功能,因此也需要将其显示在后端服务器上。

LMTP 服务器不执行任何常规的 MTA 加入队列或取消排队功能、标题处理或地址转换。中继系统执行邮件和地址内容的所有操作,然后将这些邮件和地址显示给 LMTP 服务器,邮件的格式与要传送到邮件存储的格式完全相同,并且传送地址格式已经是存储所需的格式。通常在邮件被传送到存储时可获取的其他收件人信息(例如用户的配额)将与收件人地址一起显示为 LMTP 参数。如果传送尝试失败,邮件将留在中继系统上的 LMTP 队列中排队。

配置 LMTP 传送

配置 LMTP 传送机制需要在中继计算机和后端存储上均进行配置。在中继上,必须更改 DELIVERY_OPTIONS MTA 选项(在 option.dat 中),以便将要传送到存储的邮件传递到 LMTP 通道。必须用分发程序(但不需要作业控制器)配置后端存储。必须配置分发程序以运行 LMTP 服务器。

在典型的多层部署中,用户置备于不同的后端邮件存储计算机中。这些后端计算机中的一台或多台可能未打开 LMTP,因此前端中继需要了解哪些存储计算机可以识别 LMTP。通过使用常规数据库功能明确命名那些配置为接受 LMTP 传送的邮件存储,可以实现此目的。

Procedure配置与 LMTP 配合使用的入站 MTA 中继

要配置入站 MTA 中继以使用 LMTP,请执行以下操作:

步骤
  1. 修改 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
    !
  2. 将邮箱 DELIVERY_OPTIONS 设置为:


    #*mailbox=@$X.LMTP:$M%$\$2I$_+$2S@lmtpcs-daemon
  3. 将本机 DELIVERY_OPTIONS 子句设置为:


    #*native=@$X.LMTPN:$M+$2S@native-daemon
  4. 为每个 tcp_lmtp* 通道块添加通道关键字 multigate connectcanonical

  5. 为 tcp_lmtpcs 通道添加以下通道关键字:


    fileinto @$4O:$U+$S@$D

    请注意,以上关键字中的 "O" 为大写字母 O,而不是数字零。

  6. 外来 MTA 中继的配置设置应该如下所示:

    DELIVERY_OPTIONSoption.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 的后端存储

如果后端存储要通过 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_CONNSMAX_PROCSMAX_LIFE_CONNSMAX_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 工作,必须取消其注释。

配置中继以通过 LMTP 将邮件发送到带有邮件存储和完整 MTA 的后端系统

存在这样的情况,您可能希望后端存储具有 MTA 的全部功能,但是仍旧具有使用 LMTP 的装入保存功能。例如,您可能需要在后端存储上的程序传送。在这种情况下,中继应按照上述配置与 LMTP 配合使用的入站 MTA 中继中的说明进行配置

在具有完整 MTA 的后端邮件存储系统中配置 LMTP

从后端存储邮件服务系统的配置到使用 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 协议与后端存储上的 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