国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 網絡通信 > 正文

簡單郵件傳輸協議(SMTP)

2019-11-04 10:54:51
字體:
來源:轉載
供稿:網友

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>

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

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

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

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

DATA<CRLF>

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

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

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

  S:MAILFROM:<Smith@Alpha.ARPA>
  R:250OK
  S:RCPTTO:<Jones@Beta.ARPA>
  R:250OK
  S:RCPTTO:<Green@Beta.ARPA>
  R:550NosUChuserhere
  S:RCPTTO:<Brown@Beta.ARPA>
  R:250OK
  S:DATA
  R:354Startmailinput;endwith<CRLF>.<CRLF>
  S:Blahblahblah...
  S:...等等
  S:<CRLF>.<CRLF>
  R:250OK
  此信被前兩個人接收,而第三個人在此主機上沒有郵箱。
3.2.轉發
  下面是一些<forward-path>中目的地址不正確的,但接收者知道正確的目的地址的例子。在這些例子中,下列應答之一應該答應發送方與獲得正確地址。

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

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

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

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

  轉發的例子
  S:RCPTTO:<Postel@USC-ISI.ARPA>
  R:251Usernotlocal;willforwardto<Postel@USC-ISIF.ARPA>
  或者
  S:RCPTTO:<Paul@USC-ISIB.ARPA>
  R:551Usernotlocal;pleasetry<Mockapetris@USC-ISIF.ARPA>
3.3.確認和擴展
  SMTP提供了另外的確認用戶名和擴展郵件列表的功能。這些功能由VREF和EXPN命令完成,它們都以字符串為參數。對于VREF命令,字符串參數指的是用戶名,對此命令的響應要包括用戶的命名和用戶的郵箱。對于EXPN命令,字符串參數指的是郵件列表,對此命令的響應多于一個,它們要包括所有列表中用戶的命名和他們的郵箱。
  “用戶名”是一個多余的項目,它是故意被加上的。假如主機采用VREF命令和EXPN命令,最后本地郵箱必須提供用戶名使它被主機確認。假如主機選擇由另外的字符串作為用戶名,也是答應的。
  在一些主機中,郵箱列表和一個郵箱的代名有一點不清楚,因為一般的數據結構可能包括兩種類型的入口。假如要發出對郵件列表的確認,應該給出確定響應。在接收到這個消息后,主機將把郵件傳送到列表上所有的地址上去,假如沒有接收到確定響應,就會報告錯誤。例如,"550Thatisamaillist,notausername"。假如請求用于擴展一個用戶名,可能通過返回包括一個名字的列表來形成確定響應,假如沒有接收到確定響應,就會報告錯誤。(例如,"550Thatisausername,notamailinglist")。
  在多個響應的情況下(通常是對于EXPN而言的),每個應答指定一個郵箱。在模糊請求的情況下,例如"VRFYSmith",這里兩個Smith的響應必須是"553Userambiguous"。

  確認用戶名的情況如下例所示:例3:
  確認用戶名
  S:VRFYSmithR:250FredSmith<Smith@USC-ISIF.ARPA>
  或者
  S:VRFYSmith
  R:251Usernotlocal;willforwardto<Smith@USC-ISIQ.ARPA>
  或者
  S:VRFYJones
  R:550Stringdoesnotmatchanything.
  或者
  S:VRFYJones
  R:551Usernotlocal;pleasetry<Jones@USC-ISIQ.ARPA>
  或者
  S:VRFYGourzenkyinplatz
  R:553Userambiguous.

  郵箱列表要求多個響應的情況如下例所示:
  S:EXPNExample-People
  R:250-JonPostel<Postel@USC-ISIF.ARPA>
  R:250-FredFonebone<Fonebone@USC-ISIQ.ARPA>
  R:250-SamQ.Smith<SQSmith@USC-ISIQ.ARPA>
  R:250-QuincySmith<@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>
  R:250-<joe@foo-unix.ARPA>
  R:250<xyz@bar-unix.ARPA>
  或者
  S:EXPNExecutive-Washroom-List
  R:550accessDeniedtoYou.

  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:220BBN-UNIX.ARPASimpleMailTransferServiceReady
  S:HELOUSC-ISIF.ARPA
  R:250BBN-UNIX.ARPA

  關閉聯結的例子
  S:QUIT
  R:221BBN-UNIX.ARPAServiceclosingtransmissionchannel
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服務器接受了轉發任務,但后來它發現因為轉發路徑不正確或者其它原理無法發送郵件,它必須建立一"undeliverablemail"信號,將它此信號送到此信的發主者那里。
  此信號必須是從此主機的SMTP服務上發出的,當然了,此服務器不應該再報告出錯信息的錯誤。一種阻止這種出錯報告循環的情況是在信號的郵件命令的回復路徑上置空。在傳送此信息時,答應將回復路徑也置為空。一個MAIL命令后的回復路徑為空表現為如下形式:
  MAILFROM:<>

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

  不可傳送郵件信息的例子
  S:MAILFROM:<>
  R:250ok
  S:RCPTTO:<@HOSTX.ARPA:JOE@HOSTW.ARPA>
  R:250ok
  S:DATA
  R:354sendthemaildata,endwith.
  S:Date:23Oct8111:22:33
  S:From:SMTP@HOSTY.ARPA
  S:To:JOE@HOSTW.ARPA
  S:Subject:MailSystemPRoblem
  S:
  S:SorryJOE,yourmessagetoSAM@HOSTZ.ARPAlost.
  S:HOSTZ.ARPAsaidthis:
  S:"550NoSuchUser"
  S:.
  R:250ok
