Sun logo      上一个      目录      索引      下一个     

Sun ONE Messaging Server 6.0 管理员指南

第 12 章
LMTP 传送

Sun™ ONE Messaging Server 的 MTA 可以在使用多层邮件传送服务器部署的情况下使用 LMTP(本地邮件传输协议,在 RFC 2033 中定义)来传送到邮件存储。在这些情况下,您使用外来中继和后端邮件存储时,中继将负责地址扩展和传送方法(例如自动回复和转发),还负责邮递列表扩展。过去传送到后端存储的操作已经通过 SMTP,这需要后端系统在 LDAP 目录中再次查找收件人地址,从而使用 MTA 的整个方法。为了快速而高效的工作,MTA 可以使用 LMTP(而不是 SMTP)将邮件传送到后端存储。Sun ONE Messaging Server 的 LMTP 服务器不会用作通用 LMTP 服务器,而是用作中继和后端邮件存储之间的专用协议。为了简化讨论,将使用涉及两层部署的示例。


按照设计,LMTP 用于多层部署。无法将 LMTP 用于单系统部署。


本章由以下各节组成:


LMTP 传送功能

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


不带有 LMTP 的两层部署中的邮件传送处理

图 12-1 以图解形式显示了不带有 LMTP 的两层部署方案中邮件处理的以下说明。

图 12-1 不带有 LMTP 的两层部署

图 12-1 以图解形式显示了不带有 LMTP 的两层部署方案中邮件处理的以下说明。

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

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

然后 ims_ms 进程选取邮件消息并尝试将其传送到存储。

在此方案中,执行了两次排入处理,并且每个 MTA 均执行一次 LDAP 查找。


带有 LMTP 的两层部署中的邮件传送处理

图 12-2 以图解形式显示了带有 LMTP 的两层部署方案中邮件处理的以下说明。

图 12-2 带有 LMTP 的两层部署

图 12-2 以图解形式显示了带有 LMTP 的两层部署方案中邮件处理的以下说明。

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

将格式为 user@domain.LMTPuser@domain.LMTPNATIVE 的地址分别通过 tcp_lmtp 频道或 tcp_lmtpnative 频道路由到邮件存储系统。这些频道与使用 LMTP(而不是 SMTP)的后端邮件存储进行通信。在存储计算机上,分发程序将收到一个与 LMTP 端口的连接,并将其传递到 lmtp_server 进程。然后 LMTP 服务器将邮件插入到用户的邮箱或者插入到 UNIX 的本地邮箱。如果邮件传送成功,将在中继计算机上取消该邮件的排队。如果未成功,该邮件将仍旧留在中继计算机上。请注意,邮件存储上的 LMTP 进程不使用任何 MTA 机制以用于处理地址或邮件。


LMTP 概述

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

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

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

此交互式操作可能重复许多次,每个收件人一次。

--->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

表 12-1 显示了每个收件人的可能的状态代码。此三列表在第一列中显示了短代码,在第二列中显示了其等效的长代码,在第三列中显示了状态文本。2.x.x 状态代码是成功代码,4.x.x 代码是可重试错误,5.x.x 代码是不可重试错误。

表 12-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

邮件无空白行


配置 LMTP 传送

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

配置中继

缺省配置适合于在同一系统上具有一个 MTA 和一个邮件存储的服务器。在此方案中,为用户的邮件存储邮箱定义的传送方法将从用户 ID 和托管域构造一个地址,并将邮件路由到 ims_ms 频道。对于带有 LMTP 后端存储的中继,必须配置该中继为用户(甚至是在其它系统中置备的用户)处理邮件。通过在几乎所有规则前面放置 #,可以实现此目的。必须进行的其它更改与必须在邮件存储系统中由代理通过 LMTP 执行的方法相关。它们是邮件存储邮箱、本机系统(因此为 UNIX)和文件。

必须更改 DELIVERY_OPTIONS 的值。传送选项的当前缺省值为:

DELIVERY_OPTIONS=\
  *mailbox=$M%$\$2I$_+$2S@ims-ms-daemon,\
  &members=*,\
  *native=$M@native-daemon,\
  *unix=$M@native-daemon,\
  /hold=$L%$D@hold-daemon,\
  &file=+$F@native-daemon,\
  &@members_offline=*,\
  program=$M%$P@pipe-daemon,\
  #forward=**,\
  *^!autoreply=$M+$D@bitbucket

您必须将其更改为:

DELIVERY_OPTIONS=\
  #*mailbox=@$X.LMTP:$M$_+$2S%$\$2I@ims-ms-daemon,\
  #&members=*,\
  #*native=@$X.lmtpnative:$M,\
  #*unix=@$X.lmtpnative:$M,\
  #/hold=$L%$D@hold,\
  #*file=@$X.lmtpnative:+$F,\
  #&@members_offline=*,\
  #program=$M%$P@pipe-daemon,\
  #forward=**,\
  #*^!autoreply=$M+$D@bitbucket

请注意,所有传送选项均具有 # 前缀字符,以便可以在中继节点上评估这些选项。否则,将存在对邮箱、本机系统(因此为 UNIX)和文件的传送选项的更改。这些规则的目标是要生成地址,这些地址将导致邮件通过相应的 LMTP 频道被发送到后端服务器。生成的地址是以下格式的源路由地址:

@sourceroute:localpart@domain

