[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 應用技術 > 其它 > 正文
RFC821-簡單郵件傳輸協議(SMTP)中文版 - 2
http://www.fanqiang.com (2002-01-29 21:05:06)
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:JOE@ABLE.ARPA> 

時間戳行例子 
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 Smith@PDQ.ARPA ; 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:<Smith@USC-ISIF.ARPA> 

R: 250 OK 

  

S: RCPT TO:<Jones@BBN-UNIX.ARPA> 

R: 250 OK 

  

S: RCPT TO:<Green@BBN-UNIX.ARPA> 

R: 550 No such user here 

  

S: RCPT TO:<Brown@BBN-UNIX.ARPA> 

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:<Smith@ISI-VAXA.ARPA> 

R: 250 OK 

  

S: RCPT TO:<Jones@MIT-Multics.ARPA> 

R: 250 OK 

  

S: RCPT TO:<Green@MIT-Multics.ARPA> 

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:<JQP@MIT-AI.ARPA> 

R: 250 OK 

  

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

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 <JQP@MIT-AI.ARPA> 

S: Subject: The Next Meeting of the Board 

S: To: Jones@BBN-Vax.ARPA 

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 
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
RFC821-簡單郵件傳輸協議(SMTP)中文版 - 3 (2002-01-29 21:05:38)
RFC821-簡單郵件傳輸協議(SMTP)中文版 - 2 (2002-01-29 21:05:06)
RFC821-簡單郵件傳輸協議(SMTP)中文版 - 1 (2002-01-29 21:04:29)
對基qmail的smtp用戶驗証的總結和完整安裝設置方法 (2001-12-10 09:10:01)
Qmail使用SMTP發信的設置問題集 (2001-12-10 08:10:00)
solaris7下的SMTP和POP3的安裝 (2001-10-02 09:00:00)
RedHat 7.1上Sendmail的SMTP問題 (2001-09-04 10:00:00)
一個在Solaris下配置SMTP(sendmail)+POP3(qpopper)的例子 (2001-08-07 09:00:00)
帶SMTP認証功能的sendmail配置 (2001-07-24 12:00:01)
網絡管理員指南 -14.建立smail並運行 -10>SMTP基礎的傳輸器,主機名條件 (2001-07-18 17:04:01)

===更多相關===
 

★  樊強制作 歡迎分享  ★