【正文】
列表時(shí),這就是一個(gè)源路徑,它指明郵件必須向列表中的上一個(gè)主機(jī)發(fā)送。如果接收SMTP未實(shí)現(xiàn)郵件的傳遞發(fā)送,就會(huì)返回如未知本地用戶(550)的信息給用戶。當(dāng)郵件被傳遞發(fā)送時(shí),傳遞主機(jī)必須將自己的名稱由轉(zhuǎn)發(fā)路徑的開始處移至回復(fù)路徑的結(jié)束處。當(dāng)郵件最終到達(dá)目的地時(shí),接收SMTP將以它的主機(jī)郵件格式自己的名稱插入目標(biāo)郵件中。例如,由傳遞主機(jī)A接收的帶有如下參數(shù)的郵件時(shí),F(xiàn)ROM:USERX@ TO:@,@:USERC@將會(huì)變成如下形式: FROM:@:USERX@ TO:@:USERC@.此命令導(dǎo)致它的轉(zhuǎn)發(fā)路徑參數(shù)加入轉(zhuǎn)發(fā)路徑緩沖區(qū)中?! ATA (DATA)接收者將跟在命令后的行作為郵件內(nèi)容。此命令導(dǎo)致此命令后的郵件內(nèi)容加入郵件內(nèi)容緩沖區(qū)。郵件內(nèi)容可以包括所有128個(gè)ASCII碼字符。郵件內(nèi)容由只包括一個(gè)句號(hào)的行結(jié)束,也就是如下的字符序列:CRLF.CRLF,它指示了郵件的結(jié)束。郵件內(nèi)容的結(jié)束指示要求接收者現(xiàn)在就處理保存的郵件內(nèi)容。此過程將回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)的內(nèi)容全部清空。如果操作成功,接收者必須返回OK應(yīng)答;如果失敗也必須返回失敗應(yīng)答。當(dāng)接收SMTP收到一條信息時(shí),無論是用作轉(zhuǎn)發(fā)還是此郵件已經(jīng)到達(dá)目的地,它都必須在郵件內(nèi)容的開始處加上時(shí)間戳這一行,這一行指示了接收到郵件主機(jī)和發(fā)出此郵件主機(jī)的標(biāo)識(shí),以及接收到郵件內(nèi)容的時(shí)間和日期。轉(zhuǎn)發(fā)的信件將有多行這樣的時(shí)間戳。當(dāng)接收SMTP作最后一站的傳送時(shí),它將返回路徑信息行插入郵件中。此行包括了發(fā)送命令中的reversepath的信息。在這里,最后一站的傳送的意思是郵件將被送到目的用戶手中,但在一些情況下,郵件可能需要更進(jìn)一步的加工并由另外的郵件系統(tǒng)傳送??赡茉诜祷芈窂街械泥]箱與實(shí)際發(fā)送的郵件不一致,這個(gè)情況可能發(fā)生在需要傳送一個(gè)特定的錯(cuò)誤處理信箱而不是信件發(fā)送者那里。上面所述說明了,最后的郵件內(nèi)容由一個(gè)返回路徑行,和在其后的一個(gè)或多個(gè)時(shí)間戳行構(gòu)成。這些行后面是郵件內(nèi)容的頭和體信息。當(dāng)處理后面的郵件數(shù)據(jù)指示部分成功時(shí)就需要特定的說明。這種情況可能發(fā)生在發(fā)送SMTP發(fā)現(xiàn)當(dāng)郵件需要傳送給多個(gè)用戶時(shí),只能夠成功地向其中的一部分發(fā)送信息這種情況下。在這種情況下,必須對(duì)DATA命令發(fā)送OK應(yīng)答,而接收SMTP組織并發(fā)送一個(gè)不可傳遞郵件信息到信息的發(fā)送者。在此信息中或者發(fā)送一個(gè)不成功接收者的列表,或者每次發(fā)送一個(gè)不成接收者,而發(fā)送多次。所有不可傳遞郵件信息由MAIL命令發(fā)送。返回路徑和接收時(shí)間戳例子 ReturnPath: @,@,@:JOE@ Received: from by 。 27 Oct 81 15:27:39 PST Received: from by 。 27 Oct 81 15:15:13 PST Received: from by 。 27 Oct 81 15:01:59 PST Date: 27 Oct 81 15:01:01 PST From: JOE@ Subject: Improved Mailing System Installed To: SAM@ This is to inform you that ... SEND (SEND)此命令用于開始一個(gè)發(fā)送命令,將郵件發(fā)送到一個(gè)或多個(gè)終端上。參數(shù)域包括了一個(gè)回復(fù)路徑,此命令如果成功就將郵件發(fā)送到終端上了。 回復(fù)路徑包括一個(gè)可選的主機(jī)列表和發(fā)送者郵箱。當(dāng)出現(xiàn)主機(jī)列表時(shí),表示這是一個(gè)傳送路徑,郵件就是經(jīng)過這個(gè)路徑上的每個(gè)主機(jī)發(fā)送到這里的(列表上第一個(gè)主機(jī)是最后經(jīng)手的主機(jī))。此表用于返回非傳遞信號(hào)到發(fā)送者。因?yàn)槊總€(gè)傳遞主機(jī)地址都被加在此表起始處,它就必須使用發(fā)送IPCE而不是接收IPCE(如果它們不是一個(gè)IPCE的話)清楚的名稱。一些出錯(cuò)信息的回復(fù)路徑可能就是空的。此命令清除回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū),并且將此命令的回復(fù)路徑信息插入到回復(fù)路徑緩沖區(qū)中?! END OR MAIL (SOML)此命令用于開始一個(gè)郵件操作將郵件內(nèi)容傳送到一個(gè)或多個(gè)終端上,或者傳送到郵箱中。對(duì)于每個(gè)接收者,如果接收者終端打開,郵件內(nèi)容將被傳送到接收者的終端上,否則就送到接收者的郵箱中。參數(shù)域包括回復(fù)路徑,如果成功地將信息送到終端或郵箱中此命令成功?;貜?fù)路徑包括一個(gè)可選的主機(jī)列表和發(fā)送者郵箱。當(dāng)出現(xiàn)主機(jī)列表時(shí),表示這是一個(gè)傳送路徑,郵件就是經(jīng)過這個(gè)路徑上的每個(gè)主機(jī)發(fā)送到這里的(列表上第一個(gè)主機(jī)是最后經(jīng)手的主機(jī))。此表用于返回非傳遞信號(hào)到發(fā)送者。因?yàn)槊總€(gè)傳遞主機(jī)地址都被加在此表起始處,它就必須使用發(fā)送IPCE而不是接收IPCE(如果它們不是一個(gè)IPCE的話)清楚的名稱。一些出錯(cuò)信息的回復(fù)路徑可能就是空的。此命令清除回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū),并且將此命令的回復(fù)路徑信息插入到回復(fù)路徑緩沖區(qū)中?! END AND MAIL (SAML)此命令用于開始一個(gè)郵件操作將郵件內(nèi)容傳送到一個(gè)或多個(gè)終端上,并傳送到郵箱中。如果接收者終端打開,郵件內(nèi)容將被傳送到接收者的終端上和接收者的郵箱中。參數(shù)域包括回復(fù)路徑,如果成功地將信息送到郵箱中此命令成功?;貜?fù)路徑包括一個(gè)可選的主機(jī)列表和發(fā)送者郵箱。當(dāng)出現(xiàn)主機(jī)列表時(shí),表示這是一個(gè)傳送路徑,郵件就是經(jīng)過這個(gè)路徑上的每個(gè)主機(jī)發(fā)送到這里的(列表上第一個(gè)主機(jī)是最后經(jīng)手的主機(jī))。此表用于返回非傳遞信號(hào)到發(fā)送者。因?yàn)槊總€(gè)傳遞主機(jī)地址都被加在此表起始處,它就必須使用發(fā)送IPCE而不是接收IPCE(如果它們不是一個(gè)IPCE的話)清楚的名稱。一些出錯(cuò)信息的回復(fù)路徑可能就是空的。此命令清除回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū),并且將此命令的回復(fù)路徑信息插入到回復(fù)路徑緩沖區(qū)中?!ESET (RSET)此命令指示當(dāng)送郵件操作將被放棄。任何保存的發(fā)送者,接收者和郵件內(nèi)容應(yīng)該被拋棄,所有緩沖區(qū)和狀態(tài)表應(yīng)該被清除,接收方必須返回OK應(yīng)答?! ERIFY (VRFY)此命令要求接收者確認(rèn)參數(shù)是一個(gè)用戶。如果這是(已經(jīng)知道的)用戶名,返回用戶的全名和指定的郵箱。此命令對(duì)回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)沒有影響?! XPAND (EXPN)此命令要求接收者確認(rèn)參數(shù)指定了一個(gè)郵件發(fā)送列表,如果是一個(gè)郵件發(fā)送列表,就返回表中的成員。如果這是(已經(jīng)知道的)用戶名,返回用戶的全名和指定的郵箱。此命令對(duì)回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)沒有影響。HELP (HELP)此命令導(dǎo)致接收者向HELP命令的發(fā)送者發(fā)出幫助信息。此命令可以帶參數(shù),并返回特定的信息作為應(yīng)答。此命令對(duì)回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)沒有影響?! OOP (NOOP) 此命令不影響任何參數(shù)和已經(jīng)發(fā)出的命令。它只是說明沒有任何操作而不是說明接收者發(fā)送了一個(gè)OK應(yīng)答。此命令對(duì)回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)沒有影響?! UIT (QUIT)此命令指示接收方必須發(fā)送OK應(yīng)答然后關(guān)閉傳送信道。接收方在接到QUIT命令并做出響應(yīng)之前不應(yīng)該關(guān)閉通信信道。發(fā)送方在發(fā)送QUIT命令和接收到響應(yīng)之前也不應(yīng)該關(guān)閉信道。即使出錯(cuò),也不應(yīng)該關(guān)閉信道。如果連接被提前關(guān)閉,接收方應(yīng)該象接收到RSET命令一樣,取消所有等待的操作,但不恢復(fù)原先已經(jīng)做過的操作。而發(fā)送方應(yīng)該象接收到暫時(shí)錯(cuò)誤(4XX)一樣假定命令和操作仍在支持之中?! URN (TURN)此命令指定接收方要么發(fā)送OK應(yīng)答并改變角色為發(fā)送SMTP,要么發(fā)送拒絕信息并保持自己的角色。如果程序A現(xiàn)在是發(fā)送SMTP,它發(fā)出TURN命令后接收到OK(250)應(yīng)答,它就變成了接收SMTP。程序A就進(jìn)入初始狀態(tài),好象通信信道剛打開一樣,這時(shí)它發(fā)送220準(zhǔn)備好服務(wù)信號(hào)。如果程序B現(xiàn)在是接收SMTP,它發(fā)出TURN命令后接收到OK(250)應(yīng)答,它就變成了發(fā)送SMTP。程序A就進(jìn)入初始狀態(tài),好象通信信道剛打開一樣,這時(shí)它準(zhǔn)備接收220準(zhǔn)備好服務(wù)信號(hào)。若要拒絕改變角色,接收方可以發(fā)送502應(yīng)答。對(duì)于這些命令的順序有一定的限制。對(duì)話的第一個(gè)命令必須是HELLO命令,此命令在此后的會(huì)話中也可以使用。如果HELLO命令的參數(shù)不可接受,必須由返回一個(gè)501失敗應(yīng)答,同時(shí)接收到的SMTP必須保持在與剛才一致的狀態(tài)下。 NOOP,HELP,EXPN和VRFY命令可以在會(huì)話的任何時(shí)候使用。MAIL,SEND,SOML或SAML命令開始一個(gè)郵件操作。一旦開始了以后就要發(fā)送RCPT和DATA命令。郵件操作可以由RSET命令終止。在一個(gè)會(huì)話中可以有一個(gè)或多個(gè)操作。如果在操作開始參數(shù)不可接受,必須返回501失敗應(yīng)答,同時(shí)接收到的SMTP必須保持在與剛才一致的狀態(tài)下。如果操作中的命令順序出錯(cuò),必須返回503失敗應(yīng)答,同時(shí)接收到的SMTP必須保持在與剛才一致的狀態(tài)下。會(huì)話的最后一個(gè)命令必須是QUIT命令。此命令在會(huì)話的其它時(shí)間不能使用。COMMAND語法格式命令是由命令碼和其后的參數(shù)域組成的。命令碼是四個(gè)字母組成的,不區(qū)別大小寫。因?yàn)橄旅娴拿畹淖饔檬窍嗤模骸 AIL Mail mail MaIl mAIl這對(duì)于引導(dǎo)任何參數(shù)值的標(biāo)記也是適用的,如TO和to就是一樣的。命令碼和參數(shù)由一個(gè)或多個(gè)空格分開。然而在回復(fù)路徑和轉(zhuǎn)發(fā)路徑中的參數(shù)是區(qū)別大小寫的。特別是在一些主機(jī)上,smith和Smith就根本不是一個(gè)用戶。參數(shù)域由不定長的字符串組成,它由CRLF結(jié)束,接收方在完全接收到此序列前不會(huì)采取任何行動(dòng)。方括號(hào)代表可選的參數(shù)域。如果不選擇的話,系統(tǒng)選擇默認(rèn)的設(shè)置。下面是SMTP命令: HELO SP domain CRLF MAIL SP FROM:reversepath CRLFRCPT SP TO:forwardpath CRLFDATA CRLFRSET CRLFSEND SP FROM:reversepath CRLFSOML SP FROM:reversepath CRLFSAML SP FROM:reversepath CRLFVRFY SP string CRLFEXPN SP string CRLFHELP [SP string] CRLFNOOP CRLFQUIT CRLFTURN CRLF3.2.2 SMTP的應(yīng)答碼對(duì)SMTP命令的響應(yīng)是多樣的,它確定了在郵件傳輸過程中請(qǐng)求和處理的同步,也保證了發(fā)送SMTP知道接收SMTP的狀態(tài)。每個(gè)命令必須有且只有一個(gè)響應(yīng)。SMTP響應(yīng)由三位數(shù)字組成,其后跟一些文本。數(shù)字幫助決定下一個(gè)應(yīng)該進(jìn)入的狀態(tài),而文本對(duì)人是有意義的。三位的響應(yīng)已經(jīng)包括了足夠的信息,不用再閱讀文本,文本可以直接拋棄或者傳遞給用戶。特別的是,文本是與接收和環(huán)境相關(guān)的,所以每次接收到的文本可能不同。在附錄E中可以看到全部的響應(yīng)碼。正規(guī)的情況下,響應(yīng)由下面序列構(gòu)成:三位的數(shù)字,SP,一行文本和一個(gè)CRLF,或者也可以是一個(gè)多行響應(yīng)。只有EXPN和HELP命令可以導(dǎo)致多行應(yīng)答,然而,對(duì)所有命令,多行響應(yīng)都是允許的。REPLY CODES BY FUNCTION GROUPS 500 格式錯(cuò)誤,命令不可識(shí)別(此錯(cuò)誤也包括命令行過長)