明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線(xiàn)學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

RFC821-容易郵件傳輸協(xié)議(SMTP)中文版 - 0

[摘要]本文出自: 作者: (2001-11-23 07:08:00) 1. 介紹   簡(jiǎn)單郵件傳輸協(xié)議(SMTP)的目標(biāo)是可靠高效地傳送郵件,它獨(dú)立于傳 送子系統(tǒng)而且僅要求一條可以保證傳送數(shù)據(jù)單元順序的通...
本文出自: 作者: (2001-11-23 07:08:00)
1. 介紹

  簡(jiǎn)單郵件傳輸協(xié)議(SMTP)的目標(biāo)是可靠高效地傳送郵件,它獨(dú)立于傳
送子系統(tǒng)而且僅要求一條可以保證傳送數(shù)據(jù)單元順序的通道。附錄A,B,C
和D描述了不同傳送服務(wù)下SMTP的使用。在名詞表中還定義了本文檔中使用
的術(shù)語(yǔ)。
  SMTP的一個(gè)重要特點(diǎn)是它能夠在傳送中接力傳送郵件,傳送服務(wù)提供了
進(jìn)程間通信環(huán)境(IPCE),此環(huán)境可以包括一個(gè)網(wǎng)絡(luò),幾個(gè)網(wǎng)絡(luò)或一個(gè)網(wǎng)絡(luò)
的子網(wǎng)。理解到傳送系統(tǒng)(或IPCE)不是一對(duì)一的是很重要的。進(jìn)程可能直
接和其它進(jìn)程通過(guò)已知的IPCE通信。郵件是一個(gè)應(yīng)用程序或進(jìn)程間通信。郵
件可以通過(guò)連接在不同IPCE上的進(jìn)程跨網(wǎng)絡(luò)進(jìn)行郵件傳送。更特別的是,郵
件可以通過(guò)不同網(wǎng)絡(luò)上的主機(jī)接力式傳送。

2. SMTP模型

  SMTP設(shè)計(jì)基于以下通信模型:針對(duì)用戶(hù)的郵件請(qǐng)求,發(fā)送SMTP建立與接
收SMTP之間建立一個(gè)雙向傳送通道。接收SMTP可以是最終接收者也可以是中
間傳送者。SMTP命令由發(fā)送SMTP發(fā)出,由接收SMTP接收,而應(yīng)答則反方面?zhèn)?
送。
  一旦傳送通道建立,SMTP發(fā)送者發(fā)送MAIL命令指明郵件發(fā)送者。如果
SMTP接收者可以接收郵件則返回OK應(yīng)答。SMTP發(fā)送者再發(fā)出RCPT命令確認(rèn)郵件
是否接收到。如果SMTP接收者接收,則返回OK應(yīng)答;如果不能接收到,則發(fā)出
拒絕接收應(yīng)答(但不中止整個(gè)郵件操作),雙方將如此重復(fù)多次。當(dāng)接收者收
到全部郵件后會(huì)接收到特別的序列,如果接收者成功處理了郵件,則返回OK應(yīng)
答。



  SMTP提供傳送郵件的機(jī)制,如果接收方與發(fā)送方連接在同一個(gè)傳送服務(wù)下
時(shí),郵件可以直接由發(fā)送方主機(jī)傳送到接收方主機(jī);或者,當(dāng)兩者不在同一個(gè)
傳送服務(wù)下時(shí),通過(guò)中繼SMTP服務(wù)器傳送。為了能夠?qū)MTP服務(wù)器提供中繼能
力,它必須擁有最終目的主機(jī)地址和郵箱名稱(chēng)。
  MAIL命令參數(shù)是回復(fù)路徑,它指定郵件從何處來(lái);而RCPT命令的參數(shù)是轉(zhuǎn)
發(fā)路徑的,它指定郵件向何處去。向前路徑是源路徑,而回復(fù)路徑是返回路徑
(它用于發(fā)生錯(cuò)誤時(shí)返回郵件)。
  當(dāng)同一個(gè)消息要發(fā)往不同的接收者時(shí),SMTP遇到了向不同接收者發(fā)送同一
