本地郵件傳輸協議:SMTP和LMTP
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是兩個常用的本地郵件傳輸協議,在日常的應用中,你一定會碰到這兩個協議,所以希望你能掌握。