SMTP和SMTP服务扩展(ESMTP)提供了一种高效安全传送电子邮件的方法,而在实现SMTP时需要管理一个邮件传送队列,在有些时候这样做可能有麻烦,需要一种没有队列的邮件传送系统,而LMTP就是这样的一个系统,它使用ESMTP的语法,而它和ESMTP可不是一回事,而LMTP也不能用于TCP端口25。
SMTP的这种队列机制在最初设计时是为了考虑到转发的需要,但在有些时候,并不需要服务器管理这个队列,而需要由客户进行队列的管理,我们看一下下面这个例子: 上图中有三个独立的通信系统,三个方框内的就是,第一个是队列管理器,它是一个通常的SMTP服务器,第二个是使用非SMTP协议的邮件系统,邮件在这个系统内的传送由系统中的服务器来决定,而第三个是将邮件放入到一个邮件池的系统。可能用户希望将SMTP用于本地进程内通信通道,从队列管理器到传送代理间传送信息。如果需要传输代理管理它们自己的邮件队列就太麻烦了。 将邮件从本地传输代理传向队列管理器时使用LMTP不会有什么好处,但是在队列管理器传送邮件到本地传输代理时使用LMTP却十分有好处,因为这样接收者的邮件分别发送,而一封信件可以得到多个应答,这个应答指示相应的邮件是不是正确发送到接收者了。 LMTP协议与SMTP和ESMTP协议很象,除了本文内说明的一些命令改变外,其它和SMTP都一样。一个成功的RCPT命令被定义为返回确认完成应答码的RCPT命令。请注意:一般的成功命令都以2开头。为了避免和SMTP和ESMTP服务混淆,LMTP使用LHLO命令开始一个LMTP会话,它的基本语法和HELO和EHLO命令相同。对于DATA命令来说,如果RCPT命令失败,DATA命令必须返回503,并失败。每个DATA命令碰到"."时,服务器必须对所有成功的RCPT命令返回应答,这和平常的SMTP系统不同,而且顺序必须和RCPT成功的顺序一致,即使对于同一个向前路径来说有许多RCPT命令,也必须返回多个成功应答。这就意味着,服务器返回的确认应答是指服务器把邮件地发送到接收者或另一个转发代理,这一点一定要明确。下面是一个例子:(S代表服务器,C代表客户) sill LMTP S: 220 hechengjin-deepin LMTP Welcome to Wild Duck Mail Server
sill LMTP C: LHLO [127.0.0.1]
sill LMTP S: 250-hechengjin-deepin Nice to meet you, [127.0.0.1]
sill LMTP 250-PIPELINING
sill LMTP 250-8BITMIME
sill LMTP 250 SMTPUTF8
sill LMTP C: MAIL FROM:<andris@kreata.ee>
sill LMTP S: 250 Accepted
sill LMTP C: RCPT TO:<hcj@hechengjin-deepin>
sill LMTP S: 250 Accepted
sill LMTP C: DATA
sill LMTP S: 354 End data with <CR><LF>.<CR><LF>
sill LMTP C: <807432 bytes of DATA>
sill LMTP S: 250 Message stored as 5a2f49931f30c11d71052f89
info LMTP Connection closed to [127.0.0.1]
我们一定要清楚,LMTP和SMTP是不同的协议(虽然语法很象),所以它不能使用TCP端口25。服务器实现中必须实现PIPELINING和ENHANCEDSTATUSCODES ESMTP,也必须实现8BITMIME扩展功能。 如果对于服务器来说,它能够快速响应向多个接收者传输邮件的要求,而且它能够给出多个应答时,不要使用LMTP协议; 不要在广域网上使用LMTP协议; 服务器必须尽快返回应答; 客户必须在应答到达时处理,而不要在所有应答均到达时才处理,如果对于某此接收者的确认应答在关闭连接后到达,应该把这些应答看做是暂时失败应答。
|