份數(shù)據(jù)的復(fù)制品的問(wèn)題,郵件命令和應(yīng)答有一個(gè)比較奇怪的語(yǔ)法,應(yīng)答也有一
個(gè)數(shù)字代碼。在下面,例子中可以看到哪些使用實(shí)際的命令和應(yīng)答。完整的命
令和應(yīng)答在第四節(jié)。
  命令與應(yīng)答對(duì)大小寫(xiě)不敏感,也就是說(shuō),命令和應(yīng)答可以是大寫(xiě),小寫(xiě)或
兩者的混合,但這一點(diǎn)對(duì)用戶(hù)郵件名稱(chēng)卻不一定是對(duì)的,因?yàn)橛械闹鳈C(jī)對(duì)用戶(hù)
名大小寫(xiě)是敏感的。這樣SMTP實(shí)現(xiàn)中就將用戶(hù)郵箱名稱(chēng)保留成初始時(shí)的樣子,
主機(jī)名稱(chēng)對(duì)大小寫(xiě)不敏感。
  命令與應(yīng)答由ASCII字母表組成,當(dāng)傳送服務(wù)提供8位字節(jié)傳送通道,每7
位字符正確傳送,而最高位被填充為0。當(dāng)指定一般的命令或應(yīng)答格式后,參
數(shù)會(huì)由一些類(lèi)似于語(yǔ)言的字符串表示出來(lái),如"<string>"或"<reverse-path>",
這里尖括號(hào)表示這是一種類(lèi)似于語(yǔ)言的變量。

3. SMTP過(guò)程

  本節(jié)提供了SMTP中的一些過(guò)程。頭一個(gè)說(shuō)明的是基本發(fā)送過(guò)程(定義為
發(fā)送操作)。下來(lái)描述向前傳送郵件,確認(rèn)郵箱名稱(chēng)和擴(kuò)展郵件列表,發(fā)送到終
端和打開(kāi)關(guān)閉交換。在本節(jié)的最后是對(duì)中斷,郵件域的說(shuō)明。本節(jié)的例子只是一
部分命令和應(yīng)答的序列,完整的例子見(jiàn)附錄F。

3.1. MAIL
  在SMTP發(fā)送操作中有三步,操作由MAIL命令開(kāi)始給出發(fā)送者標(biāo)識(shí)。一系列或
更多的RCPT命令緊跟其后,給出了接收者信息,然后是DATA命令列出發(fā)送的郵件
內(nèi)容,最后郵件內(nèi)容指示符確認(rèn)操作。

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

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

  此命令告訴接收者新的發(fā)送操作已經(jīng)開(kāi)始,請(qǐng)復(fù)位所有狀態(tài)表和緩沖區(qū)。
它給出反向路徑以進(jìn)行錯(cuò)誤信息返回。如果請(qǐng)求被接收,接收方返回一個(gè)
250 OK應(yīng)答。<reverse-path>中不止包括了郵箱,它包括了主機(jī)和源郵箱的反
向路由,其中的第一個(gè)主機(jī)就是發(fā)送此命令的主機(jī)。

  過(guò)程中的第二步是發(fā)送RCPT命令。

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

  此命令給出向前路徑標(biāo)識(shí)接收者,如果命令被接收,接收方返回一個(gè)
250 OK應(yīng)答,并存儲(chǔ)向前路徑。如果接收者未知,接收方會(huì)返回一個(gè)550 Failure
應(yīng)答。此過(guò)程可能會(huì)重復(fù)若干次。
  <forward-path>不僅包括郵件,它是主機(jī)和目的郵箱的路由表,在其中的
第一個(gè)主機(jī)就是接收命令的主機(jī)。 過(guò)程中的第三步是發(fā)送DATA命令。

DATA <CRLF>

  如果命令被接收,接收方返回一個(gè)354 Intermediate應(yīng)答,并認(rèn)定以下的
各行都是信件內(nèi)容。當(dāng)信件結(jié)尾收到并存儲(chǔ)后,接收者發(fā)送一個(gè)250 OK應(yīng)答。
因?yàn)猷]件是在傳送通道上發(fā)送,因此必須指明郵件內(nèi)容結(jié)尾,以便應(yīng)答對(duì)話(huà)可
以重新開(kāi)始。SMTP通過(guò)在最后一行僅發(fā)送一個(gè)句號(hào)來(lái)表示郵件內(nèi)容的結(jié)束,在
接收方,一個(gè)對(duì)用戶(hù)透明的過(guò)程將此符號(hào)過(guò)濾掉,以不影響正常的數(shù)據(jù)。
  注意:郵件內(nèi)容包括如下提示:Date, Subject, To, Cc, From。

  郵件內(nèi)容指示符確認(rèn)郵件操作并告知接收者可以存儲(chǔ)和再發(fā)送數(shù)據(jù)了。如
