設計初衷
前面已經說到了,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: 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 //退出
請注意:上面例子中的伺服器和客戶的域名是相同的,這是因為伺服器和客戶是同一個
郵件系統的不同子系統。這裡只介紹對於SMTP服務的相應內容,對於ESMPT的內容請參閱其它資料。
補充資料
我們一定要清楚,LMTP和SMTP是不同的協定(雖然語法很像),所以它不能使用TCP連線埠25。伺服器實現中必須實現PIPELINING和ENHANCEDSTATUSCODES ESMTP,也必須實現8BITMIME擴展功能。如果對於伺服器來說,它能夠快速回響向多個接收者傳輸郵件的要求,而且它能夠給出多個應答時,不要使用LMTP協定;不要在
廣域網上使用LMTP協定;伺服器必須儘快返回應答;客戶必須在應答到達時處理,而不要在所有應答均到達時才處理,如果對於某些接收者的確認應答在關閉連線後到達,應該把這些應答看做是暫時失敗應答。