本地邮件传输协议(localmailtransferprotocol)
smtp和smtp服务扩展(esmtp)提供了一种高效安全传送电子邮件的方法,而在实现smtp时需要管理一个邮件传送队列,在有些时候这样做可能有麻烦,需要一种没有队列的邮件传送系统,而lmtp就是这样的一个系统,它使用esmtp的语法,而它和esmtp可不是一回事,而lmtp也不能用于tcp端口25。
前面已经说到了,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:220foo.edulmtpserverready//服务器准备好
c:lhlofoo.edu
s:250-foo.edu
s:250-pipelining
s:250size
c:mailfrom:
s:250ok
c:rcptto:
s:250ok
c:rcptto:
s:550nosuchuserhere
c:rcptto:
s:250ok
c:data
s:354startmailinput;endwith.//开始输出邮件内容,以回车,"."和回车结束
c:blahblahblah...//邮件内容
c:...etc.etc.etc.//邮件内容
c:.
s:250ok
s:452istemporarilyoverquota
c:quit//退出
s:221foo.educlosingconnection//关闭连接
请注意:上面例子中的服务器和客户的域名是相同的,这是因为服务器和客户是同一个邮件系统的不同子系统。这里只介绍对于smtp服务的相应内容,对于esmpt的内容请参阅其它资料。
我们一定要清楚,lmtp和smtp是不同的协议(虽然语法很象),所以它不能使用tcp端口25。服务器实现中必须实现pipelining和enhancedstatuscodesesmtp,也必须实现8bitmime扩展功能。如果对于服务器来说,它能够快速响应向多个接收者传输邮件的要求,而且它能够给出多个应答时,不要使用lmtp协议;不要在广域网上使用lmtp协议;服务器必须尽快返回应答;客户必须在应答到达时处理,而不要在所有应答均到达时才处理,如果对于某些接收者的确认应答在关闭连接后到达,应该把这些应答看做是暂时失败应答。