果此命令被接收,接收方返回一個(gè)250 OK應(yīng)答。DATA命令僅在郵件操作未完成
或源無(wú)效的情況下失敗。

  上面所述的過(guò)程是一個(gè)發(fā)送操作。這些命令只能以上面的順序使用。下例
表示了在一個(gè)發(fā)送操作中這些命令的使用。
  SMTP過(guò)程例子 此例是在Alpha.ARPA主機(jī)的Smith發(fā)送郵件給Beta.ARPA主機(jī)
的Jones,Green和Brown的,這里假定主機(jī)Alpha與主機(jī)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
  此信被前兩個(gè)人接收,而第三個(gè)人在此主機(jī)上沒(méi)有郵箱。

3.2. 轉(zhuǎn)發(fā)
  下面是一些<forward-path>中目的地址不正確的,但接收者知道正確的目
的地址的例子。在這些例子中,下列應(yīng)答之一應(yīng)該允許發(fā)送方與獲得正確地址。

  251:用戶(hù)不在本地;將向前發(fā)送到<forward-path>。

  這個(gè)應(yīng)答意味著,接收方SMTP知道用戶(hù)的郵箱在另外的主機(jī)上,而且意味
著將在未來(lái)使用正確的轉(zhuǎn)向路徑。請(qǐng)注意,主機(jī)或者用戶(hù),或者它們兩者是不
同的。接收方負(fù)責(zé)傳送消息。

  551 :用戶(hù)非本地,請(qǐng)嘗試<forward-path>

  這個(gè)應(yīng)答意味著接收SMTP知道用戶(hù)的郵箱在另外的主機(jī)上,并意味著使用
了正確的轉(zhuǎn)發(fā)路徑。注意請(qǐng)注意,主機(jī)或者用戶(hù),或者它們兩者是不同的。接
收方拒絕接收此用戶(hù)的信件,發(fā)送者必須根據(jù)提供的信息重新發(fā)送或者向原發(fā)
送者返回錯(cuò)誤信息。 下例顯示了這些響應(yīng)的應(yīng)用。

  轉(zhuǎn)發(fā)的例子
  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. 確認(rèn)和擴(kuò)展
  SMTP提供了另外的確認(rèn)用戶(hù)名和擴(kuò)展郵件列表的功能。這些功能由VREF和
EXPN命令完成,它們都以字符串為參數(shù)。對(duì)于VREF命令,字符串參數(shù)指的是用
戶(hù)名,對(duì)此命令的響應(yīng)要包括用戶(hù)的命名和用戶(hù)的郵箱。對(duì)于EXPN命令,字符
串參數(shù)指的是郵件列表,對(duì)此命令的響應(yīng)多于一個(gè),它們要包括所有列表中用
戶(hù)的命名和他們的郵箱。
  “用戶(hù)名”是一個(gè)多余的項(xiàng)目,它是故意被加上的。如果主機(jī)采用VREF命
令和EXPN命令,最后本地郵箱必須提供用戶(hù)名使它被主機(jī)確認(rèn)。如果主機(jī)選擇
由另外的字符串作為用戶(hù)名,也是允許的。
  在一些主機(jī)中,郵箱列表和一個(gè)郵箱的代名有一點(diǎn)不清楚,因?yàn)橐话愕臄?shù)
據(jù)結(jié)構(gòu)可能包括兩種類(lèi)型的入口。如果要發(fā)出對(duì)郵件列表的確認(rèn),應(yīng)該給出確
定響應(yīng)。在接收到這個(gè)消息后,主機(jī)將把郵件傳送到列表上所有的地址上去,
如果沒(méi)有接收到確定響應(yīng),就會(huì)報(bào)告錯(cuò)誤。例如,
"550 That is a mail list, not a user name"。如果請(qǐng)求用于擴(kuò)展一個(gè)用戶(hù)名,
可能通過(guò)返回包括一個(gè)名字的列表來(lái)形成確定響應(yīng),如果沒(méi)有接收到確定響應(yīng),
就會(huì)報(bào)告錯(cuò)誤。(例如, "550 That is a user name, not a mailing list")。
  在多個(gè)響應(yīng)的情況下(通常是對(duì)于EXPN而言的),每個(gè)應(yīng)答指定一個(gè)郵箱。