这将导致邮件基于 sourceroute 路由,但是提供给远程计算机的地址独立于该路由。$X 替换将插入用户的 mailhost 属性的值。生成的源路由 mailhost.lmtpmailhost.lmtpn 将与 .lmtp.lmtpn 规则匹配,必须将这些规则添加到 imta.cnf 文件中。这些路由将邮件带到两个 LMTP 频道的其中一个,这两个频道一个用于邮件存储传送,另一个用于本机传送。那些重写规则将去掉在源路由中指定的域名的 .lmtp.lmtpn 部分,以便邮件可以通过正确的 LMTP 频道被传送到正确的邮件主机。发送到 LMTP 服务器的地址由源路由地址右侧的替换模式(即在“:”之后)定义。就邮箱模式来说,它为 $M$_+$2S$\@$2I。它将是用户 ID,后跟“+”和文件夹名(如果在原始地址中有文件夹名),后跟“@”以及托管域(除非该域是用于邮件部署的主要域)。请注意,文件方法使用 lmtpnative 频道,但是该程序传送方法会导致在中继计算机上传送。如果这不足以传送邮件,则必须在后端服务器上配置 MTA。这不排除使用 LMTP,但这是另一个选项,将在后面介绍。

请注意在邮箱传送选项模式中的更改。还请注意,现在字符 # 在自动回复传送选项前面,以便在中继计算机上强制进行操作。还请注意,为使本机文件和 UNIX 文件以及程序传送方法有用,MTA 必须在目标计算机上运行。

您必须修改 imta.cnf 文件,以在文件的重写规则部分包含 .lmtp* 重写规则。例如:

! Rewrite rules
!
! lmtp
.lmtp $U%$H@lmtpcs-daemon
!
! lmtpn
.lmtpn $U%$H@lmtpcn-daemon

请注意,缺省情况下,LMTP 重写规则被注释掉。如果需要 LMTP 工作,必须取消其注释。

还必须在 imta.cnf 文件的频道定义部分中包含 lmtplmtpn 频道的频道定义。例如:

! tcp_lmtpcs (LMTP client - store)
tcp_lmtpcs defragment lmtp port 225 nomx single_sys subdirs 20 maxjobs 7 pool SMTP_POOL dequeue_removeroute
lmtpcs-daemon

!
! tcp_lmtpcn (LMTP client - native)
tcp_lmtpcn defragment lmtp port 226 nomx single_sys subdirs 20 maxjobs 7 pool SMTP_POOL dequeue_removeroute
!lmtpcn-daemon


请确保在 LMTP 频道中使用 lmtp 频道关键字。请勿在 LMTP 频道中使用 smtplmtp 频道关键字。


请注意,缺省情况下,LMTP 频道定义被注释掉。如果需要 LMTP 工作,必须取消其注释。

最后,您需要将 service.http.smtphost configutil 参数(缺省值为 localhost)设置为 LMTP 主机的计算机名。在向邮寄主管发送邮件时,还需要将 alarm.msgalarmnoticehost configutil 参数(缺省值为 localhost)设置为 LMTP 主机的计算机名。

配置具有 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 ONE 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 subdirs 20
tcp_lmtpss-daemon

!
! tcp_lmtpsn (LMTP server - native)
tcp_lmtpsn lmtp subdirs 20
tcp_lmtpsn-daemon

请注意,缺省情况下,LMTP 频道定义被注释掉。如果需要 LMTP 工作,必须取消其注释。

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

存在这样的情况,您可能希望后端存储具有 MTA 的全部功能,但是仍旧具有使用 LMTP 的装入保存功能。例如,您可能需要在后端存储上的程序传送。在这种情况下,应按如上所述配置中继使其使用 LMTP 传送到后端存储,但是具有以下 DELIVERY_OPTIONS 的内容:

DELIVERY_OPTIONS=\
  #*mailbox=@$X.LMTP:$M$_+$2S%$\$2I@ims-ms-daemon,\
  &members=*,\
  #*native=@$X.lmtpnative:$M,\
  #*unix=@$X.lmtpnative:$M,\
  /hold=$L%$D@hold,\
  #*file=@$X.lmtpnative:+$F,\
  &@members_offline=*,\
  program=$M%$P@pipe-daemon,\
  #forward=**,\
  #*^!autoreply=$M+$D@bitbucket

唯一不同的是 #(在此计算机上评估)前缀已从某些规则中消失。对于 membersmembers_offline,这意味着仅在没有为它们定义 mailhost 属性时,逻辑才会恢复为能够在中继中扩展邮递列表的旧逻辑。对于 hold,这意味着处于 .HELD 状态的用户的邮件将保留在后端存储中(而不是各个中继中)的保留队列中。对于程序,这意味着请求的程序将在用户的邮件主机中运行。

如果除了完整的 MTA,您还要在存储系统中使用 SMTP 和 LMTP,则您要使用的 DELIVERY_OPTIONS 设置如下所示。

DELIVERY_OPTIONS=\
  *mailbox=$M%$\$2I$_+$2S@ims-ms-daemon,\
  &members=*,\
  *native=$M@native-daemon,\
  hold=$M?$I@hold-daemon,\
  *unix=$M@native-daemon,\
  &file=+$F@native-daemon,\
  &@members_offline=*,\
  program=$M%$P@pipe-daemon,\
  forward=**,\
  *^!autoreply=$M+$D@bitbucket

在具有完整 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 的后端存储的内容中进行了说明。



上一个      目录      索引      下一个     


版权所有 2003 Sun Microsystems, Inc.。保留所有权利。