【正文】
接收SMTP通過連接確認(rèn)命令來向發(fā)送SMTP確認(rèn)接收SMTP。MAIL (MAIL) 此命令用于開始將郵件發(fā)送到一個(gè)多個(gè)郵箱中。返回路徑中包括了可選的主機(jī)和發(fā)送者郵箱列表。此表也有作向發(fā)送者返回非傳遞信號(hào)的源路徑。一些出錯(cuò)信息的回復(fù)路徑可能就是空的?! ECIPIENT (RCPT)此命令用于確定郵件內(nèi)容的唯一接收者;多個(gè)接收者將由多個(gè)此命令指定。當(dāng)出現(xiàn)主機(jī)列表時(shí),這就是一個(gè)源路徑,它指明郵件必須向列表中的上一個(gè)主機(jī)發(fā)送。當(dāng)郵件被傳遞發(fā)送時(shí),傳遞主機(jī)必須將自己的名稱由轉(zhuǎn)發(fā)路徑的開始處移至回復(fù)路徑的結(jié)束處。例如,由傳遞主機(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ū)中。此命令導(dǎo)致此命令后的郵件內(nèi)容加入郵件內(nèi)容緩沖區(qū)。郵件內(nèi)容由只包括一個(gè)句號(hào)的行結(jié)束,也就是如下的字符序列:CRLF.CRLF,它指示了郵件的結(jié)束。此過程將回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)的內(nèi)容全部清空。當(dāng)接收SMTP收到一條信息時(shí),無論是用作轉(zhuǎn)發(fā)還是此郵件已經(jīng)到達(dá)目的地,它都必須在郵件內(nèi)容的開始處加上時(shí)間戳這一行,這一行指示了接收到郵件主機(jī)和發(fā)出此郵件主機(jī)的標(biāo)識(shí),以及接收到郵件內(nèi)容的時(shí)間和日期。當(dāng)接收SMTP作最后一站的傳送時(shí),它將返回路徑信息行插入郵件中。在這里,最后一站的傳送的意思是郵件將被送到目的用戶手中,但在一些情況下,郵件可能需要更進(jìn)一步的加工并由另外的郵件系統(tǒng)傳送。上面所述說明了,最后的郵件內(nèi)容由一個(gè)返回路徑行,和在其后的一個(gè)或多個(gè)時(shí)間戳行構(gòu)成。當(dāng)處理后面的郵件數(shù)據(jù)指示部分成功時(shí)就需要特定的說明。在這種情況下,必須對(duì)DATA命令發(fā)送OK應(yīng)答,而接收SMTP組織并發(fā)送一個(gè)不可傳遞郵件信息到信息的發(fā)送者。所有不可傳遞郵件信息由MAIL命令發(fā)送。 27 Oct 81 15:27:39 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è)終端上。 回復(fù)路徑包括一個(gè)可選的主機(jī)列表和發(fā)送者郵箱。此表用于返回非傳遞信號(hào)到發(fā)送者。一些出錯(cuò)信息的回復(fù)路徑可能就是空的。 SEND OR MAIL (SOML)此命令用于開始一個(gè)郵件操作將郵件內(nèi)容傳送到一個(gè)或多個(gè)終端上,或者傳送到郵箱中。參數(shù)域包括回復(fù)路徑,如果成功地將信息送到終端或郵箱中此命令成功。當(dāng)出現(xiàn)主機(jī)列表時(shí),表示這是一個(gè)傳送路徑,郵件就是經(jīng)過這個(gè)路徑上的每個(gè)主機(jī)發(fā)送到這里的(列表上第一個(gè)主機(jī)是最后經(jīng)手的主機(jī))。因?yàn)槊總€(gè)傳遞主機(jī)地址都被加在此表起始處,它就必須使用發(fā)送IPCE而不是接收IPCE(如果它們不是一個(gè)IPCE的話)清楚的名稱。此命令清除回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū),并且將此命令的回復(fù)路徑信息插入到回復(fù)路徑緩沖區(qū)中。如果接收者終端打開,郵件內(nèi)容將被傳送到接收者的終端上和接收者的郵箱中?;貜?fù)路徑包括一個(gè)可選的主機(jī)列表和發(fā)送者郵箱。此表用于返回非傳遞信號(hào)到發(fā)送者。一些出錯(cuò)信息的回復(fù)路徑可能就是空的?!ESET (RSET)此命令指示當(dāng)送郵件操作將被放棄?! ERIFY (VRFY)此命令要求接收者確認(rèn)參數(shù)是一個(gè)用戶。此命令對(duì)回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)沒有影響。如果這是(已經(jīng)知道的)用戶名,返回用戶的全名和指定的郵箱。HELP (HELP)此命令導(dǎo)致接收者向HELP命令的發(fā)送者發(fā)出幫助信息。此命令對(duì)回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)沒有影響。它只是說明沒有任何操作而不是說明接收者發(fā)送了一個(gè)OK應(yīng)答?! UIT (QUIT)此命令指示接收方必須發(fā)送OK應(yīng)答然后關(guān)閉傳送信道。發(fā)送方在發(fā)送QUIT命令和接收到響應(yīng)之前也不應(yīng)該關(guān)閉信道。如果連接被提前關(guān)閉,接收方應(yīng)該象接收到RSET命令一樣,取消所有等待的操作,但不恢復(fù)原先已經(jīng)做過的操作?! URN (TURN)此命令指定接收方要么發(fā)送OK應(yīng)答并改變角色為發(fā)送SMTP,要么發(fā)送拒絕信息并保持自己的角色。程序A就進(jìn)入初始狀態(tài),好象通信信道剛打開一樣,這時(shí)它發(fā)送220準(zhǔn)備好服務(wù)信號(hào)。程序A就進(jìn)入初始狀態(tài),好象通信信道剛打開一樣,這時(shí)它準(zhǔn)備接收220準(zhǔn)備好服務(wù)信號(hào)。對(duì)于這些命令的順序有一定的限制。如果HELLO命令的參數(shù)不可接受,必須由返回一個(gè)501失敗應(yīng)答,同時(shí)接收到的SMTP必須保持在與剛才一致的狀態(tài)下。MAIL,SEND,SOML或SAML命令開始一個(gè)郵件操作。郵件操作可以由RSET命令終止。如果在操作開始參數(shù)不可接受,必須返回501失敗應(yīng)答,同時(shí)接收到的SMTP必須保持在與剛才一致的狀態(tài)下。會(huì)話的最后一個(gè)命令必須是QUIT命令。COMMAND語法格式命令是由命令碼和其后的參數(shù)域組成的。因?yàn)橄旅娴拿畹淖饔檬窍嗤模骸 AIL Mail mail MaIl mAIl這對(duì)于引導(dǎo)任何參數(shù)值的標(biāo)記也是適用的,如TO和to就是一樣的。然而在回復(fù)路徑和轉(zhuǎn)發(fā)路徑中的參數(shù)是區(qū)別大小寫的。參數(shù)域由不定長的字符串組成,它由CRLF結(jié)束,接收方在完全接收到此序列前不會(huì)采取任何行動(dòng)。如果不選擇的話,系統(tǒng)選擇默認(rèn)的設(shè)置。每個(gè)命令必須有且只有一個(gè)響應(yīng)。數(shù)字幫助決定下一個(gè)應(yīng)該進(jìn)入的狀態(tài),而文本對(duì)人是有意義的。特別的是,文本是與接收和環(huán)境相關(guān)的,所以每次接收到的文本可能不同。正規(guī)的情況下,響應(yīng)由下面序列構(gòu)成:三位的數(shù)字,SP,一行文本和一個(gè)CRLF,或者也可以是一個(gè)多行響應(yīng)。REPLY CODES BY FUNCTION GROUPS 500 格式錯(cuò)誤,命令不可識(shí)別(此錯(cuò)誤也包括命令行過長)501 參數(shù)格式錯(cuò)誤502 命令不可實(shí)現(xiàn)503 錯(cuò)誤的命令序列504 命令參數(shù)不可實(shí)現(xiàn)211 系統(tǒng)狀態(tài)或系統(tǒng)幫助響應(yīng)214 幫助信息220 domain 服務(wù)就緒221 domain 服務(wù)關(guān)閉傳輸信道 421 domain 服務(wù)未就緒,關(guān)閉傳輸信道(當(dāng)必須關(guān)閉時(shí),此應(yīng)答可以作為對(duì)任何命令的響應(yīng))250 要求的郵件操作完成251 用戶非本地,將轉(zhuǎn)發(fā)向forwardpath450 要求的郵件操作未完成,郵箱不可用(例如,郵箱忙)550 要求的郵件操作未完成,郵箱不可用(例如,郵箱未找到,或不可訪問)451 放棄要求的操作;處理過程中出錯(cuò)551 用戶非本地,請(qǐng)嘗試forwardpath452 系統(tǒng)存儲(chǔ)不足,要求的操作未執(zhí)行552 過量的存儲(chǔ)分配,要求的操作未執(zhí)行553 郵箱名不可用,要求的操作未執(zhí)行(例如郵箱格式錯(cuò)誤)354 開始郵件輸入,以CRLF.CRLF結(jié)束554 操作失敗4 RFC822說道發(fā)送和接受郵件,我們就必須不得不提RFC822了。該標(biāo)準(zhǔn)提供了郵件內(nèi)容的格式和相關(guān)語義。從直觀上看,信件非常簡單,就是一系列由ASCII字符組成的文本行,每一行以回車換行符(“CRLF“,就是ASCII碼的13和10)結(jié)束。第一部分稱為信件的頭部(the header of the message),包括有關(guān)發(fā)送方、接收方、發(fā)送日期等信息。信頭是必需的,信體是可選的,即信體可有可無。在信體中,也可以有用作分隔的空白行。在RFC822中規(guī)定,信件體就是一系列的向收信人表達(dá)信息的文本行,比較簡單,可以包含任意文本,并沒有附加的結(jié)構(gòu)。4.2 信件的頭部4.2.1 信頭的一般格式信頭的結(jié)構(gòu)比較復(fù)雜,信頭由若干信頭字段(header field)組成,這些字段為用戶和程序提供了關(guān)于信件的信息。所有的信頭字段都具有相同的語法結(jié)構(gòu),從邏輯上說,包括四部分,字段名(field name),緊跟冒號(hào): (colon),后跟字段體(field body),最后以回車換行符(CRLF)終止。字段名告訴電子郵件軟件如何翻譯該行中剩下的內(nèi)容。但是其中的空格,加括號(hào)的注釋,引號(hào)和多行字段都比較復(fù)雜,另外,字段體的語法和語義依賴于字段名,每個(gè)類型的字段有特定的格式。結(jié)構(gòu)化字段有特定的格式,由語法分析程序檢測(cè)。非結(jié)構(gòu)化的字段含有任意的數(shù)據(jù),沒有固定格式。非結(jié)構(gòu)化的字段數(shù)量較少,只有Subject、 Comments、擴(kuò)展字段,非標(biāo)準(zhǔn)字段、IN—Reply和References等。4.2.3 信頭字段的元素盡管Email信件的總體結(jié)構(gòu)非常簡單,但一些信頭字段的結(jié)構(gòu)是很復(fù)雜的。(1)空白符像其它文本文件一樣,空白符包括空格符(ASCII碼32)和制表符Tab(ASCII碼19)。使用空白符可以對(duì)字段進(jìn)行格式化,增加它的可讀性。在Subject后面的冒號(hào)和內(nèi)容之間插入空格字符,會(huì)使字段結(jié)構(gòu)更加清晰。(2)注解注解是由括號(hào)括起來的一系列字符,例如,(這份禮物)。如果在加引號(hào)的字符串中有包括在括號(hào)中的字符,那是字符串的一部分,不是注解。(3)字段折疊每個(gè)信頭字段從邏輯上說應(yīng)當(dāng)是一個(gè)由字段名、冒號(hào)、字段體和CRLF組成的單一的行,但為了書寫與顯示的方便,增加可讀性,也為了符合1000/80的行字符數(shù)的限制,可以將超過80個(gè)字符的信頭字段分為多行,即對(duì)于比較長的字段,可以分割成幾行,形成折疊。通過在字段中某些點(diǎn)插入CRLF符和至少一個(gè)或多個(gè)空白字符來實(shí)現(xiàn)字段的折疊,第一行后面的行稱為信頭字段的續(xù)行。在分析被折疊的字段的語法時(shí),要把一個(gè)多行的折疊字段展開為一行,根據(jù)它的非折疊的形式來分析它的語法與語義。不過字段名稱大小寫有習(xí)慣的常用形式,如主題字段的大小寫形式通常為Subject。比如Subject后面的字段體,其中的大寫可能就是縮寫的專用名詞,不能改動(dòng)。 RFC822常用的標(biāo)準(zhǔn)信頭字段與發(fā)信方有關(guān)的信頭字段格式:From:mailbox舉例:From:wang寫信人字段。創(chuàng)建者對(duì)信件的原始內(nèi)容負(fù)責(zé)。說明實(shí)際提交發(fā)送這個(gè)信件的人,給出他的電子信箱地址。比如,秘書替經(jīng)理發(fā)信。格式:ReplyTO:mailbox舉例:From:wang From:zhao回復(fù)字段。如果有此字段,回信將會(huì)發(fā)給它指定的郵箱,而不會(huì)發(fā)給From字段指定的郵箱。與收信方有關(guān)的信頭字段格式:TO:mailbox list舉例:TO:zhang收信人字段。格式:Cc:mailbox list舉例:Cc:zhang抄送字段。也可以使用郵箱地址列表,抄送給多個(gè)人。指定此信件要同時(shí)秘密發(fā)給哪些人,也稱為密件抄送。其它的信頭字段格式:Date:datetime舉例:Date:Tue,04 Dec 2004 16:18:08 +800日期字段:Date字段含有電子郵件創(chuàng)建的日期和時(shí)間。描述信件的主題。格式:Received:[from domain] 。接收主機(jī)[via atom] 。接收者msg id接受字段。處理郵件投遞的每個(gè)服務(wù)器必須給它處理的每個(gè)信頭的前面加一個(gè)Received字段,用以描述信件到達(dá)目的地所經(jīng)過的路徑以及相關(guān)信息