在模糊請(qǐng)求的情況下,例如"VRFY Smith",這里兩個(gè)Smith的響應(yīng)必須是
"553 User ambiguous"。

  確認(rèn)用戶(hù)名的情況如下例所示:例3:
  確認(rèn)用戶(hù)名
  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.

  郵箱列表要求多個(gè)響應(yīng)的情況如下例所示:
  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命令的字符串命令參數(shù)因?yàn)榫唧w實(shí)現(xiàn)的不同而不能再加以限
制了。在一些系統(tǒng)上,EXPN命令的參數(shù)可能是一個(gè)包含郵件列表的文件名,
但是在Internet上有許多不同的文件結(jié)構(gòu)。
  VRFY和EXPN命令在最小實(shí)現(xiàn)中并不包括,當(dāng)它們實(shí)現(xiàn)時(shí),它們也不要求
被在傳送間實(shí)現(xiàn)。 

3.4. 發(fā)送信件(mailing)和獲得信件(sending)
  SMTP的主要目的是將郵件發(fā)送到用戶(hù)的郵箱中。由一些主機(jī)提供的類(lèi)似
的功能是把郵件送至用戶(hù)的終端(如果用戶(hù)正打開(kāi)終端)。將郵件送到用戶(hù)
的郵箱中稱(chēng)為發(fā)送信件(mailing);而送至用戶(hù)終端則稱(chēng)之為獲得信件
(sending)。因?yàn)樵谝恍┲鳈C(jī)上,這兩者的實(shí)現(xiàn)十分類(lèi)似,所以它們同時(shí)
被放入了SMTP中。然而,獲得信件命令在SMTP的最小實(shí)現(xiàn)中是沒(méi)有的。用戶(hù)
應(yīng)該具有控制向終端上寫(xiě)信息的能力。大部分主機(jī)允許用戶(hù)接受或者拒絕類(lèi)
似的信息。
  下面三個(gè)命令被定義來(lái)支持獲得信件。它們被用于郵件命令而不是MAIL
命令,指示接收SMTP這種操作的特殊意義:
  SEND <SP> FROM:<reverse-path> <CRLF>

  SEND命令要求郵件內(nèi)容直接傳送到用戶(hù)終端。如果用戶(hù)未打開(kāi)終端(或
者未接收終端信息),450響應(yīng)將返回一個(gè)RCPT命令。如果信息被成功發(fā)送,
此操作成功。 

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

  Send或者M(jìn)aiL命令要求將郵件內(nèi)容直接發(fā)送到用戶(hù)的終端上(如果用戶(hù)
在終端上)。如果用戶(hù)不在終端上,郵件內(nèi)容直接進(jìn)入郵箱。如果郵件被發(fā)送
到用戶(hù)終端或者用戶(hù)信箱,發(fā)送操作成功!

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

  Send和MaiL命令要求郵件內(nèi)容直接發(fā)送到用戶(hù)終端上(如果用戶(hù)在終端上)。
不管怎么樣,信件都會(huì)進(jìn)入信箱。如果信件進(jìn)入信箱,發(fā)送操作成功。
  用于MAIL命令的響應(yīng)和這些命令的響應(yīng)相同。  

3.5. 打開(kāi)和關(guān)閉
  當(dāng)打開(kāi)傳送通道時(shí),要交換一些信息以確定雙方的身份。以下的命令是
用于打開(kāi)和關(guān)閉的:
  HELO <SP> <domain> <CRLF>
  QUIT <CRLF>
  在HELLO命令中,主機(jī)自己發(fā)送命令,此命令可以被解釋為:“你好,
我是XX”。

  打開(kāi)聯(lián)結(jié)的例子
  R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready
  S: HELO USC-ISIF.ARPA
  R: 250 BBN-UNIX.ARPA

  關(guān)閉聯(lián)結(jié)的例子
  S: QUIT
  R: 221 BBN-UNIX.ARPA Service closing transmission channel

3.6. 轉(zhuǎn)發(fā)
  轉(zhuǎn)發(fā)路徑可能是如下格式:"@ONE,@TWO:JOE@THREE",在這里,ONE,TWO
