簡單郵件傳輸協議（英語：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 年隨 41cBSD 釋出的 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）和 SMTPAUTH（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 擴充套件被引入，以支援 UTF8 文字，允許使用非拉丁字元（如西裡爾字母或中文）的國際內容和地址。 許多人對核心 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 第 21 節，每一次跳轉都正式交接了訊息的責任，接收伺服器必須要麼傳遞訊息，要麼正確報告未能傳遞的原因。 一旦最終跳轉接受傳入訊息，它將訊息交給郵件投遞代理（MDA）以進行本地傳遞。MDA 將訊息儲存在相關的郵箱格式中。和傳送一樣，接收過程可以在一臺或多臺計算機上完成，但在上圖中 MDA 被描繪為位於郵件交換器附近的一個框。MDA 可以直接將訊息傳送到儲存中，或透過網路使用 SMTP 或其他協議（如本地郵件傳輸協議 LMTP）轉發，這種協議是為此目的設計的 SMTP 衍生協議。 一旦郵件傳遞到本地郵件伺服器，郵件便被儲存以供經過身份驗證的郵件客戶端（MUA）批次檢索。郵件由稱為電子郵件客戶端的終端使用者應用程式使用 Internet 訊息訪問協議（IMAP）或郵局協議（POP）檢索。IMAP 用於訪問和管理已儲存的郵件，而 POP 通常使用傳統的 mbox 郵件檔案格式或專有系統，如 Microsoft ExchangeOutlook 或 Lotus NotesDomino。Webmail 客戶端可能使用其中任一方式，但檢索協議通常不是正式標準。 SMTP 定義了訊息傳輸而非訊息內容，因此它定義了郵件信封及其引數（如信封發件人），但不包括訊息的頭部（除追蹤資訊外）或正文。STD 10 和 RFC 5321 定義了 SMTP（即信封），而 STD 11 和 RFC 5322 則定義了訊息（頭部和正文），正式稱為網際網路訊息格式。 SMTP 通訊舉例 在傳送方（客戶端）和接收方（伺服器）間建立連線之後，會建立一個合法的 SMTP 會話，如下例。在下面的例子中，所有客戶端傳送的都以 C 作為字首，所有伺服器傳送的都以 S 作為字首。在多數計算機系統上，可以在傳送的機器上使用 telnet 命令來建立連線，比如： telnet wwwexamplecom 25 它建立一個從傳送的機器到主機 wwwexamplecom 的 SMTP 連線。 S 220 smtpexamplecom ESMTP Postfix C HELO relayexamplecom S 250 smtpexamplecom I am glad to meet you C MAIL FROMbobexamplecom S 250 Ok C RCPT TOaliceexamplecom S 250 Ok C RCPT TOthebossexamplecom S 250 Ok C DATA S 354 End data with CRLFCRLF C From Bob Example bobexamplecom C To Alice Example aliceexamplecom C Cc thebossexamplecom C Date Tue 15 Jan 2008 160243 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 安裝數量帶來的網路效應，大刀闊斧地修改或完全替代 SMTP 被認為是不現實的。就是一個替代 SMTP 的建議方案。 因此，出現了一些同 SMTP 工作的輔助協議。的反垃圾郵件研究小組正在研究一些建議方案，以提供簡單、靈活、輕量級的、可升級的源端認證。最有可能被接受的建議方案是發件人策略框架協議。 提供 SSL 加密的 SMTP 協定被稱為 SMTPS。 參見 相關 RFC RFC 5321 簡單郵件傳輸協議，在最近（20088）代替了 RFC 2821 RFC 2821 簡單郵件傳輸協議，在最近（2001）代替了 RFC 821，RFC 1869，RFC 974 RFC 2822 Internet（比如 email）訊息格式，代替了 RFC 822 RFC 3461 SMTP 的傳送狀態通知（DSN）擴充套件，代替了 RFC 1891 參考文獻 SMTP 協議資料 Category 電子郵件協議