本地郵件傳輸協(xié)議:SMTP和LMTP
SMTP需要管理一個(gè)隊(duì)列,一個(gè)郵件操作可以把一封郵件發(fā)送向不同的接收者,而一個(gè)SMTP命令卻只有一個(gè)返回碼,這就帶來(lái)的問(wèn)題,如果服務(wù)器需要把一個(gè)郵件發(fā)向兩個(gè)接收者,發(fā)送第一個(gè)的時(shí)候成功了,而發(fā)送第二個(gè)時(shí)候暫時(shí)失敗了,服務(wù)器必須把這封郵件放入隊(duì)列,以后再發(fā)送,而發(fā)送方卻不可能知道這一切。
SMTP的這種隊(duì)列機(jī)制在最初設(shè)計(jì)時(shí)是為了考慮到轉(zhuǎn)發(fā)的需要,但在有些時(shí)候,并不需要服務(wù)器管理這個(gè)隊(duì)列,而需要由客戶進(jìn)行隊(duì)列的管理,我們看一下下面這個(gè)例子:
上圖中有三個(gè)獨(dú)立的通信系統(tǒng),三個(gè)方框內(nèi)的就是,第一個(gè)是隊(duì)列管理器,它是一個(gè)通常的SMTP服務(wù)器,第二個(gè)是使用非SMTP協(xié)議的郵件系統(tǒng),郵件在這個(gè)系統(tǒng)內(nèi)的傳送由系統(tǒng)中的服務(wù)器來(lái)決定,而第三個(gè)是將郵件放入到一個(gè)郵件池的系統(tǒng)??赡苡脩粝M麑MTP用于本地進(jìn)程內(nèi)通信通道,從隊(duì)列管理器到傳送代理間傳送信息。如果需要傳輸代理管理它們自己的郵件隊(duì)列就太麻煩了。
將郵件從本地傳輸代理傳向隊(duì)列管理器時(shí)使用LMTP不會(huì)有什么好處,但是在隊(duì)列管理器傳送郵件到本地傳輸代理時(shí)使用LMTP卻十分有好處,因?yàn)檫@樣接收者的郵件分別發(fā)送,而一封信件可以得到多個(gè)應(yīng)答,這個(gè)應(yīng)答指示相應(yīng)的郵件是不是正確發(fā)送到接收者了。
LMTP協(xié)議與SMTP和ESMTP協(xié)議很象,除了本文內(nèi)說(shuō)明的一些命令改變外,其它和SMTP都一樣。一個(gè)成功的RCPT命令被定義為返回確認(rèn)完成應(yīng)答碼的RCPT命令。請(qǐng)注意:一般的成功命令都以2開(kāi)頭。為了避免和SMTP和ESMTP服務(wù)混淆,LMTP使用LHLO命令開(kāi)始一個(gè)LMTP會(huì)話,它的基本語(yǔ)法和HELO和EHLO命令相同。對(duì)于DATA命令來(lái)說(shuō),如果RCPT命令失敗,DATA命令必須返回503,并失敗。每個(gè)DATA命令碰到"."時(shí),服務(wù)器必須對(duì)所有成功的RCPT命令返回應(yīng)答,這和平常的SMTP系統(tǒng)不同,而且順序必須和RCPT成功的順序一致,即使對(duì)于同一個(gè)向前路徑來(lái)說(shuō)有許多RCPT命令,也必須返回多個(gè)成功應(yīng)答。這就意味著,服務(wù)器返回的確認(rèn)應(yīng)答是指服務(wù)器把郵件地發(fā)送到接收者或另一個(gè)轉(zhuǎn)發(fā)代理,這一點(diǎn)一定要明確。下面是一個(gè)例子:(S代表服務(wù)器,C代表客戶)
- S: 220 foo.edu LMTP server ready //服務(wù)器準(zhǔn)備好
- 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 . //開(kāi)始輸出郵件內(nèi)容,以回車,"."和回車結(jié)束
- C: Blah blah blah... //郵件內(nèi)容
- C: ...etc. etc. etc. //郵件內(nèi)容
- C: .
- S: 250 OK
- S: 452 is temporarily over quota
- C: QUIT //退出
- S: 221 foo.edu closing connection //關(guān)閉連接
請(qǐng)注意:上面例子中的服務(wù)器和客戶的域名是相同的,這是因?yàn)榉?wù)器和客戶是同一個(gè)郵件系統(tǒng)的不同子系統(tǒng)。這里只介紹對(duì)于SMTP服務(wù)的相應(yīng)內(nèi)容,對(duì)于ESMPT的內(nèi)容請(qǐng)參閱其它資料。
我們一定要清楚,LMTP和SMTP是不同的協(xié)議(雖然語(yǔ)法很象),所以它不能使用TCP端口25。服務(wù)器實(shí)現(xiàn)中必須實(shí)現(xiàn)PIPELINING和ENHANCEDSTATUSCODES ESMTP,也必須實(shí)現(xiàn)8BITMIME擴(kuò)展功能。
如果對(duì)于服務(wù)器來(lái)說(shuō),它能夠快速響應(yīng)向多個(gè)接收者傳輸郵件的要求,而且它能夠給出多個(gè)應(yīng)答時(shí),不要使用LMTP協(xié)議;
不要在廣域網(wǎng)上使用LMTP協(xié)議;
服務(wù)器必須盡快返回應(yīng)答;
客戶必須在應(yīng)答到達(dá)時(shí)處理,而不要在所有應(yīng)答均到達(dá)時(shí)才處理,如果對(duì)于某此接收者的確認(rèn)應(yīng)答在關(guān)閉連接后到達(dá),應(yīng)該把這些應(yīng)答看做是暫時(shí)失敗應(yīng)答。
SMTP和LMTP是兩個(gè)常用的本地郵件傳輸協(xié)議,在日常的應(yīng)用中,你一定會(huì)碰到這兩個(gè)協(xié)議,所以希望你能掌握。