SMTP需要管理一个队列,一个邮件操作可以把一封邮件发送向不同的接收者,而一个SMTP命令却只有一个返回码,这就带来的问题,如果服务器需要把一个邮件发向两个接收者,发送第一个的时候成功了,而发送第二个时候暂时失败了,服务器必须把这封邮件放入队列,以后再发送,而发送方却不可能知道这一切。
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代表客户)
- S: 220 foo.edu LMTP server ready //服务器准备好
- C: LHLO foo.edu
- S: 250-foo.edu
- S: 250-PIPELINING
- S: 250 SIZE
- C: MAIL FROM:
- S: 250 OK
- C: RCPT TO:
- S: 250 OK
- C: RCPT TO:
- S: 550 No such user here
- C: RCPT TO:
- S: 250 OK
- C: DATA
- S: 354 Start mail input; end with . //开始输出邮件内容,以回车,"."和回车结束
- C: Blah blah blah... //邮件内容
- C: ...etc. etc. etc. //邮件内容
- C: .
- S: 250 OK
- S: 452 is temporarily over quota
- C: QUIT //退出
- S: 221 foo.edu closing connection //关闭连接
请注意:上面例子中的服务器和客户的域名是相同的,这是因为服务器和客户是同一个邮件系统的不同子系统。这里只介绍对于SMTP服务的相应内容,对于ESMPT的内容请参阅其它资料。
我们一定要清楚,LMTP和SMTP是不同的协议(虽然语法很象),所以它不能使用TCP端口25。服务器实现中必须实现PIPELINING和ENHANCEDSTATUSCODES ESMTP,也必须实现8BITMIME扩展功能。
如果对于服务器来说,它能够快速响应向多个接收者传输邮件的要求,而且它能够给出多个应答时,不要使用LMTP协议;
不要在广域网上使用LMTP协议;
服务器必须尽快返回应答;
客户必须在应答到达时处理,而不要在所有应答均到达时才处理,如果对于某此接收者的确认应答在关闭连接后到达,应该把这些应答看做是暂时失败应答。
SMTP和LMTP是两个常用的本地邮件传输协议,在日常的应用中,你一定会碰到这两个协议,所以希望你能掌握。