簡單郵件傳輸協定
網際網路協定套組 |
---|
應用層 |
傳輸層 |
網路層 |
連結層 |
此條目翻譯品質不佳。 (2018年7月25日) |
簡單郵件傳輸協定(英語:Simple Mail Transfer Protocol,縮寫:SMTP)是一種用於電子郵件傳輸的網際網路標準通訊協定。郵件伺服器和其他郵件傳輸代理使用SMTP來傳送和接收郵件。使用者級電子郵件客戶端通常僅使用SMTP將郵件傳送至郵件伺服器進行中繼,並通常在埠587或465上提交外發郵件(依據RFC 8314)。用於接收郵件的標準協定是IMAP(取代了舊的POP3),但專有伺服器也常常實現專有協定,例如Exchange ActiveSync。
SMTP起源於1980年,基於1971年在ARPANET上實施的概念構建。此協定已多次更新、修改和擴充。目前普遍使用的版本具有可延伸的結構,支援多種擴充功能,如身分驗證、加密、二進制資料傳輸和國際化電子郵件位址。SMTP伺服器通常使用傳輸控制協定(TCP),在埠25(用於伺服器之間)和埠587(用於來自已認證客戶端的提交)上執行,支援加密與非加密兩種方式。
SMTP發展歷史
SMTP的前身
在1960年代,不同形式的一對一電子資訊傳遞已在使用,使用者通過為特定大型電腦開發的系統進行通訊。隨著電腦互聯增多,尤其是在美國政府的ARPANET中,逐漸制定了標準以允許在不同作業系統之間交換訊息。
ARPANET上的郵件可以追溯到1971年:當時提出了未實現的「Mail Box Protocol」(郵件盒協定),該協定在RFC 196中有討論;同年,BBN的Ray Tomlinson改造了SNDMSG程式,使其能夠在ARPANET上的兩台電腦間傳送訊息。隨後在1973年6月的RFC 524中提出了另一種郵件協定,但同樣未被實現。
1973年3月,RFC 469建議使用檔案傳輸協定(FTP)來在ARPANET上進行「網路郵件」傳輸。通過RFC 561、RFC 680、RFC 724以及最終在1977年11月發布的RFC 733,形成了使用FTP郵件伺服器的標準化「電子郵件」框架。
SMTP的發展源於1970年代制定的這些標準。Ray Tomlinson在1974年9月的INWG協定備忘錄2中討論了網路郵件。1979年,INWG討論了電子郵件協定,該討論內容在Jon Postel關於網際網路郵件的早期工作中有參照。Postel在1979年首次提出了網際網路訊息協定,作為網際網路實驗報告(IEN)系列的一部分。
原始的SMTP
1980年,Postel和Suzanne Sluizer發布了RFC 772,提出了郵件傳輸協定(Mail Transfer Protocol)以替代FTP用於郵件傳輸。1981年5月,RFC 780取消了所有對FTP的參照,並為TCP和UDP分配了埠57(但IANA後來取消了這一分配)。1981年11月,Postel發布了RFC 788——「簡單郵件傳輸協定」(SMTP)。
SMTP標準的開發與Usenet(一個具有相似之處的一對多通訊網路)幾乎是同期的。
SMTP在1980年代初得到了廣泛使用。當時,它是對Unix到Unix拷貝程式(UUCP)的補充,UUCP更適合用於處理兩台間歇性連接的電腦間的郵件傳輸。相比之下,SMTP更適合傳送方和接收方的機器始終連接到網路的環境。兩者都使用儲存轉發機制,是推播技術的例子。儘管Usenet的新聞群組仍然通過UUCP在伺服器間傳播,但UUCP作為郵件傳輸工具幾乎已消失,隨之消失的還有UUCP用於訊息路由的「嘆號路徑」。
1983年隨4.1cBSD發布的Sendmail,是首批實現SMTP的郵件傳輸代理(MTA)之一。隨著BSD Unix成為網際網路最流行的作業系統,Sendmail也成為最常見的MTA。
原始的SMTP協定僅支援未經身分驗證的7位ASCII文字通訊,且不加密,易受中間人攻擊、欺騙和垃圾郵件的侵害,並且需要將二進制資料編碼為可讀文字後才能傳輸。由於缺少適當的身分驗證機制,原始設計中的SMTP伺服器都是開放郵件中繼站。網際網路郵件聯盟(IMC)報告稱,1998年時有55%的郵件伺服器是開放中繼,而到2002年降至不到1%。由於垃圾郵件問題,大多數電子郵件提供商將開放中繼列入阻止名單,這使得原始的SMTP在網際網路普遍使用中變得幾乎不再適用。
現代SMTP
1995年11月,RFC 1869定義了擴充簡單郵件傳輸協定(ESMTP),為現有和未來的所有擴充提供了通用結構,旨在彌補原始SMTP協定的功能缺失。ESMTP定義了一個一致、可管理的方式,使得ESMTP客戶端和伺服器能夠被辨識,並讓伺服器指示其支援的擴充功能。
1998年和1999年,引入了訊息提交(RFC 2476)和SMTP-AUTH(RFC 2554),標誌著電子郵件傳輸的新趨勢。最初,SMTP伺服器通常是內部使用的,用於接收來自外部的郵件並轉發組織內的郵件到外部。但隨著時間推移,SMTP伺服器(郵件傳輸代理,MTA)實際上擴充了其角色,成為郵件使用者代理(MUA)的訊息提交代理,有些甚至中繼來自外部的郵件(例如,公司高管在出差時通過公司SMTP伺服器傳送郵件)。這種變化是由於全球資訊網的快速普及,使得SMTP必須包含特定的中繼規則和使用者身分驗證方法,以防止濫用行為,如未經請求的郵件(垃圾郵件)的中繼。RFC 2476的訊息提交工作最初是因為流行的郵件伺服器經常會在嘗試修復郵件問題時重寫郵件,例如為不完整的位址添加域名。雖然此行為在初次提交時有幫助,但在郵件來自他處並被中繼時則存在風險。將郵件清晰地分為提交和中繼被視為一種方法,既能允許和鼓勵提交時重寫,又禁止中繼時重寫。隨著垃圾郵件的增多,這一分離也被視為對組織外傳送郵件提供授權和追蹤的方式。這種中繼和提交的分離迅速成為現代電子郵件安全實踐的基礎。
由於SMTP協定最初僅基於ASCII文字,因此對二進制檔案或多語言字元處理不佳。多用途網際網路郵件擴充(MIME)標準被開發出來,將二進制檔案編碼以便通過SMTP傳輸。在Sendmail之後開發的郵件傳輸代理(MTA)通常被實現為8位元「乾淨」模式,使得可以使用「直接傳送八位」的策略傳輸任意文字資料(以任意8位元ASCII類似字元編碼)。然而,由於不同廠商的字元集對映差異,仍然存在亂碼(Mojibake)問題,且電子郵件位址本身仍然只允許使用ASCII字元。如今,8位元「乾淨」MTA傾向於支援8BITMIME擴充,使得部分二進制檔案幾乎可以像純文字一樣容易傳輸(仍然存在行長和允許的八位值限制,因此大多數非文字資料和一些文字格式仍需要MIME編碼)。2012年,SMTPUTF8擴充被引入,以支援UTF-8文字,允許使用非拉丁字元(如西里爾字母或中文)的國際內容和位址。
許多人對核心SMTP規範作出了貢獻,包括Jon Postel、Eric Allman、Dave Crocker、Ned Freed、Randall Gellens、John Klensin和Keith Moore。
郵件處理模型
電子郵件通過郵件客戶端(郵件使用者代理,MUA)使用SMTP通過TCP埠587提交到郵件伺服器(郵件提交代理,MSA)。大多數電子信箱提供商仍允許通過傳統的埠25提交。MSA將郵件傳送給其郵件傳輸代理(MTA)。通常,這兩個代理是同一軟體的實例,在同一台機器上啟動時採用不同選項。可以在單台電腦上完成本地處理,也可以分配到多台機器上;一台機器上的郵件代理行程可以共享檔案,但如果在多台機器上進行處理,它們會使用SMTP在彼此之間傳遞訊息,每台機器都組態為使用下一台機器作為智慧型主機。每個行程都是其自身的MTA(SMTP伺服器)。
邊界MTA使用DNS尋找接收方域的MX(郵件交換)記錄(即電子郵件位址中@符號右側的部分)。MX記錄包含目標MTA的名稱。根據目標主機和其他因素,傳送MTA選擇一個接收伺服器並連接以完成郵件交換。
郵件傳輸可以在兩個MTA之間的單次連接中完成,或通過中間系統的一系列跳轉來完成。接收SMTP伺服器可能是最終目的地、中繼(即儲存並轉發訊息)或閘道器(即可能使用SMTP以外的協定轉發訊息)。根據RFC 5321第2.1節,每一次跳轉都正式交接了訊息的責任,接收伺服器必須要麼傳遞訊息,要么正確報告未能傳遞的原因。
一旦最終跳轉接受傳入訊息,它將訊息交給郵件投遞代理(MDA)以進行本地傳遞。MDA將訊息儲存在相關的電子信箱格式中。和傳送一樣,接收過程可以在一台或多台電腦上完成,但在上圖中MDA被描繪為位於郵件交換器附近的一個框。MDA可以直接將訊息傳送到儲存中,或通過網路使用SMTP或其他協定(如本地郵件傳輸協定LMTP)轉發,這種協定是為此目的設計的SMTP衍生協定。
一旦郵件傳遞到本地郵件伺服器,郵件便被儲存以供經過身分驗證的郵件客戶端(MUA)批次檢索。郵件由稱為電子郵件客戶端的終端使用者應用程式使用Internet訊息訪問協定(IMAP)或郵局協定(POP)檢索。IMAP用於訪問和管理已儲存的郵件,而POP通常使用傳統的mbox郵件檔案格式或專有系統,如Microsoft Exchange/Outlook或Lotus Notes/Domino。Webmail客戶端可能使用其中任一方式,但檢索協定通常不是正式標準。
SMTP定義了訊息傳輸而非訊息內容,因此它定義了郵件信封及其參數(如信封發件人),但不包括訊息的頭部(除追蹤資訊外)或正文。STD 10和RFC 5321定義了SMTP(即信封),而STD 11和RFC 5322則定義了訊息(頭部和正文),正式稱為網際網路訊息格式。
網際網路 |
---|
網際網路主題 |
SMTP通訊舉例
在傳送方(客戶端)和接收方(伺服器)間建立連接之後,會建立一個合法的SMTP對談,如下例。在下面的例子中,所有客戶端傳送的都以「C:」作為字首,所有伺服器傳送的都以「S:」作為字首。在多數電腦系統上,可以在傳送的機器上使用telnet命令來建立連接,比如:
telnet www.example.com 25
它建立一個從傳送的機器到主機www.example.com的SMTP連接。
S: 220 smtp.example.com ESMTP Postfix C: HELO relay.example.com S: 250 smtp.example.com, I am glad to meet you C: MAIL FROM:<[email protected]> S: 250 Ok C: RCPT TO:<[email protected]> S: 250 Ok C: RCPT TO:<[email protected]> S: 250 Ok C: DATA S: 354 End data with <CR><LF>.<CR><LF> C: From: "Bob Example" <[email protected]> C: To: Alice Example <[email protected]> C: Cc: [email protected] C: Date: Tue, 15 Jan 2008 16:02:43 -0500 C: Subject: Test message C: C: Hello Alice. C: This is a test message with 5 header fields and 4 lines in the message body. C: Your friend, C: Bob C: . S: 250 Ok: queued as 12345 C: QUIT S: 221 Bye {The server closes the connection}
雖然是可選的,但幾乎所有的客戶端都會使用EHLO問候訊息(而不是上面所示的HELO)來詢問伺服器支援何種SMTP擴充,郵件的文字體(接著DATA)一般是典型的MIME格式。
SMTP安全和垃圾郵件
最初的SMTP的局限之一,在於它沒有對傳送方進行身分驗證的機制。因此,後來定義了SMTP-AUTH擴充。
儘管有了身分認證機制,垃圾郵件仍然是一個主要的問題。但由於龐大的SMTP安裝數量帶來的網路效應,大刀闊斧地修改或完全替代SMTP被認為是不現實的。Internet Mail 2000就是一個替代SMTP的建議方案。
因此,出現了一些同SMTP工作的輔助協定。IRTF的反垃圾郵件研究小組正在研究一些建議方案,以提供簡單、靈活、輕量級的、可升級的源端認證。最有可能被接受的建議方案是發件人策略框架協定。
提供SSL加密的SMTP協定被稱為SMTPS。
參見
相關 RFC
- RFC 5321 - 簡單郵件傳輸協定,在最近(2008.8)代替了 RFC 2821
- RFC 2821 - 簡單郵件傳輸協定,在最近(2001)代替了 RFC 821,RFC 1869,RFC 974
- RFC 2822 - Internet(比如 e-mail)訊息格式,代替了 RFC 822
- RFC 3461 - SMTP的傳送狀態通知(DSN)擴充,代替了 RFC 1891