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:<Smith@Alpha.ARPA>
R: 250 OK
S: RCPT TO:<Jones@Beta.ARPA>
R: 250 OK
S: RCPT TO:<Green@Beta.ARPA>
R: 550 No such user here
S: RCPT TO:<Brown@Beta.ARPA>
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:<Postel@USC-ISI.ARPA>
R: 251 User not local; will forward to <Postel@USC-ISIF.ARPA>
或者
S: RCPT TO:<Paul@USC-ISIB.ARPA>
R: 551 User not local; please try <Mockapetris@USC-ISIF.ARPA>
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 <Smith@USC-ISIF.ARPA>
或者
S: VRFY Smith
R: 251 User not local; will forward to <Smith@USC-ISIQ.ARPA>
或者
S: VRFY Jones
R: 550 String does not match anything.
或者
S: VRFY Jones
R: 551 User not local; please try <Jones@USC-ISIQ.ARPA>
或者
S: VRFY Gourzenkyinplatz
R: 553 User ambiguous.
郵箱列表要求多個響應的情況如下例所示:
S: EXPN Example-People
R: 250-Jon Postel <Postel@USC-ISIF.ARPA>
R: 250-Fred Fonebone <Fonebone@USC-ISIQ.ARPA>
R: 250-Sam Q. Smith <SQSmith@USC-ISIQ.ARPA>
R: 250-Quincy Smith <@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>
R: 250-<joe@foo-unix.ARPA>
R: 250 <xyz@bar-unix.ARPA>
或者
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:JOE@HOSTW.ARPA>
R: 250 ok
S: DATA
R: 354 send the mail data, end with .
S: Date: 23 Oct 81 11:22:33
S: From: SMTP@HOSTY.ARPA
S: To: JOE@HOSTW.ARPA
S: Subject: Mail System Problem
S:
S: Sorry JOE, your message to SAM@HOSTZ.ARPA 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:<USERX@HOSTY.ARPA>
TO:<@HOSTA.ARPA,@HOSTB.ARPA:USERC@HOSTD.ARPA>
將會變成如下形式:
FROM:<@HOSTA.ARPA:USERX@HOSTY.ARPA>
TO:<@HOSTB.ARPA:USERC@HOSTD.ARPA>.
此命令導致它的轉寄路徑參數加入轉寄路徑緩衝區中。
DATA (DATA)
接收者將跟在命令後的行作為郵件內容。此命令導致此命令後的郵件內容
加入郵件內容緩衝區。郵件內容可以包括所有128個ASCII碼字元。郵件內容由只
包括一個句號的行結束,也就是如下的字元序列:"<CRLF>.<CRLF>",它指示了
郵件的結束。
郵件內容的結束指示要求接收者現在就處理儲存的郵件內容。此過程將回複
路徑緩衝區,轉寄路徑緩衝區和郵件內容緩衝區的內容全部清空。如果操作成功,
接收者必須返回OK應答;如果失敗也必須返回失敗應答。
當接收SMTP收到一條資訊時,無論是用作轉寄還是此郵件已經到達目的地,
它都必須在郵件內容的開始處加上時間戳記這一行,這一行指示了接收到郵件主
機和發出此郵件主機的標識,以及接收到郵件內容的時間和日期。轉寄的信件
將有多行這樣的時間戳記。當接收SMTP作最後一站的傳送時,它將返迴路徑資訊
行插入郵件中。此行包括了發送命令中的<reverse-path>的資訊。在這裡,最
後一站的傳送的意思是郵件將被送到目的使用者手中,但在一些情況下,郵件可
能需要更進一步的加工並由另外的郵件系統傳送。
可能在返迴路徑中的郵箱與實際發送的郵件不一致,這個情況可能發生在
需要傳送一個特定的錯誤處理信箱而不是信件寄件者那裡。上面所述說明了,
最後的郵件內容由一個返迴路徑行,和在其後的一個或多個時間戳記行構成。這
些行後面是郵件內容的頭和體資訊。
當處理後面的郵件資料指示部分成功時就需要特定的說明。這種情況可能
發生在發送SMTP發現當郵件需要傳送給多個使用者時,只能夠成功地向其中的一
部分發送資訊這種情況下。在這種情況下,必須對DATA命令發送OK應答,而接
收SMTP組織並發送一個"不可傳遞郵件"資訊到資訊的寄件者。在此資訊中或者
發送一個不成功接收者的列表,或者每次發送一個不成接收者,而發送多次。
所有不可傳遞郵件資訊由MAIL命令發送。
返迴路徑和接收時間戳記例子
Return-Path: <@GHI.ARPA,@DEF.ARPA,@ABC.ARPA:JOE@ABC.ARPA>
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: JOE@ABC.ARPA
Subject: Improved Mailing System Installed
To: SAM@JKL.ARPA
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命令。此命令在會話的其它時間不能使用。