3.7.域
  域是最近被引入ARPAInternet郵件系統的。使用域可以使地址空間從一個平面的普通字符串主機名變成全局地址的一個層次結構。主機由一個域名取代,起始主機是由一系列元串組成,它們由逗號按最非凡到一般的順序排列。
  例如,"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:fromGHI.ARPAbyJKL.ARPA;27Oct8115:27:39PST
  Received:fromDEF.ARPAbyGHI.ARPA;27Oct8115:15:13PST
  Received:fromABC.ARPAbyDEF.ARPA;27Oct8115:01:59PST
  Date:27Oct8115:01:01PST
  From:JOE@ABC.ARPA
  Subject:ImprovedMailingSystemInstalled
  To:SAM@JKL.ARPA

  Thisistoinformyouthat...
  SEND(SEND)
  此命令用于開始一個發送命令,將郵件發送到一個或多個終端上。參數域包括了一個回復路徑,此命令假如成功就將郵件發送到終端上了。
  回復路徑包括一個可選的主機列表和發送者郵箱。當出現主機列表時,表示這是一個傳送路徑,郵件就是經過這個路徑上的每個主機發送到這里的(列表上第一個主機是最后經手的主機)。此表用于返回非傳遞信號到發送者。因為每個傳遞主機地址都被加在此表起始處,它就必須使用發送IPCE而不是接收IPCE(假如它們不是一個IPCE的話)清楚的名稱。一些出錯信息的回復路徑可能就是空的。
  此命令清除回復路徑緩沖區,轉發路徑緩沖區和郵件內容緩沖區,并且將此命令的回復路徑信息插入到回復路徑緩沖區中。
  SENDORMAIL(SOML)
  此命令用于開始一個郵件操作將郵件內容傳送到一個或多個終端上,或者傳送到郵箱中。對于每個接收者,假如接收者終端打開,郵件內容將被傳送到接收者的終端上,否則就送到接收者的郵箱中。參數域包括回復路徑,假如成功地將信息送到終端或郵箱中此命令成功。
  回復路徑包括一個可選的主機列表和發送者郵箱。當出現主機列表時,表示這是一個傳送路徑,郵件就是經過這個路徑上的每個主機發送到這里的(列表上第一個主機是最后經手的主機)。此表用于返回非傳遞信號到發送者。因為每個傳遞主機地址都被加在此表起始處,它就必須使用發送IPCE而不是接收IPCE(假如它們不是一個IPCE的話)清楚的名稱。一些出錯信息的回復路徑可能就是空的。
  此命令清除回復路徑緩沖區,轉發路徑緩沖區和郵件內容緩沖區,并且將此命令的回復路徑信息插入到回復路徑緩沖區中。
  SENDANDMAIL(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語法格式
 命令是由命令碼和其后的參數域組成的。命令碼是四個字母組成的,不區別大小寫。因為下面的命令的作用是相同的:
  MAILMailmailMaIlmAIl
  這對于引導任何參數值的標記也是適用的,如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:JOE@ABLE.ARPA>
時間戳行例子
Received:FROMABC.ARPABYXYZ.ARPA;22OCT8109:23:59PDT
Received:fromABC.ARPAbyXYZ.ARPAviaTELENETwithX25
idM12345forSmith@PDQ.ARPA;22OCT8109:23:59PDT
4.2.SMTP響應
  對SMTP命令的響應是多樣的,它確定了在郵件傳輸過程中請求和處理的同步,也保證了發送SMTP知道接收SMTP的狀態。每個命令必須有且只有一個響應。
  SMTP響應由三位數字組成,其后跟一些文本。數字幫助決定下一個應該進入的狀態,而文本對人是有意義的。三位的響應已經包括了足夠的信息,不用再閱讀文本,文本可以直接拋棄或者傳遞給用戶。非凡的是,文本是與接收和環境相關的,所以每次接收到的文本可能不同。在附錄E中可以看到全部的響應碼。正規的情況下,響應由下面序列構成:三位的數字,<SP>,一行文本和一個<CRLF>,或者也可以是一個多行響應。只有EXPN和HELP命令可以導致多行應答,然而,對所有命令,多行響應都是答應的。
4.2.1.REPLYCODESBYFUNCTIONGROUPS500格式錯誤,命令不可識別(此錯誤也包括命令行過長)
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>Serviceready<CRLF>
 下面列出了成功和失敗應答,這些應答必須遵守嚴格的次序,接收者可以不理會應答中的文本,但是由數字指定的意義和操作和命令應答序列不能更改。命令響應序列:
  每個命令列出了它可能的應答。使用在可能應答前的前綴"P"表示預備的(未用在SMTP中),"I"表示中間的,"S"表示成功,"F"表示失敗,"E"表示錯誤。假如STMP接收者必須關閉信道,可以對任何命令作出421(服務不可用,關閉傳輸信道)響應。此表基于下面要講述的狀態圖:
CONNECTIONESTABLISHMENT(建立連接)
S:220
F:421
HELO
S:250
E:500,501,504,421
MAIL
S:250
F:552,451,452
E:500,501,421
RCPTS:250,251F:550,551,552,553,450,451,452E: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郵件內容過多
附錄ATCP傳輸服務
  傳輸控制協議(TCP)在ARPAInternet中使用,并遵守網絡協議的USDoD標準。SMTP傳輸信道連接建立在發送進程的端口U和接收進程的端口L上。一個單一的全雙工信道用于傳輸。被指定用于此協議的服務端口為25,也就是說L=25。TCP連接支持傳輸8位字節,而SMTP只需要傳輸7位;這樣,每個8位字符的最高位被置為0。
附錄BNCP傳輸服務
  ARPANET主機-主機協議(由網絡控制程序實現)也可以用于ARPANET。SMTP傳輸信道連接建立在發送進程的端口U和接收進程的端口L上;其后,根據初始連接協議(ICP)建立一對簡單連接。這一對簡單連接被用作傳輸信道。此協議被指定為連接套接字25,也就是說L=25。NCP連接支持傳輸8位字節,而SMTP只需要傳輸7位;這樣,每個8位字符的最高位被置為0。
附錄CNITS
  也可以使用網絡獨立轉輸服務。通過在NITS在發送進程和接收進程之間建立傳輸信道。發送進程執行CONNECT原語,然后等待接收ACCEPT原語。NITS連接支持傳輸8位字節,而SMTP只需要傳輸7位;這樣,每個8位字符的最高位被置為0。
附錄DX.25傳輸服務
  可以直接使用公共數據網絡接收的X.25服務,然而,推薦在其上使用可靠的端到端的協議如TCP。
附錄E應答碼構成方法
  三位的應答碼每一位都有特定的意義。每一位應答表示是否是成功的,失敗的或未完成的。通過這一位,不復雜的SMTP發送就可以決定下一步的操作,假如發送方希望大概了解究竟出了什么問題,它可以檢測第二位,而第三位則保存了最后更完整的信息。也就是說,從第一位到第三位,接收方可以一步比一步精確地確定接收方的狀態。對于第一位有五種可能的表示代表不同的意義:

  1yz部分完成應答

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

  2yz全部完成應答

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

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

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

  4yz暫時未完成應答

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

  5yz永久未完成應答

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

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

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

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

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

x3z未使用。

x4z未使用。

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

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

123-Firstline

123-Secondline

123-234textbeginningwithnumbers

123Thelastline

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

典型的SMTP操作

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

R:220BBN-UNIX.ARPASimpleMailTransferServiceReady

S:HELOUSC-ISIF.ARPA

R:250BBN-UNIX.ARPA

S:MAILFROM:<Smith@USC-ISIF.ARPA>

R:250OK

S:RCPTTO:<Jones@BBN-UNIX.ARPA>

R:250OK

S:RCPTTO:<Green@BBN-UNIX.ARPA>

R:550Nosuchuserhere

S:RCPTTO:<Brown@BBN-UNIX.ARPA>

R:250OK

S:DATA

R:354Startmailinput;endwith<CRLF>.<CRLF>

S:Blahblahblah...

S:...etc.etc.etc.

S:.

R:250OK

 

S:QUIT

R:221BBN-UNIX.ARPAServiceclosingtransmissionchannel

放棄SMTP操作

R:220MIT-Multics.ARPASimpleMailTransferServiceReady

S:HELOISI-VAXA.ARPAR:250MIT-Multics.ARPA

S:MAILFROM:<Smith@ISI-VAXA.ARPA>

R:250OK

S:RCPTTO:<Jones@MIT-Multics.ARPA>

R:250OK
 
S:RCPTTO:<Green@MIT-Multics.ARPA>

R:550Nosuchuserhere

S:RSET

R:250OK

S:QUIT

R:221MIT-Multics.ARPAServiceclosingtransmissionchannel

轉發郵件

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

R:220USC-ISIE.ARPASimpleMailTransferServiceReady

S:HELOMIT-AI.ARPA

R:250USC-ISIE.ARPA

 

S:MAILFROM:<JQP@MIT-AI.ARPA>

R:250OK

S:RCPTTO:<@USC-ISIE.ARPA:Jones@BBN-VAX.ARPA>

R:250OK

S:DATA

R:354Startmailinput;endwith<CRLF>.<CRLF>

S:Date:2Nov8122:33:44

S:From:JohnQ.Public<JQP@MIT-AI.ARPA>

S:Subject:TheNextMeetingoftheBoard

S:To:Jones@BBN-Vax.ARPA

S:

S:Bill:

S:ThenextmeetingoftheboardofDirectorswillbe

S:onTuesday.

S:John.

S:.

R:250OK

S:QUIT

R:221USC-ISIE.ARPAServiceclosingtransmissionchannel

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

R:220BBN-VAX.ARPASimpleMailTransferServiceReady

S:HELOUSC-ISIE.ARPA

R:250BBN-VAX.ARPA

S:MAILFROM:<@USC-ISIE.ARPA:JQP@MIT-AI.ARPA>

R:250OK

S:RCPTTO:<Jones@BBN-VAX.ARPA>

R:250OK

S:DATA

R:354Startmailinput;endwith<CRLF>.<CRLF>

S:Received:fromMIT-AI.ARPAbyUSC-ISIE.ARPA;

2Nov8122:40:10UT

S:Date:2Nov8122:33:44

S:From:JohnQ.Public<JQP@MIT-AI.ARPA>

S:Subject:TheNextMeetingoftheBoard

S:To:Jones@BBN-Vax.ARPA

S:

S:Bill:

S:Thenextmeetingoftheboardofdirectorswillbe

S:onTuesday.

S:John.

S:.

R:250OK

S:QUIT

R:221USC-ISIE.ARPAServiceclosingtransmissionchannel
確認和發送

R:220SU-SCORE.ARPASimpleMailTransferServiceReady

S:HELOMIT-MC.ARPA

R:250SU-SCORE.ARPA

S:VRFYCrispin

R:250MarkCrispin<Admin.MRC@SU-SCORE.ARPA>

S:SENDFROM:<EAK@MIT-MC.ARPA>

R:250OK

S:RCPTTO:<Admin.MRC@SU-SCORE.ARPA>

R:250OK
S:DATA

R:354Startmailinput;endwith<CRLF>.<CRLF>

S:Blahblahblah...

S:...etc.etc.etc.

S:.

R:250OK

S:QUIT

R:221SU-SCORE.ARPAServiceclosingtransmissionchannel

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

R:220SU-SCORE.ARPASimpleMailTransferServiceReady

S:HELOMIT-MC.ARPA

R:250SU-SCORE.ARPA

 

S:VRFYCrispin

R:250MarkCrispin<Admin.MRC@SU-SCORE.ARPA>

S:SENDFROM:<EAK@MIT-MC.ARPA>

R:250OK
S:RCPTTO:<Admin.MRC@SU-SCORE.ARPA>

R:450Usernotactivenow

S:RSET

R:250OK

S:MAILFROM:<EAK@MIT-MC.ARPA>

R:250OK

S:RCPTTO:<Admin.MRC@SU-SCORE.ARPA>

R:250OK

S:DATA

R:354Startmailinput;endwith<CRLF>.<CRLF>

S:Blahblahblah...

S:...etc.etc.etc.

S:.

R:250OK

S:QUIT

R:221SU-SCORE.ARPAServiceclosingtransmissionchannel

上述問題的更有效的作法

R:220SU-SCORE.ARPASimpleMailTransferServiceReady

S:HELOMIT-MC.ARPA

R:250SU-SCORE.ARPA
S:VRFYCrispin

R:250MarkCrispin<Admin.MRC@SU-SCORE.ARPA>

S:SOMLFROM:<EAK@MIT-MC.ARPA>

R:250OK

S:RCPTTO:<Admin.MRC@SU-SCORE.ARPA>

R:250Usernotactivenow,sowilldomail.

S:DATA

R:354Startmailinput;endwith<CRLF>.<CRLF>

S:Blahblahblah...

S:...etc.etc.etc.

S:.

R:250OK

S:QUIT

R:221SU-SCORE.ARPAServiceclosingtransmissionchannel

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

第一步:擴展第一個列表

R:220MIT-AI.ARPASimpleMailTransferServiceReady

S:HELOSU-SCORE.ARPA

R:250MIT-AI.ARPA

 

S:EXPNExample-People

R:250-<ABC@MIT-MC.ARPA>

R:250-FredFonebone<Fonebone@USC-ISIQ.ARPA>

R:250-XenonY.Zither<XYZ@MIT-AI.ARPA>

R:250-QuincySmith<@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>

R:250-<joe@foo-unix.ARPA>

R:250<xyz@bar-unix.ARPA>

S:QUIT

R:221MIT-AI.ARPAServiceclosingtransmissionchannel
 
第二步:擴展第二個列表

R:220MIT-MC.ARPASimpleMailTransferServiceReady

S:HELOSU-SCORE.ARPA

R:250MIT-MC.ARPA

S:EXPNInterested-Parties

R:250-AlCalico<ABC@MIT-MC.ARPA>

R:250-<XYZ@MIT-AI.ARPA>

R:250-QuincySmith<@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>

R:250-<fred@BBN-UNIX.ARPA>

R:250<xyz@bar-unix.ARPA>

S:QUIT

R:221MIT-MC.ARPAServiceclosingtransmissionchannel

 

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

R:220USC-ISIE.ARPASimpleMailTransferServiceReady

S:HELOSU-SCORE.ARPA

R:250USC-ISIE.ARPA

S:MAILFROM:<Account.Person@SU-SCORE.ARPA>

R:250OK

S:RCPTTO:<@USC-ISIE.ARPA:ABC@MIT-MC.ARPA>

R:250OK

S:RCPTTO:<@USC-ISIE.ARPA:Fonebone@USC-ISIQA.ARPA>

R:250OK

S:RCPTTO:<@USC-ISIE.ARPA:XYZ@MIT-AI.ARPA>

R:250OK

S:RCPT

TO:<@USC-ISIE.ARPA,@USC-ISIF.ARPA:Q-Smith@ISI-VAXA.ARPA>

R:250OK

S:RCPTTO:<@USC-ISIE.ARPA:joe@FOO-UNIX.ARPA>

R:250OK

S:RCPTTO:<@USC-ISIE.ARPA:xyz@BAR-UNIX.ARPA>

R:250OK

S:RCPTTO:<@USC-ISIE.ARPA:fred@BBN-UNIX.ARPA>

R:250OK

 

S:DATA

R:354Startmailinput;endwith<CRLF>.<CRLF>

S:Blahblahblah...

S:...etc.etc.etc.

S:.

R:250OK

S:QUIT

R:221USC-ISIE.ARPAServiceclosingtransmissionchannel

轉發的情況

R:220USC-ISIF.ARPASimpleMailTransferServiceReady

S:HELOLBL-UNIX.ARPA

R:250USC-ISIF.ARPA

S:MAILFROM:<mo@LBL-UNIX.ARPA>

R:250OK
 
S:RCPTTO:<fred@USC-ISIF.ARPA>

R:251Usernotlocal;willforwardto<Jones@USC-ISI.ARPA>

S:DATA

R:354Startmailinput;endwith<CRLF>.<CRLF>

S:Blahblahblah...

S:...etc.etc.etc.

S:.

R:250OK
S:QUIT

R:221USC-ISIF.ARPAServiceclosingtransmissionchannel

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

R:220USC-ISIF.ARPASimpleMailTransferServiceReady

S:HELOLBL-UNIX.ARPA

R:250USC-ISIF.ARPA

S:MAILFROM:<mo@LBL-UNIX.ARPA>

R:250OK

S:RCPTTO:<fred@USC-ISIF.ARPA>

R:251Usernotlocal;willforwardto<Jones@USC-ISI.ARPA>
 
S:RSET

R:250OK
 
S:QUIT

R:221USC-ISIF.ARPAServiceclosingtransmissionchannel

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

R:220USC-ISI.ARPASimpleMailTransferServiceReady

S:HELOLBL-UNIX.ARPA

R:250USC-ISI.ARPA

S:MAILFROM:<mo@LBL-UNIX.ARPA>

R:250OK
 
S:RCPTTO:<Jones@USC-ISI.ARPA>

R:OK

S:DATA

R:354Startmailinput;endwith<CRLF>.<CRLF>

S:Blahblahblah...

S:...etc.etc.etc.

S:.

R:250OK
 
S:QUIT

R:221USC-ISI.ARPAServiceclosingtransmissionchannel

許多接收者的情況

R:220BERKELEY.ARPASimpleMailTransferServiceReady

S:HELOUSC-ISIF.ARPA

R:250BERKELEY.ARPA
 
S:MAILFROM:<Postel@USC-ISIF.ARPA>

R:250OK
 
S:RCPTTO:<fabry@BERKELEY.ARPA>

R:250OK

S:RCPTTO:<eric@BERKELEY.ARPA>

R:552Recipientstoragefull,tryagaininanothertransaction
 
S:DATA

R:354Startmailinput;endwith<CRLF>.<CRLF>

S:Blahblahblah...

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

R:250OK

 

S:MAILFROM:<Postel@USC-ISIF.ARPA>

R:250OK

S:RCPTTO:<eric@BERKELEY.ARPA>

R:250OK

S:DATA

R:354Startmailinput;endwith<CRLF>.<CRLF>

S:Blahblahblah...

S:...etc.etc.etc.

S:.

R:250OK

S:QUIT

R:221BERKELEY.ARPAServiceclosingtransmissionchannel

名詞表:

<CRLF>
回車

<SP>
空格

ASCII
美國標準信息交換碼

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

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

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

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

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

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

字符
可顯示字符串


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

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

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

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

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

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


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

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

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

ASCII,"USACodeforInformationInterchange",UnitedStatesof
AmericaStandardsInstitute,X3.4,1968.Alsoin:Feinler,E.
andJ.Postel,eds.,"ARPANETProtocolHandbook",NIC7104,for
theDefenseCommunicationsAgencybySRIInternational,Menlo
Park,California,RevisedJanuary1978.

[2]RFC822

Crocker,D.,"StandardfortheFormatofARPAInternetText
Messages,"RFC822,DepartmentofElectricalEngineering,
UniversityofDelaware,August1982.

[3]TCP

Postel,J.,ed.,"TransmissionControlProtocol-DARPAInternet
ProgramProtocolSpecification",RFC793,USC/InformationSciences
Institute,NTISADNumberA111091,September1981.Alsoin:
Feinler,E.andJ.Postel,eds.,"InternetProtocolTransition
Workbook",SRIInternational,MenloPark,California,March1982.

[4]NCP

McKenzie,A.,"Host/HostProtocolfortheARPANetwork",NIC8246,
January1972.Alsoin:Feinler,E.andJ.Postel,eds.,"ARPANET
ProtocolHandbook",NIC7104,fortheDefenseCommunications
AgencybySRIInternational,MenloPark,California,Revised
January1978.

[5]InitialConnectionProtocol

Postel,J.,"OfficialInitialConnectionProtocol",NIC7101,
11June1971.Alsoin:Feinler,E.andJ.Postel,eds.,"ARPANET
ProtocolHandbook",NIC7104,fortheDefenseCommunications
AgencybySRIInternational,MenloPark,California,Revised
January1978.

[6]NITS

PSS/SG3,"ANetworkIndependentTransportService",StudyGroup3,
ThePostOfficePSSUsersGroup,February1980.Availablefrom
theDCPU,NationalPhysicalLaboratory,Teddington,UK.

August1982RFC821
SimpleMailTransferProtocol

[7]X.25

CCITT,"RecommendationX.25-InterfaceBetweenDataTerminal
Equipment(DTE)andDataCircuit-terminatingEquipment(DCE)for
TerminalsOperatinginthePacketModeonPublicDataNetworks,"
CCITTOrangeBook,Vol.VIII.2,InternationalTelephoneand
TelegraphConsultativeCommittee,Geneva,1976.




發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南靖县| 寿阳县| 揭阳市| 宜都市| 囊谦县| 邵阳县| 游戏| 江门市| 临澧县| 肇庆市| 盖州市| 曲靖市| 玉门市| 广河县| 石棉县| 临澧县| 白河县| 郯城县| 建昌县| 平度市| 西藏| 舞钢市| 师宗县| 阜康市| 宝山区| 米易县| 金秀| 阳朔县| 祁连县| 娱乐| 沽源县| 镇沅| 乐山市| 徐汇区| 雷山县| 卫辉市| 龙里县| 安乡县| 石台县| 德清县| 佳木斯市|