[C++ RFC] SMTP協議rfc821中文

 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命令。此命令在會話的其它時間不能使用。

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