SMTP協議

 

組織:中國互動出版網(http://www.china-pub.com/
RFC文檔中文翻譯計劃(http://www.china-pub.com/compters/emook/aboutemook.htm
E-mail:[email protected]
譯者:顧國飛(ggfei  [email protected]
譯文發佈時間:2001-3-30
版權:本中文翻譯文檔版權歸中國互動出版網所有。可以用於非商業用途自由轉載,但必須保留本文檔的翻譯及版權信息。

Network Working Group                                          J. Postel
Request for Comments: DRAFT                                          ISI
Replaces: RFC 788, 780, 772                                  August 1982


RFC821 簡單郵件傳輸協議(SMTP)
(RFC821  SIMPLE MAIL TRANSFER PROTOCOL)


目錄
1. 介紹 2
2. SMTP模型 3
3. SMTP過程 4
3.1. MAIL 4
3.2. 轉發 5
3.3. 確認和擴展 6
3.4. 發送信件(mailing)和獲得信件(sending) 7
3.5. 打開和關閉 7
3.6. 轉發 8
3.7. 域 9
3.8. 改變角色 9
4. SMTP說明 9
4.1. SMTP命令 9
4.1.1. 命令語法 9
4.1.2. COMMAND語法格式 13
4.2. SMTP響應 15
4.3. 命令和應答序列 16
4.4. 狀態圖 17
4.5. 詳細內容 18
4.5.1. 最小實現 18
4.5.2. 透明性 19
4.5.3. 大小 19
附錄 A TCP傳輸服務 19
附錄 B NCP傳輸服務 20
附錄 C NITS 20
附錄 D X.25傳輸服務 20
附錄 E 應答碼構成方法 20
附錄 F 一些例子 22
參考資料 36

  1. 介紹
  簡單郵件傳輸協議(SMTP)的目標是可靠高效地傳送郵件,它獨立於傳送子系統而且僅要求一條可以保證傳送數據單元順序的通道。附錄A,B,C和D描述了不同傳送服務下SMTP的使用。在名詞表中還定義了本文檔中使用的術語。
  SMTP的一個重要特點是它能夠在傳送中接力傳送郵件,傳送服務提供了進程間通信環境(IPCE),此環境可以包括一個網絡,幾個網絡或一個網絡的子網。理解到傳送系統(或IPCE)不是一對一的是很重要的。進程可能直接和其它進程通過已知的IPCE通信。郵件是一個應用程序或進程間通信。郵件可以通過連接在不同IPCE上的進程跨網絡進行郵件傳送。更特別的是,郵件可以通過不同網絡上的主機接力式傳送。
2. SMTP模型
  SMTP設計基於以下通信模型:針對用戶的郵件請求,發送SMTP建立與接收SMTP之間建立一個雙向傳送通道。接收SMTP可以是最終接收者也可以是中間傳送者。SMTP命令由發送SMTP發出,由接收SMTP接收,而應答則反方面傳送。
一旦傳送通道建立,SMTP發送者發送MAIL命令指明郵件發送者。如果SMTP接收者可以接收郵件則返回OK應答。SMTP發送者再發出RCPT命令確認郵件是否接收到。如果SMTP接收者接收,則返回OK應答;如果不能接收到,則發出拒絕接收應答(但不中止整個郵件操作),雙方將如此重複多次。當接收者收到全部郵件後會接收到特別的序列,如果接收者成功處理了郵件,則返回OK應答。
SMTP提供傳送郵件的機制,如果接收方與發送方連接在同一個傳送服務下時,郵件可以直接由發送方主機傳送到接收方主機;或者,當兩者不在同一個傳送服務下時,通過中繼SMTP服務器傳送。爲了能夠對SMTP服務器提供中繼能力,它必須擁有最終目的主機地址和郵箱名稱。
  MAIL命令參數是回覆路徑,它指定郵件從何處來;而RCPT命令的參數是轉發路徑的,它指定郵件向何處去。向前路徑是源路徑,而回復路徑是返回路徑(它用於發生錯誤時返回郵件)。
  當同一個消息要發往不同的接收者時,SMTP遇到了向不同接收者發送同一份數據的複製品的問題,郵件命令和應答有一個比較奇怪的語法,應答也有一個數字代碼。在下面,例子中可以看到哪些使用實際的命令和應答。完整的命令和應答在第四節。
  命令與應答對大小寫不敏感,也就是說,命令和應答可以是大寫,小寫或兩者的混合,但這一點對用戶郵件名稱卻不一定是對的,因爲有的主機對用戶名大小寫是敏感的。這樣SMTP實現中就將用戶郵箱名稱保留成初始時的樣子,主機名稱對大小寫不敏感。
  命令與應答由ASCII字母表組成,當傳送服務提供8位字節傳送通道,每7位字符正確傳送,而最高位被填充爲0。當指定一般的命令或應答格式後,參數會由一些類似於語言的字符串表示出來,如"<string>"或"<reverse-path>",這裏尖括號表示這是一種類似於語言的變量。
3. SMTP過程
  本節提供了SMTP中的一些過程。頭一個說明的是基本發送過程(定義爲發送操作)。下來描述向前傳送郵件,確認郵箱名稱和擴展郵件列表,發送到終端和打開關閉交換。在本節的最後是對中斷,郵件域的說明。本節的例子只是一部分命令和應答的序列,完整的例子見附錄F。
3.1. MAIL
  在SMTP發送操作中有三步,操作由MAIL命令開始給出發送者標識。一系列或更多的RCPT命令緊跟其後,給出了接收者信息,然後是DATA命令列出發送的郵件內容,最後郵件內容指示符確認操作。

  過程中的第一步是MAIL命令,< reverse-path >包括源郵箱。

  MAIL <SP> FROM:<reverse-path> <CRLF>

  此命令告訴接收者新的發送操作已經開始,請復位所有狀態表和緩衝區。它給出反向路徑以進行錯誤信息返回。如果請求被接收,接收方返回一個250 OK應答。<reverse-path>中不止包括了郵箱,它包括了主機和源郵箱的反向路由,其中的第一個主機就是發送此命令的主機。

  過程中的第二步是發送RCPT命令。

  RCPT <SP> TO:<forward-path> <CRLF>

  此命令給出向前路徑標識接收者,如果命令被接收,接收方返回一個250 OK應答,並存儲向前路徑。如果接收者未知,接收方會返回一個550 Failure應答。此過程可能會重複若干次。
  <forward-path>不僅包括郵件,它是主機和目的郵箱的路由表,在其中的第一個主機就是接收命令的主機。 過程中的第三步是發送DATA命令。

DATA <CRLF>

  如果命令被接收,接收方返回一個354 Intermediate應答,並認定以下的各行都是信件內容。當信件結尾收到並存儲後,接收者發送一個250 OK應答。因爲郵件是在傳送通道上發送,因此必須指明郵件內容結尾,以便應答對話可以重新開始。SMTP通過在最後一行僅發送一個句號來表示郵件內容的結束,在接收方,一個對用戶透明的過程將此符號過濾掉,以不影響正常的數據。
  注意:郵件內容包括如下提示:Date, Subject, To, Cc, From。

  郵件內容指示符確認郵件操作並告知接收者可以存儲和再發送數據了。如果此命令被接收,接收方返回一個250 OK應答。DATA命令僅在郵件操作未完成或源無效的情況下失敗。

  上面所述的過程是一個發送操作。這些命令只能以上面的順序使用。下例表示了在一個發送操作中這些命令的使用。
  SMTP過程例子 此例是在Alpha.ARPA主機的Smith發送郵件給Beta.ARPA主機的Jones,Green和Brown的,這裏假定主機Alpha與主機Beta直接相連。

  S: MAIL FROM:<[email protected]>
  R: 250 OK
  S: RCPT TO:<[email protected]>
  R: 250 OK
  S: RCPT TO:<[email protected]>
  R: 550 No such user here
  S: RCPT TO:<[email protected]>
  R: 250 OK
  S: DATA
  R: 354 Start mail input; end with <CRLF>.<CRLF>
  S: Blah blah blah...
  S: ...等等
  S: <CRLF>.<CRLF>
  R: 250 OK
  此信被前兩個人接收,而第三個人在此主機上沒有郵箱。
3.2. 轉發
  下面是一些<forward-path>中目的地址不正確的,但接收者知道正確的目的地址的例子。在這些例子中,下列應答之一應該允許發送方與獲得正確地址。

  251:用戶不在本地;將向前發送到<forward-path>。

  這個應答意味着,接收方SMTP知道用戶的郵箱在另外的主機上,而且意味着將在未來使用正確的轉向路徑。請注意,主機或者用戶,或者它們兩者是不同的。接收方負責傳送消息。

  551 :用戶非本地,請嘗試<forward-path>

  這個應答意味着接收SMTP知道用戶的郵箱在另外的主機上,並意味着使用了正確的轉發路徑。注意請注意,主機或者用戶,或者它們兩者是不同的。接收方拒絕接收此用戶的信件,發送者必須根據提供的信息重新發送或者向原發送者返回錯誤信息。 下例顯示了這些響應的應用。

  轉發的例子
  S: RCPT TO:<[email protected]>
  R: 251 User not local; will forward to <[email protected]>
  或者
  S: RCPT TO:<[email protected]>
  R: 551 User not local; please try <[email protected]>
3.3. 確認和擴展
  SMTP提供了另外的確認用戶名和擴展郵件列表的功能。這些功能由VREF和EXPN命令完成,它們都以字符串爲參數。對於VREF命令,字符串參數指的是用戶名,對此命令的響應要包括用戶的命名和用戶的郵箱。對於EXPN命令,字符串參數指的是郵件列表,對此命令的響應多於一個,它們要包括所有列表中用戶的命名和他們的郵箱。
  “用戶名”是一個多餘的項目,它是故意被加上的。如果主機採用VREF命令和EXPN命令,最後本地郵箱必須提供用戶名使它被主機確認。如果主機選擇由另外的字符串作爲用戶名,也是允許的。
  在一些主機中,郵箱列表和一個郵箱的代名有一點不清楚,因爲一般的數據結構可能包括兩種類型的入口。如果要發出對郵件列表的確認,應該給出確定響應。在接收到這個消息後,主機將把郵件傳送到列表上所有的地址上去,如果沒有接收到確定響應,就會報告錯誤。例如,"550 That is a mail list, not a user name"。如果請求用於擴展一個用戶名,可能通過返回包括一個名字的列表來形成確定響應,如果沒有接收到確定響應,就會報告錯誤。(例如, "550 That is a user name, not a mailing list")。
  在多個響應的情況下(通常是對於EXPN而言的),每個應答指定一個郵箱。在模糊請求的情況下,例如"VRFY Smith",這裏兩個Smith的響應必須是"553 User ambiguous"。

  確認用戶名的情況如下例所示:例3:
  確認用戶名
  S: VRFY Smith R: 250 Fred Smith <[email protected]>
  或者
  S: VRFY Smith
  R: 251 User not local; will forward to <[email protected]>
  或者
  S: VRFY Jones
  R: 550 String does not match anything.
  或者
  S: VRFY Jones
  R: 551 User not local; please try <[email protected]>
  或者
  S: VRFY Gourzenkyinplatz
  R: 553 User ambiguous.

  郵箱列表要求多個響應的情況如下例所示:
  S: EXPN Example-People
  R: 250-Jon Postel <[email protected]>
  R: 250-Fred Fonebone <[email protected]>
  R: 250-Sam Q. Smith <[email protected]>
  R: 250-Quincy Smith <@USC-ISIF.ARPA:[email protected]>
  R: 250-<[email protected]>
  R: 250 <[email protected]>
  或者
  S: EXPN Executive-Washroom-List
  R: 550 Access Denied to You.

  VERF和EXPN命令的字符串命令參數因爲具體實現的不同而不能再加以限制了。在一些系統上,EXPN命令的參數可能是一個包含郵件列表的文件名,但是在Internet上有許多不同的文件結構。
  VRFY和EXPN命令在最小實現中並不包括,當它們實現時,它們也不要求被在傳送間實現。 
3.4. 發送信件(mailing)和獲得信件(sending)
  SMTP的主要目的是將郵件發送到用戶的郵箱中。由一些主機提供的類似的功能是把郵件送至用戶的終端(如果用戶正打開終端)。將郵件送到用戶的郵箱中稱爲發送信件(mailing);而送至用戶終端則稱之爲獲得信件(sending)。因爲在一些主機上,這兩者的實現十分類似,所以它們同時被放入了SMTP中。然而,獲得信件命令在SMTP的最小實現中是沒有的。用戶應該具有控制向終端上寫信息的能力。大部分主機允許用戶接受或者拒絕類似的信息。
  下面三個命令被定義來支持獲得信件。它們被用於郵件命令而不是MAIL命令,指示接收SMTP這種操作的特殊意義:
  SEND <SP> FROM:<reverse-path> <CRLF>
  SEND命令要求郵件內容直接傳送到用戶終端。如果用戶未打開終端(或者未接收終端信息),450響應將返回一個RCPT命令。如果信息被成功發送,此操作成功。 
  SOML <SP> FROM:<reverse-path> <CRLF> 
  Send或者MaiL命令要求將郵件內容直接發送到用戶的終端上(如果用戶在終端上)。如果用戶不在終端上,郵件內容直接進入郵箱。如果郵件被髮送到用戶終端或者用戶信箱,發送操作成功。 
  SAML <SP> FROM:<reverse-path> <CRLF>
  Send和MaiL命令要求郵件內容直接發送到用戶終端上(如果用戶在終端上)。不管怎麼樣,信件都會進入信箱。如果信件進入信箱,發送操作成功。
  用於MAIL命令的響應和這些命令的響應相同。  
3.5. 打開和關閉
  當打開傳送通道時,要交換一些信息以確定雙方的身份。以下的命令是用於打開和關閉的:
  HELO <SP> <domain> <CRLF>
  QUIT <CRLF>
  在HELLO命令中,主機自己發送命令,此命令可以被解釋爲:“你好,我是XX"。

  打開聯結的例子
  R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready
  S: HELO USC-ISIF.ARPA
  R: 250 BBN-UNIX.ARPA

  關閉聯結的例子
  S: QUIT
  R: 221 BBN-UNIX.ARPA Service closing transmission channel
3.6. 轉發
  轉發路徑可能是如下格式:"@ONE,@TWO:JOE@THREE",在這裏,ONE,TWO和THREE是主機。這種格式用於強調地址和路徑的區別。郵箱是絕對地址,路徑是關於如何到達的信息。這兩個概念不應該被混淆。
  概念上,轉發路徑的元素被移動到回覆路徑作爲從一個SMTP服務器到另一個SMTP服務器的信息。回覆路徑是一個反向數據源路徑,例如從當前信息的位置到發起者的位置。當一個SMTP服務器從轉發路徑中刪除自己的標記並將它插入到回覆路徑中時,它必須使用它發送環境能夠理解的名稱來進行,以防它的名稱在不同的環境中被理解爲不同的名字。
  如果當SMTP接收到信息的轉發路徑的第一個元素不是此SMTP的標記時,此元素不從轉發路徑中刪除,而被用來決定下一個應該發送到的SMTP服務器。在任何情況下,SMTP都將自己的標記加入反向路徑中。
  使用源路徑時,接收SMTP接收轉發的郵件併發送到另一接收SMTP服務器上。接收服務器可以接受或拒絕轉發本地用戶的郵件。接收SMTP通過將它自己的標記從轉發路徑移至回覆路徑的開始處來改變命令參數。這時,接收SMTP變成了發送SMTP,也就建立了到下一個轉發路徑中SMTP的通道,然後,它向這個SMTP發送郵件。
  在回覆路徑上的頭一個主機應是發送SMTP命令的主機,在轉發路徑上第一個主機應是接收SMTP命令的主機。
  注意:轉發路徑和回覆路徑出現在SMTP命令和應答中,但不一定要出現在信息中。也就是說,沒有必須要這樣的路徑特別這種格式出現在信息頭的"To:","From:"和"CC:"等域中。
   如果SMTP服務器接受了轉發任務,但後來它發現因爲轉發路徑不正確或者其它原理無法發送郵件,它必須建立一"undeliverable mail"信號,將它此信號送到此信的發主者那裏。
  此信號必須是從此主機的SMTP服務上發出的,當然了,此服務器不應該再報告出錯信息的錯誤。一種阻止這種出錯報告循環的情況是在信號的郵件命令的回覆路徑上置空。在傳送此信息時,允許將回復路徑也置爲空。一個MAIL命令後的回覆路徑爲空表現爲如下形式:
  MAIL FROM:<>

  下例中顯示了不可傳送的郵件信息。此信息是對從HOSTW上的JOE發出的郵件經過在HOSTX需要經過HOSTZ到達HOSTY時出錯的迴應。我們看到的例子是在HOSTX和HOSTY之間發生的。

  不可傳送郵件信息的例子
  S: MAIL FROM:<>
  R: 250 ok
  S: RCPT TO:<@HOSTX.ARPA:[email protected]>
  R: 250 ok
  S: DATA
  R: 354 send the mail data, end with .
  S: Date: 23 Oct 81 11:22:33
  S: From: [email protected]
  S: To: [email protected]
  S: Subject: Mail System Problem
  S:
  S: Sorry JOE, your message to [email protected] lost.
  S: HOSTZ.ARPA said this:
  S: "550 No Such User"
  S: .
  R: 250 ok
3.7. 域
  域是最近被引入ARPA Internet郵件系統的。使用域可以使地址空間從一個平面的普通字符串主機名變成全局地址的一個層次結構。主機由一個域名取代,起始主機是由一系列元串組成,它們由逗號按最特殊到一般的順序排列。
  例如,"USC-ISIF.ARPA","Fred.Cambridge.UK"和"PC7.LCS.MIT.ARPA"可能是主機-域標識符。
  無論域名在SMTP中如何使用,只有正式的名稱纔可以被使用,不可以使用假名或暱稱。
3.8. 改變角色
  TURN命令可以用來改變在傳輸信道上通信的程序的角色。如果程序A現在是發送SMTP,它發送TURN命令並接到OK應答(250)後,它就變爲接收SMTP了。同理,程序B也可以從接收SMTP變爲發送SMTP。若要拒絕改變角色,接收方可以發送502作爲應答。
  注意:此命令是可選的。在使用TCP的傳輸信道時,一般不使用此命令。然而,當建立傳輸信道的代價比較大時,此命令很有用。例如,此命令可以支持一般公共交換電話系統作爲傳輸信道。
4. SMTP說明
4.1. SMTP命令
4.1.1. 命令語法
  SMTP命令定義了郵件傳輸或由用戶定義的系統功能。它的命令是由<CRLF>結束的字符串。而在帶有參數的情況下,命令本身由<SP>和參數分開,如果未帶參數可以直接和<CRLF>連接。郵箱的語法格式必須和接收站點的格式一致。下面討論SMTP命令和應答。
  發送郵件操作涉及到不同的數據對象,它們由不同的參數相互連接。回覆路徑就是MAIL命令的參數,而轉發路徑則是RCPT命令的參數,郵件日期是DATA命令的參數。這些參數或者數據對象必須跟在命令後。這種模式也就要求有不同的緩衝區來存儲這些對象,也就是說,有一個回覆路徑緩衝區,一個轉發路徑緩衝區,一個郵件內容緩衝區。特定的命令產生自己的緩衝區,或使一個或多個緩衝的內容被清除。
  HELLO (HELO)
  此命令用於向接收SMTP確認發送SMTP。參數域包括髮送SMTP的主機名。接收SMTP通過連接確認命令來向發送SMTP確認接收SMTP。引命令和OK響應確認發送和接收SMTP進入了初始狀態,也就是說,沒有操作正在執行,所有狀態表和緩衝區已經被子清除。
  MAIL (MAIL)
  此命令用於開始將郵件發送到一個多個郵箱中。參數域包括回覆路徑。返回路徑中包括了可選的主機和發送者郵箱列表。當有主機列表時,它是一個回覆路徑源,它說明此郵箱是由在表中的主機一一傳遞發送(第一個主機是最後一個接收到此郵件的主機)過來的。此表也有作向發送者返回非傳遞信號的源路徑。因爲每個傳遞主機地址都被加在此表起始處,它就必須使用發送IPCE而不是接收IPCE(如果它們不是一個IPCE的話)清楚的名稱。一些出錯信息的回覆路徑可能就是空的。
  此命令清除回覆路徑緩衝區,轉發路徑緩衝區和郵件內容緩衝區,並且將此命令的回覆路徑信息插入到回覆路徑緩衝區中。
  RECIPIENT (RCPT)
  此命令用於確定郵件內容的唯一接收者;多個接收者將由多個此命令指定。轉發路徑中包括一個可選的主機和一個必須的目的郵箱。當出現主機列表時,這就是一個源路徑,它指明郵件必須向列表中的上一個主機發送。如果接收SMTP未實現郵件的傳遞發送,就會返回如未知本地用戶(550)的信息給用戶。
  當郵件被傳遞發送時,傳遞主機必須將自己的名稱由轉發路徑的開始處移至回覆路徑的結束處。當郵件最終到達目的地時,接收SMTP將以它的主機郵件格式自己的名稱插入目標郵件中。例如,由傳遞主機A接收的帶有如下參數的郵件時,
  FROM:<[email protected]>
  TO:<@HOSTA.ARPA,@HOSTB.ARPA:[email protected]>
  將會變成如下形式:
  FROM:<@HOSTA.ARPA:[email protected]>
  TO:<@HOSTB.ARPA:[email protected]>.
  此命令導致它的轉發路徑參數加入轉發路徑緩衝區中。
  DATA (DATA)
  接收者將跟在命令後的行作爲郵件內容。此命令導致此命令後的郵件內容加入郵件內容緩衝區。郵件內容可以包括所有128個ASCII碼字符。郵件內容由只包括一個句號的行結束,也就是如下的字符序列:"<CRLF>.<CRLF>",它指示了郵件的結束。
  郵件內容的結束指示要求接收者現在就處理保存的郵件內容。此過程將回復路徑緩衝區,轉發路徑緩衝區和郵件內容緩衝區的內容全部清空。如果操作成功,接收者必須返回OK應答;如果失敗也必須返回失敗應答。
  當接收SMTP收到一條信息時,無論是用作轉發還是此郵件已經到達目的地,它都必須在郵件內容的開始處加上時間戳這一行,這一行指示了接收到郵件主機和發出此郵件主機的標識,以及接收到郵件內容的時間和日期。轉發的信件將有多行這樣的時間戳。當接收SMTP作最後一站的傳送時,它將返回路徑信息行插入郵件中。此行包括了發送命令中的<reverse-path>的信息。在這裏,最後一站的傳送的意思是郵件將被送到目的用戶手中,但在一些情況下,郵件可能需要更進一步的加工並由另外的郵件系統傳送。
  可能在返回路徑中的郵箱與實際發送的郵件不一致,這個情況可能發生在需要傳送一個特定的錯誤處理信箱而不是信件發送者那裏。上面所述說明了,最後的郵件內容由一個返回路徑行,和在其後的一個或多個時間戳行構成。這些行後面是郵件內容的頭和體信息。
  當處理後面的郵件數據指示部分成功時就需要特定的說明。這種情況可能發生在發送SMTP發現當郵件需要傳送給多個用戶時,只能夠成功地向其中的一部分發送信息這種情況下。在這種情況下,必須對DATA命令發送OK應答,而接收SMTP組織併發送一個"不可傳遞郵件"信息到信息的發送者。在此信息中或者發送一個不成功接收者的列表,或者每次發送一個不成接收者,而發送多次。所有不可傳遞郵件信息由MAIL命令發送。
  返回路徑和接收時間戳例子
  Return-Path: <@GHI.ARPA,@DEF.ARPA,@ABC.ARPA:[email protected]>
  Received: from GHI.ARPA by JKL.ARPA ; 27 Oct 81 15:27:39 PST
  Received: from DEF.ARPA by GHI.ARPA ; 27 Oct 81 15:15:13 PST
  Received: from ABC.ARPA by DEF.ARPA ; 27 Oct 81 15:01:59 PST
  Date: 27 Oct 81 15:01:01 PST
  From: [email protected]
  Subject: Improved Mailing System Installed
  To: [email protected]

  This is to inform you that ...
  SEND (SEND)
  此命令用於開始一個發送命令,將郵件發送到一個或多個終端上。參數域包括了一個回覆路徑,此命令如果成功就將郵件發送到終端上了。
  回覆路徑包括一個可選的主機列表和發送者郵箱。當出現主機列表時,表示這是一個傳送路徑,郵件就是經過這個路徑上的每個主機發送到這裏的(列表上第一個主機是最後經手的主機)。此表用於返回非傳遞信號到發送者。因爲每個傳遞主機地址都被加在此表起始處,它就必須使用發送IPCE而不是接收IPCE(如果它們不是一個IPCE的話)清楚的名稱。一些出錯信息的回覆路徑可能就是空的。
  此命令清除回覆路徑緩衝區,轉發路徑緩衝區和郵件內容緩衝區,並且將此命令的回覆路徑信息插入到回覆路徑緩衝區中。
  SEND OR MAIL (SOML)
  此命令用於開始一個郵件操作將郵件內容傳送到一個或多個終端上,或者傳送到郵箱中。對於每個接收者,如果接收者終端打開,郵件內容將被傳送到接收者的終端上,否則就送到接收者的郵箱中。參數域包括回覆路徑,如果成功地將信息送到終端或郵箱中此命令成功。
  回覆路徑包括一個可選的主機列表和發送者郵箱。當出現主機列表時,表示這是一個傳送路徑,郵件就是經過這個路徑上的每個主機發送到這裏的(列表上第一個主機是最後經手的主機)。此表用於返回非傳遞信號到發送者。因爲每個傳遞主機地址都被加在此表起始處,它就必須使用發送IPCE而不是接收IPCE(如果它們不是一個IPCE的話)清楚的名稱。一些出錯信息的回覆路徑可能就是空的。
  此命令清除回覆路徑緩衝區,轉發路徑緩衝區和郵件內容緩衝區,並且將此命令的回覆路徑信息插入到回覆路徑緩衝區中。
  SEND AND MAIL (SAML)
  此命令用於開始一個郵件操作將郵件內容傳送到一個或多個終端上,並傳送到郵箱中。如果接收者終端打開,郵件內容將被傳送到接收者的終端上和接收者的郵箱中。參數域包括回覆路徑,如果成功地將信息送到郵箱中此命令成功。
  回覆路徑包括一個可選的主機列表和發送者郵箱。當出現主機列表時,表示這是一個傳送路徑,郵件就是經過這個路徑上的每個主機發送到這裏的(列表上第一個主機是最後經手的主機)。此表用於返回非傳遞信號到發送者。因爲每個傳遞主機地址都被加在此表起始處,它就必須使用發送IPCE而不是接收IPCE(如果它們不是一個IPCE的話)清楚的名稱。一些出錯信息的回覆路徑可能就是空的。
  此命令清除回覆路徑緩衝區,轉發路徑緩衝區和郵件內容緩衝區,並且將此命令的回覆路徑信息插入到回覆路徑緩衝區中。

  RESET (RSET)
  此命令指示當送郵件操作將被放棄。任何保存的發送者,接收者和郵件內容應該被拋棄,所有緩衝區和狀態表應該被清除,接收方必須返回OK應答。

  VERIFY (VRFY)
  此命令要求接收者確認參數是一個用戶。如果這是(已經知道的)用戶名,返回用戶的全名和指定的郵箱。此命令對回覆路徑緩衝區,轉發路徑緩衝區和郵件內容緩衝區沒有影響。

  EXPAND (EXPN)
  此命令要求接收者確認參數指定了一個郵件發送列表,如果是一個郵件發送列表,就返回表中的成員。如果這是(已經知道的)用戶名,返回用戶的全名和指定的郵箱。此命令對回覆路徑緩衝區,轉發路徑緩衝區和郵件內容緩衝區沒有影響。

  HELP (HELP)
  此命令導致接收者向HELP命令的發送者發出幫助信息。此命令可以帶參數,並返回特定的信息作爲應答。此命令對回覆路徑緩衝區,轉發路徑緩衝區和郵件內容緩衝區沒有影響。

  NOOP (NOOP)
  此命令不影響任何參數和已經發出的命令。它只是說明沒有任何操作而不是說明接收者發送了一個OK應答。此命令對回覆路徑緩衝區,轉發路徑緩衝區和郵件內容緩衝區沒有影響。

  QUIT (QUIT)
  此命令指示接收方必須發送OK應答然後關閉傳送信道。接收方在接到QUIT命令並做出響應之前不應該關閉通信信道。發送方在發送QUIT命令和接收到響應之前也不應該關閉信道。即使出錯,也不應該關閉信道。如果連接被提前關閉,接收方應該象接收到RSET命令一樣,取消所有等待的操作,但不恢復原先已經做過的操作。而發送方應該象接收到暫時錯誤(4XX)一樣假定命令和操作仍在支持之中。

  TURN (TURN)
  此命令指定接收方要麼發送OK應答並改變角色爲發送SMTP,要麼發送拒絕信息並保持自己的角色。如果程序A現在是發送SMTP,它發出TURN命令後接收到OK(250)應答,它就變成了接收SMTP。程序A就進入初始狀態,好象通信信道剛打開一樣,這時它發送220準備好服務信號。如果程序B現在是接收SMTP,它發出TURN命令後接收到OK(250)應答,它就變成了發送SMTP。程序A就進入初始狀態,好象通信信道剛打開一樣,這時它準備接收220準備好服務信號。
若要拒絕改變角色,接收方可以發送502應答。
  對於這些命令的順序有一定的限制。對話的第一個命令必須是HELLO命令,此命令在此後的會話中也可以使用。如果HELLO命令的參數不可接受,必須由返回一個501失敗應答,同時接收到的SMTP必須保持在與剛纔一致的狀態下。 NOOP,HELP,EXPN和VRFY命令可以在會話的任何時候使用。MAIL,SEND,SOML或SAML命令開始一個郵件操作。一旦開始了以後就要發送RCPT和DATA命令。郵件操作可以由RSET命令終止。在一個會話中可以有一個或多個操作。
  如果在操作開始參數不可接受,必須返回501失敗應答,同時接收到的SMTP必須保持在與剛纔一致的狀態下。如果操作中的命令順序出錯,必須返回503失敗應答,同時接收到的SMTP必須保持在與剛纔一致的狀態下。
會話的最後一個命令必須是QUIT命令。此命令在會話的其它時間不能使用。
4.1.2. COMMAND語法格式
  命令是由命令碼和其後的參數域組成的。命令碼是四個字母組成的,不區別大小寫。因爲下面的命令的作用是相同的:
  MAIL Mail mail MaIl mAIl
  這對於引導任何參數值的標記也是適用的,如TO和to就是一樣的。命令碼和參數由一個或多個空格分開。然而在回覆路徑和轉發路徑中的參數是區別大小寫的。特別是在一些主機上,"smith"和"Smith"就根本不是一個用戶。
參數域由不定長的字符串組成,它由<CRLF>結束,接收方在完全接收到此序列前不會採取任何行動。方括號代表可選的參數域。如果不選擇的話,系統選擇默認的設置。
  下面是SMTP命令: HELO <SP> <domain> <CRLF> MAIL <SP> FROM:<reverse-path> <CRLF>
RCPT <SP> TO:<forward-path> <CRLF>
DATA <CRLF>
RSET <CRLF>
SEND <SP> FROM:<reverse-path> <CRLF>
SOML <SP> FROM:<reverse-path> <CRLF>
SAML <SP> FROM:<reverse-path> <CRLF>
VRFY <SP> <string> <CRLF>
EXPN <SP> <string> <CRLF>
HELP [<SP> <string>] <CRLF>
NOOP <CRLF>
QUIT <CRLF>
TURN <CRLF>

  上面參數域的格式在下面給BNF的格式給出,其中的"..."代表對於一個域的一次或多次的重複。
<reverse-path> ::= <path>
<forward-path> ::= <path>
<path> ::= "<" [ <a-d-l> ":" ] <mailbox> ">"
<a-d-l> ::= <at-domain> | <at-domain> "," <a-d-l>
<at-domain> ::= "@" <domain>
<domain> ::= <element> | <element> "." <domain>
<element> ::= <name> | "#" <number> | "[" <dotnum> "]"
<mailbox> ::= <local-part> "@" <domain>
<local-part> ::= <dot-string> | <quoted-string>
<name> ::= <a> <ldh-str> <let-dig>
<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
<let-dig> ::= <a> | <d>
<let-dig-hyp> ::= <a> | <d> | "-"
<dot-string> ::= <字符串> | <字符串> "." <dot-string>
<字符串> ::= <字符> | <字符> <字符串>
<quoted-string> ::= """ <qtext> """
<qtext> ::= "\" <x> | "\" <x> <qtext> | <q> | <q> <qtext>
<字符> ::= <c> | "\" <x>
<dotnum> ::= <snum> "." <snum> "." <snum> "." <snum>
<number> ::= <d> | <d> <number>
<CRLF> ::= <CR> <LF>
<CR> ::= 回車符(ASCII碼13) <LF> ::= (ASCII碼10)
<SP> ::= 空格(ASCII碼32) <snum> ::=由一個,兩個或三個數字組成的介於0-255之間的數字
<a> ::= 所有A-Z的52個大小寫英文字母
<c> ::= 128個ASCII字符,但不包括空格和特殊字符
<d> ::= 0-9數字
<q> ::=不包括<CR>,<LF>,"或\的128個ASCII字符
<x> ::=所有128個ASCII字符
<special> ::= "<" | ">" | "(" | ")" | "[" | "]" | "\" | "." | "," | ";" | ":" | "@" """ 或控制字符
  注意: "\"是一個轉意字符,它表示在其後的字符代表另外的意義。例如"Joe\,Smith"用於表示單獨一個由逗號分隔的用戶名。主機通常由轉化爲地址的名稱代表。注意:域的名稱元素是正式的名稱,不能夠使用暱稱或假名。
有時候名稱的轉變機制可能不知道主機,這就造成了通信的阻塞。爲了解決這個問題,可以採取兩種方法:一種方法是:在"#"後加入一個十進制數表示主機地址;另一種方法是在其後加入32位的IP地址,IP地址的形式是由句號分隔的四個介於0-255之間的十進制數。時間戳行和返回路徑行的格式通常由下面定義:
<return-path-line> ::= "Return-Path:" <SP><reverse-path><CRLF>
<time-stamp-line> ::= "Received:" <SP> <stamp> <CRLF>
<stamp> ::= <from-domain> <by-domain> <opt-info> ";" <daytime>
<from-domain> ::= "FROM" <SP> <域> <SP>
<by-domain> ::= "BY" <SP> <域> <SP>
<opt-info> ::= [<via>] [<with>] [<id>] [<for>]
<via> ::= "VIA" <SP> <連接> <SP>
<with> ::= "WITH" <SP> <協議> <SP>
<id> ::= "ID" <SP> <字符串> <SP>
<for> ::= "FOR" <SP> <路徑> <SP>
<連接> ::= 在網絡信息中心註冊的連接的標準名稱
<協議> ::= 在網絡中心註冊的協議的名稱
<daytime> ::= <SP> <日> <SP> <時間>
<日期> ::= <日> <SP> <月> <SP> <年>
<時間> ::= <小時> ":" <分> ":" <秒> <SP> <時區>
<dd> ::= 由一個或兩個數字組成的每月1-31日
<月> ::= "JAN" | "FEB" | "MAR" | "APR" | "MAY" | "JUN" | "JUL" | "AUG" | "SEP" | "OCT" | "NOV" | "DEC"
<年> ::= 由兩位數字表示本世界的年代00-99
<小時> ::= 每天的24小時,由0到24
<分> ::= 每小時的分鐘數0-59
<秒> ::= 每分鐘的秒數0-59
<時區> ::= 全球標準時區
返回路徑例子
Return-Path: <@CHARLIE.ARPA,@BAKER.ARPA:[email protected]>
時間戳行例子
Received: FROM ABC.ARPA BY XYZ.ARPA ; 22 OCT 81 09:23:59 PDT
Received: from ABC.ARPA by XYZ.ARPA via TELENET with X25
id M12345 for [email protected] ; 22 OCT 81 09:23:59 PDT
4.2. SMTP響應
  對SMTP命令的響應是多樣的,它確定了在郵件傳輸過程中請求和處理的同步,也保證了發送SMTP知道接收SMTP的狀態。每個命令必須有且只有一個響應。
  SMTP響應由三位數字組成,其後跟一些文本。數字幫助決定下一個應該進入的狀態,而文本對人是有意義的。三位的響應已經包括了足夠的信息,不用再閱讀文本,文本可以直接拋棄或者傳遞給用戶。特別的是,文本是與接收和環境相關的,所以每次接收到的文本可能不同。在附錄E中可以看到全部的響應碼。正規的情況下,響應由下面序列構成:三位的數字,<SP>,一行文本和一個<CRLF>,或者也可以是一個多行響應。只有EXPN和HELP命令可以導致多行應答,然而,對所有命令,多行響應都是允許的。
4.2.1. REPLY CODES BY FUNCTION GROUPS 500 格式錯誤,命令不可識別(此錯誤也包括命令行過長)
501 參數格式錯誤
502 命令不可實現
503 錯誤的命令序列
504 命令參數不可實現
211 系統狀態或系統幫助響應
214 幫助信息
220 <domain> 服務就緒
221 <domain> 服務關閉傳輸信道
421 <domain> 服務未就緒,關閉傳輸信道(當必須關閉時,此應答可以作爲對任何命令的響應)
250 要求的郵件操作完成
251 用戶非本地,將轉發向<forward-path>
450 要求的郵件操作未完成,郵箱不可用(例如,郵箱忙)
550 要求的郵件操作未完成,郵箱不可用(例如,郵箱未找到,或不可訪問)
451 放棄要求的操作;處理過程中出錯
551 用戶非本地,請嘗試<forward-path>
452 系統存儲不足,要求的操作未執行
552 過量的存儲分配,要求的操作未執行
553 郵箱名不可用,要求的操作未執行(例如郵箱格式錯誤)
354 開始郵件輸入,以<CRLF>.<CRLF>結束
554 操作失敗
4.3. 命令和應答序列
  發送者和接收者之間的通信是一問一答的交替對話形式,由發送者控制。這樣,發送發出一條命令,接收者發出一個響應。接收者在發送下一條指令前必須等應答。一個重要的應答是連接應答。在連接完成時,接收者通常會發送220"服務就緒"。發送者在繼續發送指令前會等待此應答。注意:每個連接應答必須擁有服務主機的正式名稱作爲第一部分,其後跟響應碼。例如:
  220 <SP> USC-ISIF.ARPA <SP> Service ready <CRLF>
  下面列出了成功和失敗應答,這些應答必須遵守嚴格的次序,接收者可以不理會應答中的文本,但是由數字指定的意義和操作和命令應答序列不能更改。命令響應序列:
  每個命令列出了它可能的應答。使用在可能應答前的前綴"P"表示預備的(未用在SMTP中),"I"表示中間的,"S"表示成功,"F"表示失敗,"E"表示錯誤。如果STMP接收者必須關閉信道,可以對任何命令作出421(服務不可用,關閉傳輸信道)響應。此表基於下面要講述的狀態圖:
CONNECTION ESTABLISHMENT(建立連接)
S: 220
F: 421
HELO
S: 250
E: 500, 501, 504, 421
MAIL
S: 250
F: 552, 451, 452
E: 500, 501, 421
RCPT S: 250, 251 F: 550, 551, 552, 553, 450, 451, 452 E: 500, 501, 503, 421
DATA
I: 354 -> data -> S: 250
F: 552, 554, 451, 452
F: 451, 554
E: 500, 501, 503, 421
RSET
S: 250
E: 500, 501, 504, 421
SEND
S: 250
F: 552, 451, 452
E: 500, 501, 502, 421
SOML
S: 250
F: 552, 451, 452
E: 500, 501, 502, 421
SAML
S: 250
F: 552, 451, 452
E: 500, 501, 502, 421
VRFY
S: 250, 251
F: 550, 551, 553
E: 500, 501, 502, 504, 421
EXPN
S: 250
F: 550
E: 500, 501, 502, 504, 421
HELP
S: 211, 214
E: 500, 501, 502, 504, 421
NOOP
S: 250
E: 500, 421
QUIT
S: 221
E: 500
TURN
S: 250
F: 502
E: 500, 503
4.4. 狀態圖
  下面狀態圖是一個簡單的SMTP實現,每一組命令都有一個狀態圖。在圖中,只使用了響應碼的第一位數字作爲響應的代表。命令組是對每個命令建立模式然後以結構模式將命令集中起來的。對於每個命令有三種可能的應答:成功(S),失敗(F)和錯誤(E)。在狀態中,我們使用B代表開始,使用W代表等待應答。


   此狀態圖使用瞭如下命令:HELO, MAIL, RCPT, RSET, SEND, SOML, SAML, VRFY, EXPN, HELP, NOOP, QUIT, TURN.
下面是對於DATA命令的更復雜的狀態圖:

  注意:這裏的郵件內容是多行的,接收者只能收到最後一行時才發出應答。
4.5. 詳細內容
4.5.1. 最小實現
  爲使SMTP能夠工作,對於接收者來說,這是最少應該實現的命令:
COMMANDS - HELO
MAIL
RCPT
DATA
RSET
NOOP
QUIT
4.5.2. 透明性
  沒有對數據透明性的保證,在發送類似"<CRLF>.<CRLF>"結束郵件內容時會發生錯誤。通常,用戶不關心這個"非法"序列。若要所有用戶能夠透明地使用必須使用以下措施:
1. 在發送郵件之間,發送SMTP必須檢查郵件的每一行,如果是一個句號,就在行首再加一個句號。
2. 當郵件被接收時,接收SMTP必須檢查郵件的每一行,如果發現一行僅有一個句號,郵件就此結束,如果一行中有兩個句號,那麼這一行中就只應該有一個句號,而將第一個句號刪除。
  發送的郵件內容可以包括所有128個ASCII字符。所有字符發送到收信者的郵箱,包括格式符號和其它控制字符。如果傳輸信道提供一個8位數據流,7位的ASCII碼就可以在其中傳送,而將最高位置爲0。一些系統在接收和存儲時需要對數據進行格式轉換。對於使用不同於ASCII字符集的主機或不能以串的形式而只能以記錄形式存儲的主機更是如此,如果必須進行轉換,必須能夠再次轉換回來,對於用於存儲轉發的主機更是如此。
4.5.3. 大小
  一些對象需要最大和最小大小。也就是說,每個實現必須能夠接收大於最小大小的對象,不能發送大於最大大小的對象。對於可能的最大大小,實現技術上並沒有限制。
用戶 用戶名的最大長度是64個字節。
域 域的最大長度是64個字符
路徑 回覆路徑和轉發路徑的最大長度是256個字符
命令行 命令行的最大長度,包括回車符爲512個字符
應答行 應答行的最大長度,包括回車符爲512個字符
文本行 文本行的最大長度,包括回車符和爲透明性增加的字符不得超過1000個字符
接收緩衝區 接收緩衝區最多可以容納100個接收者
如果出錯,應答如下:
500 行過長
501 路徑過多
552 接收者過多
552 郵件內容過多
附錄 A TCP傳輸服務
  傳輸控制協議(TCP)在ARPA Internet中使用,並遵守網絡協議的US DoD標準。SMTP傳輸信道連接建立在發送進程的端口U和接收進程的端口L上。一個單一的全雙工信道用於傳輸。被指定用於此協議的服務端口爲25,也就是說L=25。TCP連接支持傳輸8位字節,而SMTP只需要傳輸7位;這樣,每個8位字符的最高位被置爲0。
附錄 B NCP傳輸服務
  ARPANET主機-主機協議(由網絡控制程序實現)也可以用於ARPANET。SMTP傳輸信道連接建立在發送進程的端口U和接收進程的端口L上;其後,根據初始連接協議(ICP)建立一對簡單連接。這一對簡單連接被用作傳輸信道。此協議被指定爲連接套接字25,也就是說L=25。NCP連接支持傳輸8位字節,而SMTP只需要傳輸7位;這樣,每個8位字符的最高位被置爲0。
附錄 C NITS
  也可以使用網絡獨立轉輸服務。通過在NITS在發送進程和接收進程之間建立傳輸信道。發送進程執行CONNECT原語,然後等待接收ACCEPT原語。NITS連接支持傳輸8位字節,而SMTP只需要傳輸7位;這樣,每個8位字符的最高位被置爲0。
附錄 D X.25傳輸服務
  可以直接使用公共數據網絡接收的X.25服務,然而,推薦在其上使用可靠的端到端的協議如TCP。
附錄 E 應答碼構成方法
  三位的應答碼每一位都有特定的意義。每一位應答表示是否是成功的,失敗的或未完成的。通過這一位,不復雜的SMTP發送就可以決定下一步的操作,如果發送方希望大概瞭解究竟出了什麼問題,它可以檢測第二位,而第三位則保存了最後更完整的信息。也就是說,從第一位到第三位,接收方可以一步比一步精確地確定接收方的狀態。對於第一位有五種可能的表示代表不同的意義:

  1yz 部分完成應答

  命令被接受,但是要求的操作被中止,原因在應答碼中。發送方應該再次發送另一命令指明是否繼續操作,或者放棄操作。

  2yz 全部完成應答

  要求的操作已經完成,可以開始另一個新的請求。

  3yz 需要近一步信息的部分完成應答

  命令被接受,但是要求的操作被中止,需要接收進一步的信息。發送方應該發送另一條命令指明進一步的信息。

  4yz 暫時未完成應答

  命令未被接受,要求的操作也未執行,但是發生錯誤的狀態是暫時的,可以再一次請求操作。發送者應該返回命令序列的開始命令(如果有的話)。很難解釋這個暫時的意義,特別對於兩個不同的站點來說。區別應答是屬於些類還是下一類的方法是:如果能夠不加任何改變地重複的再一次發送命令,就是本類的,如果不是,就是下一類(5yz)的。

  5yz 永久未完成應答

  命令未被接受,要求的操作未完成。發送對命令的重複不起作用。即使一些出錯條件已經改變,但是用戶已經不希望重試,而希望在未來的某個時間再進行操作。

  應答的第二位的意義有以下幾類:

x0z 語法:此類型的應答是針對以下情況的:語法錯誤;符合語法但命令不存在功能;未完成或冗餘的命令。

x1z 信息:此類型的應答是用於請求信息的,如狀態或幫助信息。

x2z 連接:此類型的應答是關於傳輸信道的。

x3z 未使用。

x4z 未使用。

x5z 郵件系統:此類型的應答指明接收方郵件系統關於請求傳送或其它操作的狀態的。

  第三位給出了更詳細的說明。列出的應答表說明了這一點。文本應答是推薦使用的,而不是必須使用的,它的內容是可以根據不同情況而變化的。另一方面,應答碼必須嚴格遵守本節的說明。接收方不應該因爲稍稍的不同情況而自己創建新的代碼而不使用已經定義的代碼。例如,如NOOP命令的情況,如果成功執行它後,不用返回任何新的信息,只用返回250應答。當發送的命令要求一個未實現的站點指定操作時,應答應該是502。 應答文本可能多於一行;在此情況下,文本必須被標記,接收文本的一方纔不致於少讀入一行數據。這要求特定的格式說明多行應答。此格式是:每一行,除了最後一行外,都以應答碼加一個"-"開始。而最後一行以應答碼加空格<SP>開始。如下例:

123-First line

123-Second line

123-234 text beginning with numbers

123 The last line

  通常情況下,接收的一方只用尋找應答碼加空格的那一行就可以,而忽略前面行的內容。在特殊的情況下,發送方必須知道響應文本的內容,這時接收應答的一方可以通過當時的情況正確地決定是否需要知道文本的內容。  
附錄 F 一些例子
本節提供了一些SMTP會話的完整例子。

典型的SMTP操作

此類顯示郵件如何由在USC-ISIF和機上的Smith發送到BBN-UNIX主機上Jones,Green和Brown的。這裏,我們假設USC-ISIF主機直接和BBN-UNIX主機聯繫。Jones和Brown接收郵件,而Green在BBN-UNIX上沒有郵箱。

R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready

S: HELO USC-ISIF.ARPA

R: 250 BBN-UNIX.ARPA

S: MAIL FROM:<[email protected]>

R: 250 OK

S: RCPT TO:<[email protected]>

R: 250 OK

S: RCPT TO:<[email protected]>

R: 550 No such user here

S: RCPT TO:<[email protected]>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

 

S: QUIT

R: 221 BBN-UNIX.ARPA Service closing transmission channel

放棄SMTP操作

R: 220 MIT-Multics.ARPA Simple Mail Transfer Service Ready

S: HELO ISI-VAXA.ARPA R: 250 MIT-Multics.ARPA

S: MAIL FROM:<[email protected]>

R: 250 OK

S: RCPT TO:<[email protected]>

R: 250 OK
 
S: RCPT TO:<[email protected]>

R: 550 No such user here

S: RSET

R: 250 OK

S: QUIT

R: 221 MIT-Multics.ARPA Service closing transmission channel

轉發郵件

第一步:源主機到轉發主機

R: 220 USC-ISIE.ARPA Simple Mail Transfer Service Ready

S: HELO MIT-AI.ARPA

R: 250 USC-ISIE.ARPA

 

S: MAIL FROM:<[email protected]>

R: 250 OK

S: RCPT TO:<@USC-ISIE.ARPA:[email protected]>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Date: 2 Nov 81 22:33:44

S: From: John Q. Public <[email protected]>

S: Subject: The Next Meeting of the Board

S: To: [email protected]

S:

S: Bill:

S: The next meeting of the board of directors will be

S: on Tuesday.

S: John.

S: .

R: 250 OK

S: QUIT

R: 221 USC-ISIE.ARPA Service closing transmission channel

第二步:轉發主機到目的主機

R: 220 BBN-VAX.ARPA Simple Mail Transfer Service Ready

S: HELO USC-ISIE.ARPA

R: 250 BBN-VAX.ARPA

S: MAIL FROM:<@USC-ISIE.ARPA:[email protected]>

R: 250 OK

S: RCPT TO:<[email protected]>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Received: from MIT-AI.ARPA by USC-ISIE.ARPA ;

2 Nov 81 22:40:10 UT

S: Date: 2 Nov 81 22:33:44

S: From: John Q. Public <[email protected]>

S: Subject: The Next Meeting of the Board

S: To: [email protected]

S:

S: Bill:

S: The next meeting of the board of directors will be

S: on Tuesday.

S: John.

S: .

R: 250 OK

S: QUIT

R: 221 USC-ISIE.ARPA Service closing transmission channel
確認和發送

R: 220 SU-SCORE.ARPA Simple Mail Transfer Service Ready

S: HELO MIT-MC.ARPA

R: 250 SU-SCORE.ARPA

S: VRFY Crispin

R: 250 Mark Crispin <[email protected]>

S: SEND FROM:<[email protected]>

R: 250 OK

S: RCPT TO:<[email protected]>

R: 250 OK
S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

S: QUIT

R: 221 SU-SCORE.ARPA Service closing transmission channel

獲得和發送郵件 首先確定用戶名,然後嘗試將郵件發送到用戶終端,當它失敗時,發送到用戶郵箱。

R: 220 SU-SCORE.ARPA Simple Mail Transfer Service Ready

S: HELO MIT-MC.ARPA

R: 250 SU-SCORE.ARPA

 

S: VRFY Crispin

R: 250 Mark Crispin <[email protected]>

S: SEND FROM:<[email protected]>

R: 250 OK
S: RCPT TO:<[email protected]>

R: 450 User not active now

S: RSET

R: 250 OK

S: MAIL FROM:<[email protected]>

R: 250 OK

S: RCPT TO:<[email protected]>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

S: QUIT

R: 221 SU-SCORE.ARPA Service closing transmission channel

上述問題的更有效的作法

R: 220 SU-SCORE.ARPA Simple Mail Transfer Service Ready

S: HELO MIT-MC.ARPA

R: 250 SU-SCORE.ARPA
S: VRFY Crispin

R: 250 Mark Crispin <[email protected]>

S: SOML FROM:<[email protected]>

R: 250 OK

S: RCPT TO:<[email protected]>

R: 250 User not active now, so will do mail.

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

S: QUIT

R: 221 SU-SCORE.ARPA Service closing transmission channel

  郵件列表 首先,兩個郵件列表中的每一個在不同主機的不同會話上擴展,然後,通過轉發主機向列表上的用戶發送郵件。

第一步:擴展第一個列表

R: 220 MIT-AI.ARPA Simple Mail Transfer Service Ready

S: HELO SU-SCORE.ARPA

R: 250 MIT-AI.ARPA

 

S: EXPN Example-People

R: 250-<[email protected]>

R: 250-Fred Fonebone <[email protected]>

R: 250-Xenon Y. Zither <[email protected]>

R: 250-Quincy Smith <@USC-ISIF.ARPA:[email protected]>

R: 250-<[email protected]>

R: 250 <[email protected]>

S: QUIT

R: 221 MIT-AI.ARPA Service closing transmission channel
 
第二步:擴展第二個列表

R: 220 MIT-MC.ARPA Simple Mail Transfer Service Ready

S: HELO SU-SCORE.ARPA

R: 250 MIT-MC.ARPA

S: EXPN Interested-Parties

R: 250-Al Calico <[email protected]>

R: 250-<[email protected]>

R: 250-Quincy Smith <@USC-ISIF.ARPA:[email protected]>

R: 250-<[email protected]>

R: 250 <[email protected]>

S: QUIT

R: 221 MIT-MC.ARPA Service closing transmission channel

 

第三步:通過轉發主機向包括於兩個列表中的所有用戶發送郵件

R: 220 USC-ISIE.ARPA Simple Mail Transfer Service Ready

S: HELO SU-SCORE.ARPA

R: 250 USC-ISIE.ARPA

S: MAIL FROM:<[email protected]>

R: 250 OK

S: RCPT TO:<@USC-ISIE.ARPA:[email protected]>

R: 250 OK

S: RCPT TO:<@USC-ISIE.ARPA:[email protected]>

R: 250 OK

S: RCPT TO:<@USC-ISIE.ARPA:[email protected]>

R: 250 OK

S: RCPT

TO:<@USC-ISIE.ARPA,@USC-ISIF.ARPA:[email protected]>

R: 250 OK

S: RCPT TO:<@USC-ISIE.ARPA:[email protected]>

R: 250 OK

S: RCPT TO:<@USC-ISIE.ARPA:[email protected]>

R: 250 OK

S: RCPT TO:<@USC-ISIE.ARPA:[email protected]>

R: 250 OK

 

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

S: QUIT

R: 221 USC-ISIE.ARPA Service closing transmission channel

轉發的情況

R: 220 USC-ISIF.ARPA Simple Mail Transfer Service Ready

S: HELO LBL-UNIX.ARPA

R: 250 USC-ISIF.ARPA

S: MAIL FROM:<[email protected]>

R: 250 OK
 
S: RCPT TO:<[email protected]>

R: 251 User not local; will forward to <[email protected]>

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK
S: QUIT

R: 221 USC-ISIF.ARPA Service closing transmission channel

第一步:嘗試第一臺主機上的郵箱

R: 220 USC-ISIF.ARPA Simple Mail Transfer Service Ready

S: HELO LBL-UNIX.ARPA

R: 250 USC-ISIF.ARPA

S: MAIL FROM:<[email protected]>

R: 250 OK

S: RCPT TO:<[email protected]>

R: 251 User not local; will forward to <[email protected]>
 
S: RSET

R: 250 OK
 
S: QUIT

R: 221 USC-ISIF.ARPA Service closing transmission channel

第二步:嘗試第二臺主機上的郵箱

R: 220 USC-ISI.ARPA Simple Mail Transfer Service Ready

S: HELO LBL-UNIX.ARPA

R: 250 USC-ISI.ARPA

S: MAIL FROM:<[email protected]>

R: 250 OK
 
S: RCPT TO:<[email protected]>

R: OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK
 
S: QUIT

R: 221 USC-ISI.ARPA Service closing transmission channel

許多接收者的情況

R: 220 BERKELEY.ARPA Simple Mail Transfer Service Ready

S: HELO USC-ISIF.ARPA

R: 250 BERKELEY.ARPA
 
S: MAIL FROM:<[email protected]>

R: 250 OK
 
S: RCPT TO:<[email protected]>

R: 250 OK

S: RCPT TO:<[email protected]>

R: 552 Recipient storage full, try again in another transaction
 
S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.
S: .

R: 250 OK

 

S: MAIL FROM:<[email protected]>

R: 250 OK

S: RCPT TO:<[email protected]>

R: 250 OK

S: DATA

R: 354 Start mail input; end with <CRLF>.<CRLF>

S: Blah blah blah...

S: ...etc. etc. etc.

S: .

R: 250 OK

S: QUIT

R: 221 BERKELEY.ARPA Service closing transmission channel

名詞表:

<CRLF>
回車

<SP>
空格

ASCII
美國標準信息交換碼

主機
擁有SMTP進程或郵箱的網絡計算機

發送SMTP進程
與接收SMTP進程一起工作的進程。發送SMTP開始傳輸服務連接,它發出SMTP命令,接收應答,管理郵件的傳送

用戶
希望獲得郵件服務的人(或以人的名義出現的進程),還有就是郵件的接收者。

會話
當傳輸信道打開時進行的一系列信息交換

傳輸服務
可靠的面向流的數據通信服務。例如:NCP,TCP,NITS。

傳輸信道
在發送SMTP和接收SMTP之間建立的全雙工的用於交換命令,應答和郵件內容的信道

字符
可顯示字符串


以一個<CRLF>結束的郵件內容

應答
接收SMTP對發送SMTP的通過傳輸信道發送的的對某一命令的(成功或不成功的)響應。應答的一般格式是應答碼加一段文本。通常情況下,應答碼供機器使用,而文本用於人類用戶使用

郵件內容
一系列的字符串,它們符合ARPA Internet文本信息格式標準的標準字符集

郵件內容結束標記
標明郵件內容結束的特定字符

郵箱
指定應該向何處發向用戶的信件的地址(字符串)。它通常由用戶名和主機名錶示

命令
由發送SMTP發送到接收SMTP的要求一個郵件服務操作的請求


郵件系統中主機地址字符串的層次式表示

接收SMTP進程
與發送SMTP進程一起工作的進程。它等待通過傳輸服務建立的連接。它接收發送SMTP發出的命令,給出應答並執行相應的操作

操作
一個信息由一個接收者發送到另一個或多個接收者的一系列操作
參考資料
   [1]  ASCII

      ASCII, "USA Code for Information Interchange", United States of
      America Standards Institute, X3.4, 1968.  Also in:  Feinler, E.
      and J. Postel, eds., "ARPANET Protocol Handbook", NIC 7104, for
      the Defense Communications Agency by SRI International, Menlo
      Park, California, Revised January 1978.

   [2]  RFC 822

      Crocker, D., "Standard for the Format of ARPA Internet Text
      Messages," RFC 822, Department of Electrical Engineering,
      University of Delaware, August 1982.

   [3]  TCP

      Postel, J., ed., "Transmission Control Protocol - DARPA Internet
      Program Protocol Specification", RFC 793, USC/Information Sciences
      Institute, NTIS AD Number A111091, September 1981.  Also in:
      Feinler, E. and J. Postel, eds., "Internet Protocol Transition
      Workbook", SRI International, Menlo Park, California, March 1982.

   [4]  NCP

      McKenzie,A., "Host/Host Protocol for the ARPA Network", NIC 8246,
      January 1972.  Also in:  Feinler, E. and J. Postel, eds., "ARPANET
      Protocol Handbook", NIC 7104, for the Defense Communications
      Agency by SRI International, Menlo Park, California, Revised
      January 1978.

   [5]  Initial Connection Protocol

      Postel, J., "Official Initial Connection Protocol", NIC 7101,
      11 June 1971.  Also in:  Feinler, E. and J. Postel, eds., "ARPANET
      Protocol Handbook", NIC 7104, for the Defense Communications
      Agency by SRI International, Menlo Park, California, Revised
      January 1978.

   [6]  NITS

      PSS/SG3, "A Network Independent Transport Service", Study Group 3,
      The Post Office PSS Users Group, February 1980.  Available from
      the DCPU, National Physical Laboratory, Teddington, UK.

August 1982                                                      RFC 821
Simple Mail Transfer Protocol                                          

   [7]  X.25

      CCITT, "Recommendation X.25 - Interface Between Data Terminal
      Equipment (DTE) and Data Circuit-terminating Equipment (DCE) for
      Terminals Operating in the Packet Mode on Public Data Networks,"
      CCITT Orange Book, Vol. VIII.2, International Telephone and
      Telegraph Consultative Committee, Geneva, 1976.


RFC821  SIMPLE MAIL TRANSFER PROTOCOL                          RFC821 簡單郵件傳輸協議(SMTP)

1


1
RFC文檔中文翻譯計劃

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章