和THREE是主機(jī)。這種格式用于強(qiáng)調(diào)地址和路徑的區(qū)別。郵箱是絕對(duì)地址,路
徑是關(guān)于如何到達(dá)的信息。這兩個(gè)概念不應(yīng)該被混淆。
  概念上,轉(zhuǎn)發(fā)路徑的元素被移動(dòng)到回復(fù)路徑作為從一個(gè)SMTP服務(wù)器到另一
個(gè)SMTP服務(wù)器的信息;貜(fù)路徑是一個(gè)反向數(shù)據(jù)源路徑,例如從當(dāng)前信息的位
置到發(fā)起者的位置。當(dāng)一個(gè)SMTP服務(wù)器從轉(zhuǎn)發(fā)路徑中刪除自己的標(biāo)記并將它插
入到回復(fù)路徑中時(shí),它必須使用它發(fā)送環(huán)境能夠理解的名稱(chēng)來(lái)進(jìn)行,以防它的
名稱(chēng)在不同的環(huán)境中被理解為不同的名字。
  如果當(dāng)SMTP接收到信息的轉(zhuǎn)發(fā)路徑的第一個(gè)元素不是此SMTP的標(biāo)記時(shí),此
元素不從轉(zhuǎn)發(fā)路徑中刪除,而被用來(lái)決定下一個(gè)應(yīng)該發(fā)送到的SMTP服務(wù)器。在
任何情況下,SMTP都將自己的標(biāo)記加入反向路徑中。
  使用源路徑時(shí),接收SMTP接收轉(zhuǎn)發(fā)的郵件并發(fā)送到另一接收SMTP服務(wù)器上。
接收服務(wù)器可以接受或拒絕轉(zhuǎn)發(fā)本地用戶(hù)的郵件。接收SMTP通過(guò)將它自己的標(biāo)記
從轉(zhuǎn)發(fā)路徑移至回復(fù)路徑的開(kāi)始處來(lái)改變命令參數(shù)。這時(shí),接收SMTP變成了發(fā)
送SMTP,也就建立了到下一個(gè)轉(zhuǎn)發(fā)路徑中SMTP的通道,然后,它向這個(gè)SMTP發(fā)
送郵件。
  在回復(fù)路徑上的頭一個(gè)主機(jī)應(yīng)是發(fā)送SMTP命令的主機(jī),在轉(zhuǎn)發(fā)路徑上第一個(gè)
主機(jī)應(yīng)是接收SMTP命令的主機(jī)。
  注意:轉(zhuǎn)發(fā)路徑和回復(fù)路徑出現(xiàn)在SMTP命令和應(yīng)答中,但不一定要出現(xiàn)在信
息中。也就是說(shuō),沒(méi)有必須要這樣的路徑特別這種格式出現(xiàn)在信息頭的"To:",
"From:"和"CC:"等域中。
   如果SMTP服務(wù)器接受了轉(zhuǎn)發(fā)任務(wù),但后來(lái)它發(fā)現(xiàn)因?yàn)檗D(zhuǎn)發(fā)路徑不正確或者
其它原理無(wú)法發(fā)送郵件,它必須建立一"undeliverable mail"信號(hào),將它此信號(hào)
送到此信的發(fā)主者那里。
  此信號(hào)必須是從此主機(jī)的SMTP服務(wù)上發(fā)出的,當(dāng)然了,此服務(wù)器不應(yīng)該再報(bào)
告出錯(cuò)信息的錯(cuò)誤。一種阻止這種出錯(cuò)報(bào)告循環(huán)的情況是在信號(hào)的郵件命令的回
復(fù)路徑上置空。在傳送此信息時(shí),允許將回復(fù)路徑也置為空。一個(gè)MAIL命令后的
回復(fù)路徑為空表現(xiàn)為如下形式:
  MAIL FROM:<>

  下例中顯示了不可傳送的郵件信息。此信息是對(duì)從HOSTW上的JOE發(fā)出的郵件
經(jīng)過(guò)在HOSTX需要經(jīng)過(guò)HOSTZ到達(dá)HOSTY時(shí)出錯(cuò)的回應(yīng)。我們看到的例子是在HOSTX
和HOSTY之間發(fā)生的。

  不可傳送郵件信息的例子
  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