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

Sun logo
Sun Java System Messaging Server 6 2004Q2 管理指南 

第 15 章
LMTP 传送

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


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


本章由以下各节组成:


LMTP 传送功能

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


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

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

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

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

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

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

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

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


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

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

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

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

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

配置与 LMTP 配合使用的外来 MTA 中继

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

  1. 通过将以下行添加到 option.dat 中激活文本数据库。
  2. USE_TEXT_DATABASES=1

    在此步骤中,MTA 中启用了常规数据库的平面文本文件。请注意如果已经使用常规数据库,可能要跳过此步骤。

  3. 创建或修改常规数据库文本文件。

    # cd /opt/SUNWmsgsr/config/

    # vi general.txt

    LMTP_CS|msg-store.siroe.com   lmtpcs-daemon

    LMTP_CS|name-1-lmtp-store.siroe.com  lmtpcs-daemon

    LMTP_CS|name-2-lmtp-store.siroe.com  lmtpcs-daemon

    ..

    ..

    LMTP_CN|Zmar.Talek@siroe.com   lmtpcs-daemon

    ..

    LMTP_CN|Fred.Bloggs@siroe.com   lmtpcs-daemon

    # chown mailsrv general.txt

  4. 正如您所见,有两类条目,一类用于处理用户特定的、到 lmtpnative 的传送,另一类用于处理通过 tcp_lmtpcs 通道的传送的存储范围设置。

  5. 将 LMTP 重写规则添加到 imta.cnf 文件的步骤:
  6. # cd /opt/SUNWmsgsr/config/

    # cp imta.cnf imta.cnf.orig

    # vi imta.cnf

    !

    ! pipe

    .pipe-daemon $U%$H.pipe-daemon@pipe-daemon

    !

    ! tcp_local

    ! Rules for top level internet domains

    <IMTA_TABLE:internet.rules

    !

    ! Do mapping lookup for internal IP addresses

    [] $E$R${INTERNAL_IP,$L}$U%[$L]@tcp_intranet-daemon

    !

    ! Do general.txt lookup for lmtp hosts

    .domain-name.com $S$U%$H$D@$(LMTP_CN|$U@$H$D)

    .domain-name.com $S$U%$H$D@$(LMTP_CS|$H$D)

    !

    ! tcp_intranet

    ! Do mapping lookup for internal IP addresses

    [] $E$R${INTERNAL_IP,$L}$U%[$L]@tcp_intranet-daemon

    .domain-name.com $U%$H.domain-name.com@tcp_intranet-daemon

    在此步骤中,一对重写规则将执行常规数据库的标记探测,以查看地址的源路由部分是否与执行 LMTP 传送的任何条目相匹配。在步骤 2 中创建的 general.txt 文件中,具有指定通过适当通道到后端邮件存储的传送的标记条目。这里,重写规则中的 $S 表示仅当地址包含源路由时才回复。如果常规数据库中有匹配的条目,则重写规则成功并且邮件通过 tcp_lmtpX 通道(此通道通过 LMTP 进行传送)被发送到源路由后端主机。

    如果没有找到匹配的条目,则重写过程将继续,直到在其他重写规则中找到匹配的条目为止。大多数情况下,如果通过常规数据库探测没有找到匹配的条目,则邮件通过 tcp_intranet 通道(此通道通过 SMTP 进行传送)被路由。

  7. 将新的通道块添加到 imta.cnf
  8. 还必须在 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

  9. 提交配置更改。

    # cd /opt/SUNWmsgsr/bin

    # ./imsimta refresh

    Compiled configuration done

    Killing Dispatcher : 23021

    Dispatcher startup requested

    Job Controller shutdown requested

    Job Controller startup requested


  10. 请确保在 LMTP 通道中使用 lmtp 通道关键字。但不要在 LMTP 通道中同时使用 smtplmtp 通道关键字。另请注意,缺省情况下,LMTP 通道定义已被注释掉。如果需要 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 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 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 传送到后端存储。

在具有完整 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(如果设置)的位将保证邮件的传送,即使用户超出配额。

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

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



上一个      目录      索引      下一个     


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