版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> E-Mail Client SoftWare</p><p><b> Abstract</b></p><p> E-Mail play a very important role in modern times.More and more people are using it,and the number of it will larg
2、er and larger.Though there are a lot of software for sending and receiving letters such as FoxMail which are also multifunctional,it is difficult and complicated to the Most of people who are curbstone.For this reason,we
3、 do this software with the rock-bottom protocol of SMTP and Pop. The full name of SMTP is Simple Mail Transfer Protocol.It is Used to sending letters.The full name of</p><p> Key Words:SMTP,nameSpace,Class,
4、Attachment</p><p><b> 電子郵件客戶端軟件</b></p><p><b> 摘要</b></p><p> 電子郵件在當(dāng)今社會(huì)中扮演了一個(gè)很重要的角色。越來(lái)越多的人在使用它。而且用它的人數(shù)勢(shì)必會(huì)繼續(xù)增加。雖然,現(xiàn)在已經(jīng)有很多的郵件收發(fā)軟件例如著名的FoxMail 但是對(duì)于大多數(shù)的非專業(yè)的人來(lái)
5、說(shuō)它還是有點(diǎn)難度稍嫌負(fù)責(zé)。因此,我們就利用SMTP和Pop協(xié)議從底層開發(fā)了這個(gè)軟件。SMTP全稱是簡(jiǎn)單郵件傳輸協(xié)議,它專門用來(lái)發(fā)送郵件用的。Pop全稱是郵局協(xié)議,是專門用于接收郵件的。我主要是負(fù)責(zé)如何實(shí)現(xiàn)發(fā)送郵件功能的。MailSend命名空間是我整個(gè)程序的核心。它包括兩個(gè)類。在SmtpMail的類中包含了一個(gè)SendMail的方法,它從底層詳細(xì)地實(shí)現(xiàn)了和服務(wù)器的交互操作。你既可以用它發(fā)送一個(gè)純文本郵件,也可以發(fā)送一個(gè)帶有附件的郵件,理
6、所當(dāng)然地,你也可以使用不同的SMTP服務(wù)器。經(jīng)過(guò)測(cè)試,證實(shí)此軟件是一個(gè)支持多收信人,多附件的群發(fā)軟件。雖然它沒(méi)有FoxMail那么強(qiáng)大的功能,但是它容易掌握和使用。</p><p> 關(guān)鍵詞:SMTP,命名空間,類,附件</p><p><b> 目 錄</b></p><p><b> 1 引言1</b><
7、;/p><p> 1.1 電子郵件介紹1</p><p> 1.2 開發(fā)背景2</p><p> 1.3 開發(fā)環(huán)境及運(yùn)行環(huán)境2</p><p> 2 軟件架構(gòu)及系統(tǒng)用例圖3</p><p> 2.1 系統(tǒng)架構(gòu)3</p><p> 2.2 系統(tǒng)總體用例3</p
8、><p> 2.4 發(fā)送郵件類4</p><p> 2.5 附加小功能類4</p><p> 3 SMTP協(xié)議的研究4</p><p> 3.1 SMTP協(xié)議簡(jiǎn)介及工作原理5</p><p> 3.2 SMTP協(xié)議的命令和應(yīng)答6</p><p> 3.2.1 SM
9、TP協(xié)議的命令6</p><p> 4 RFC82214</p><p> 4.1 RFC822簡(jiǎn)單介紹14</p><p> 4.2 信件的頭部14</p><p> 5 命名控件MailSend20</p><p> 5.1 發(fā)送郵件類SmtpMail20</p>&l
10、t;p> 5.2 AddExtra類27</p><p> 5.2.1 調(diào)用Windows API 所需的命名空間28</p><p> 5.2.3 在程序中具體的使用28</p><p> 6 軟件運(yùn)行時(shí)的界面29</p><p> 6.1 新建郵件帳號(hào)29</p><p> 7
11、 系統(tǒng)測(cè)試32</p><p> 7.1 同一SMTP服務(wù)器發(fā)送郵件的測(cè)試32</p><p> 7.2 利用不同的SMTP服務(wù)器發(fā)送郵件的測(cè)試32</p><p><b> 8 結(jié)論34</b></p><p><b> 參考文獻(xiàn)35</b></p><
12、;p><b> 致 謝36</b></p><p><b> 外文文獻(xiàn)原文</b></p><p><b> 譯文</b></p><p><b> 1 引言</b></p><p> 1.1 電子郵件介紹</p>&l
13、t;p> 電子郵件(簡(jiǎn)稱E-mai1)又稱電子信箱、電子郵政,它是—種用電子手段提供信息交換的通信方式。它是全球多種網(wǎng)絡(luò)上使用最普遍的一項(xiàng)服務(wù)。這種非交互式的通信,加速了信息的交流及數(shù)據(jù)傳送,它是—個(gè)簡(jiǎn)易、快速的方法。通過(guò)連接全世界的Internet,實(shí)現(xiàn)各類信號(hào)的傳送、接收、存貯等處理,將郵件送到世界的各個(gè)角落。到目前為止,可以說(shuō)電子郵件是Internet資源使用最多的一種服務(wù),E-mai1不只局限于信件的傳遞,還可用來(lái)傳遞文
14、件、聲音及圖形、圖像等不同類型的信息。</p><p> 電子郵件不是一種“終端到終端”的服務(wù),是被稱為“存貯轉(zhuǎn)發(fā)式”服務(wù)。這正是電子信箱系統(tǒng)的核心,利用存貯轉(zhuǎn)發(fā)可進(jìn)行非實(shí)時(shí)通信,屬異步通信方式。即信件發(fā)送者可隨時(shí)隨地發(fā)送郵件,不要求接收者同時(shí)在場(chǎng),即使對(duì)方現(xiàn)在不在,仍可將郵件立刻送到對(duì)方的信箱內(nèi),且存儲(chǔ)在對(duì)方的電子郵箱中。接收者可在他認(rèn)為方便的時(shí)候讀取信件,不受時(shí)空限制。在這里,“發(fā)送”郵件意味著將郵件放到收
15、件人的信箱中,而“接收”郵件則意味著從自己的信箱中讀取信件,信箱實(shí)際上是由文件管理系統(tǒng)支持的—個(gè)實(shí)體。因?yàn)殡娮余]件是通過(guò)郵件服務(wù)器(mai1 server)來(lái)傳遞檔的。通常mail server是執(zhí)行多任務(wù)操作系統(tǒng)UNIX的計(jì)算機(jī),它提供24小時(shí)的電子郵件服務(wù),用戶只要向 mail server管理人員申請(qǐng)—個(gè)信箱賬號(hào),就可使用這項(xiàng)快速的郵件服務(wù)。</p><p> 電子郵件的工作原理:</p>
16、<p> 1) 電子郵件系統(tǒng)是一種新型的信息系統(tǒng),是通信技術(shù)和計(jì)算機(jī)技術(shù)結(jié)合的產(chǎn)物。 </p><p> 電子郵件的傳輸是通過(guò)電子郵件簡(jiǎn)單傳輸協(xié)議(Simple Mail Transfer Protocol,簡(jiǎn)稱SMTP)這一系統(tǒng)軟件來(lái)完成的,它是Internet下的一種電子郵件通信協(xié)議。 </p><p> 2) 電子郵件的基本原理,是在通信網(wǎng)上設(shè)立“電子信箱系統(tǒng)”,它實(shí)
17、際上是一個(gè)計(jì)算機(jī)系統(tǒng)。系統(tǒng)的硬件是一個(gè)高性能、大容量的計(jì)算機(jī)。硬盤作為信箱的存儲(chǔ)介質(zhì),在硬盤上為用戶分一定的存儲(chǔ)空間作為用戶的“信箱”,每位用戶都有屬于自己的—個(gè)電子信箱。并確定—個(gè)用戶名和用戶可以自己隨意修改的口令。存儲(chǔ)空間包含存放所收信件、編輯信件以及信件存盤三部分空間,用戶使用口令開啟自己的信箱,并進(jìn)行發(fā)信、讀信、編輯、轉(zhuǎn)發(fā)、存檔等各種操作。系統(tǒng)功能主要由軟件實(shí)現(xiàn)。</p><p> 3) 電子郵件的通信
18、是在信箱之間進(jìn)行的。用戶首先開啟自己的信箱,然后通過(guò)鍵入命令的方式將需要發(fā)送的郵件發(fā)到對(duì)方的信箱中。郵件在信箱之間進(jìn)行傳遞和交換,也可以與另—個(gè)郵件系統(tǒng)進(jìn)行傳遞和交換。收方在取信時(shí),使用特定賬號(hào)從信箱提取。</p><p><b> 1.2 開發(fā)背景</b></p><p> 當(dāng)前流行的各大郵件客戶端軟件的除了最主要的收發(fā)信件之外,功能越來(lái)越復(fù)雜,但是人們平常真
19、正用到的功能很少,很多功能尤其對(duì)于那些計(jì)算機(jī)知識(shí)相對(duì)缺乏的人來(lái)說(shuō),更加顯得太過(guò)于華麗而不太實(shí)用。有鑒于此,在了解RFC底層協(xié)議的基礎(chǔ)上,我們開發(fā)了這個(gè)各種功能相對(duì)簡(jiǎn)單實(shí)用的郵件客戶端程序,簡(jiǎn)化了很多不必要的功能。</p><p> 1.3 開發(fā)環(huán)境及運(yùn)行環(huán)境</p><p> 1.3.1 開發(fā)環(huán)境</p><p> AMD Athlon(TM),512M內(nèi)
20、存,80G硬盤</p><p> Microsoft® Windows? XP Professional</p><p> Microsoft® Visual Studio 2003(C Sharp)</p><p> Microsoft® Developer Network for Visual Studio.NET 2003&
21、lt;/p><p> 1.3.2 運(yùn)行環(huán)境</p><p> Intel® Pentium® 2及以上處理器,32M以上內(nèi)存,4G以上硬盤</p><p> Microsoft® Windows? 9X/NT操作系統(tǒng)</p><p> 800*600或以上的屏幕分辨率</p><p>
22、; 確保機(jī)器上安裝有.Net FrameWork 1.0或者以上版本</p><p> 2 軟件架構(gòu)及系統(tǒng)用例圖</p><p><b> 2.1 系統(tǒng)架構(gòu)</b></p><p> 軟件的總體架構(gòu)如圖2.1:</p><p> 圖2.1 軟件架構(gòu)圖</p><p> 2.2
23、系統(tǒng)總體用例</p><p> 圖2.2 系統(tǒng)總體用例圖</p><p><b> 3 程序功能框圖</b></p><p> 圖2.3 程序功能圖</p><p> 2.4 發(fā)送郵件類</p><p> 是發(fā)送郵件的核心,類名為SmtpMail,隸屬于命名空間MailSend。
24、封裝了發(fā)送郵件的具體實(shí)現(xiàn)方法,也是具體的RFC用代碼實(shí)現(xiàn)的過(guò)程。而用戶通過(guò)具體的操作接口,接口與SmtpMail類通過(guò)交互操作來(lái)實(shí)現(xiàn)用戶發(fā)送信件的操作。</p><p> 2.5 附加小功能類</p><p> 是獲取一些諸如系統(tǒng)時(shí)間,當(dāng)前用戶名,以及本機(jī)IP之類的類,類名為AddExtra,隸屬于命名空間MailSend。</p><p> 3 SMTP
25、協(xié)議的研究</p><p> 由于要開發(fā)的是郵件客戶端程序,就不得不用到SMTP協(xié)議和POP協(xié)議。而我個(gè)人負(fù)責(zé)的是郵件發(fā)送功能的實(shí)現(xiàn),因此就必然會(huì)涉及到SMTP(Simple Mail Transfer Protocol)協(xié)議。SMTP被用來(lái)在因特網(wǎng)上發(fā)送郵件,該協(xié)議規(guī)定了一些基本的命令和方法使客戶端與服務(wù)器進(jìn)行交互,以達(dá)到發(fā)送郵件的目的。</p><p> 3.1 SMTP協(xié)議簡(jiǎn)介
26、及工作原理</p><p><b> 3.1.1 介紹</b></p><p> 簡(jiǎn)單郵件傳輸協(xié)議(SMTP)的目標(biāo)是可靠高效地傳送郵件,它獨(dú)立于傳送子系統(tǒng)而且僅要求一條可以保證傳送數(shù)據(jù)單元順序的通道。</p><p> SMTP的一個(gè)重要特點(diǎn)是它能夠在傳送中接力傳送郵件,傳送服務(wù)提供了進(jìn)程間通信環(huán)境(IPCE),此環(huán)境可以包括一個(gè)網(wǎng)絡(luò)
27、,幾個(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ī)接力式傳送。</p><p> 3.1.2 SMTP模型 </p><p> SMTP設(shè)計(jì)基于以下通信模型:針對(duì)用戶的郵件請(qǐng)求,發(fā)
28、送SMTP建立與接收SMTP之間建立一個(gè)雙向傳送通道。接收SMTP可以是最終接收者也可以是中間傳送者。SMTP命令由發(fā)送SMTP發(fā)出,由接收SMTP接收,而應(yīng)答則反方面?zhèn)魉汀?lt;/p><p> 一旦傳送通道建立,SMTP發(fā)送者發(fā)送MAIL命令指明郵件發(fā)送者。如果SMTP接收者可以接收郵件則返回OK應(yīng)答。SMTP發(fā)送者再發(fā)出RCPT命令確認(rèn)郵件是否接收到。如果SMTP接收者接收,則返回OK應(yīng)答;如果不能接收到,則
29、發(fā)出拒絕接收應(yīng)答(但不中止整個(gè)郵件操作),雙方將如此重復(fù)多次。當(dāng)接收者收到全部郵件后會(huì)接收到特別的序列,如果接收者成功處理了郵件,則返回OK應(yīng)答。</p><p> SMTP提供傳送郵件的機(jī)制,如果接收方與發(fā)送方連接在同一個(gè)傳送服務(wù)下時(shí),郵件可以直接由發(fā)送方主機(jī)傳送到接收方主機(jī);或者,當(dāng)兩者不在同一個(gè)傳送服務(wù)下時(shí),通過(guò)中繼SMTP服務(wù)器傳送。為了能夠?qū)MTP服務(wù)器提供中繼能力,它必須擁有最終目的主機(jī)地址和郵箱
30、名稱。</p><p> MAIL命令參數(shù)是回復(fù)路徑,它指定郵件從何處來(lái);而RCPT命令的參數(shù)是轉(zhuǎn)發(fā)路徑的,它指定郵件向何處去。向前路徑是源路徑,而回復(fù)路徑是返回路徑(它用于發(fā)生錯(cuò)誤時(shí)返回郵件)。</p><p> 當(dāng)同一個(gè)消息要發(fā)往不同的接收者時(shí),SMTP遇到了向不同接收者發(fā)送同一份數(shù)據(jù)的復(fù)制品的問(wèn)題,郵件命令和應(yīng)答有一個(gè)比較奇怪的語(yǔ)法,應(yīng)答也有一個(gè)數(shù)字代碼。在下面,例子中可以看到哪
31、些使用實(shí)際的命令和應(yīng)答。完整的命令和應(yīng)答在第四節(jié)。</p><p> 命令與應(yīng)答對(duì)大小寫不敏感,也就是說(shuō),命令和應(yīng)答可以是大寫,小寫或兩者的混合,但這一點(diǎn)對(duì)用戶郵件名稱卻不一定是對(duì)的,因?yàn)橛械闹鳈C(jī)對(duì)用戶名大小寫是敏感的。這樣SMTP實(shí)現(xiàn)中就將用戶郵箱名稱保留成初始時(shí)的樣子,主機(jī)名稱對(duì)大小寫不敏感。</p><p> 命令與應(yīng)答由ASCII字母表組成,當(dāng)傳送服務(wù)提供8位字節(jié)傳送通道,每7
32、位字符正確傳送,而最高位被填充為0。當(dāng)指定一般的命令或應(yīng)答格式后,參數(shù)會(huì)由一些類似于語(yǔ)言的字符串表示出來(lái),如"<string>"或"<reverse-path>",這里尖括號(hào)表示這是一種類似于語(yǔ)言的變量。</p><p> 3.2 SMTP協(xié)議的命令和應(yīng)答</p><p> 3.2.1 SMTP協(xié)議的命令</p
33、><p> SMTP命令定義了郵件傳輸或由用戶定義的系統(tǒng)功能。它的命令是由<CRLF>結(jié)束的字符串。而在帶有參數(shù)的情況下,命令本身由<SP>和參數(shù)分開,如果未帶參數(shù)可以直接和<CRLF>連接。郵箱的語(yǔ)法格式必須和接收站點(diǎn)的格式一致。下面討論SMTP命令和應(yīng)答。</p><p> 發(fā)送郵件操作涉及到不同的數(shù)據(jù)對(duì)象,它們由不同的參數(shù)相互連接?;貜?fù)路徑就是MA
34、IL命令的參數(shù),而轉(zhuǎn)發(fā)路徑則是RCPT命令的參數(shù),郵件日期是DATA命令的參數(shù)。這些參數(shù)或者數(shù)據(jù)對(duì)象必須跟在命令后。這種模式也就要求有不同的緩沖區(qū)來(lái)存儲(chǔ)這些對(duì)象,也就是說(shuō),有一個(gè)回復(fù)路徑緩沖區(qū),一個(gè)轉(zhuǎn)發(fā)路徑緩沖區(qū),一個(gè)郵件內(nèi)容緩沖區(qū)。特定的命令產(chǎn)生自己的緩沖區(qū),或使一個(gè)或多個(gè)緩沖的內(nèi)容被清除。</p><p> HELLO (HELO)</p><p> 此命令用于向接收SMTP確認(rèn)發(fā)
35、送SMTP。參數(shù)域包括發(fā)送SMTP的主機(jī)名。接收SMTP通過(guò)連接確認(rèn)命令來(lái)向發(fā)送SMTP確認(rèn)接收SMTP。引命令和OK響應(yīng)確認(rèn)發(fā)送和接收SMTP進(jìn)入了初始狀態(tài),也就是說(shuō),沒(méi)有操作正在執(zhí)行,所有狀態(tài)表和緩沖區(qū)已經(jīng)被子清除。</p><p> MAIL (MAIL) </p><p> 此命令用于開始將郵件發(fā)送到一個(gè)多個(gè)郵箱中。參數(shù)域包括回復(fù)路徑。返回路徑中包括了可選的主機(jī)和發(fā)送者郵箱列表
36、。當(dāng)有主機(jī)列表時(shí),它是一個(gè)回復(fù)路徑源,它說(shuō)明此郵箱是由在表中的主機(jī)一一傳遞發(fā)送(第一個(gè)主機(jī)是最后一個(gè)接收到此郵件的主機(jī))過(guò)來(lái)的。此表也有作向發(fā)送者返回非傳遞信號(hào)的源路徑。因?yàn)槊總€(gè)傳遞主機(jī)地址都被加在此表起始處,它就必須使用發(fā)送IPCE而不是接收IPCE(如果它們不是一個(gè)IPCE的話)清楚的名稱。一些出錯(cuò)信息的回復(fù)路徑可能就是空的。</p><p> 此命令清除回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū),并且
37、將此命令的回復(fù)路徑信息插入到回復(fù)路徑緩沖區(qū)中。</p><p> RECIPIENT (RCPT)</p><p> 此命令用于確定郵件內(nèi)容的唯一接收者;多個(gè)接收者將由多個(gè)此命令指定。轉(zhuǎn)發(fā)路徑中包括一個(gè)可選的主機(jī)和一個(gè)必須的目的郵箱。當(dāng)出現(xiàn)主機(jī)列表時(shí),這就是一個(gè)源路徑,它指明郵件必須向列表中的上一個(gè)主機(jī)發(fā)送。如果接收SMTP未實(shí)現(xiàn)郵件的傳遞發(fā)送,就會(huì)返回如未知本地用戶(550)的信息給
38、用戶。</p><p> 當(dāng)郵件被傳遞發(fā)送時(shí),傳遞主機(jī)必須將自己的名稱由轉(zhuǎn)發(fā)路徑的開始處移至回復(fù)路徑的結(jié)束處。當(dāng)郵件最終到達(dá)目的地時(shí),接收SMTP將以它的主機(jī)郵件格式自己的名稱插入目標(biāo)郵件中。例如,由傳遞主機(jī)A接收的帶有如下參數(shù)的郵件時(shí),</p><p> FROM:<USERX@HOSTY.ARPA></p><p> TO:<@HOSTA
39、.ARPA,@HOSTB.ARPA:USERC@HOSTD.ARPA></p><p><b> 將會(huì)變成如下形式:</b></p><p> FROM:<@HOSTA.ARPA:USERX@HOSTY.ARPA></p><p> TO:<@HOSTB.ARPA:USERC@HOSTD.ARPA>.<
40、/p><p> 此命令導(dǎo)致它的轉(zhuǎn)發(fā)路徑參數(shù)加入轉(zhuǎn)發(fā)路徑緩沖區(qū)中。</p><p> DATA (DATA)</p><p> 接收者將跟在命令后的行作為郵件內(nèi)容。此命令導(dǎo)致此命令后的郵件內(nèi)容加入郵件內(nèi)容緩沖區(qū)。郵件內(nèi)容可以包括所有128個(gè)ASCII碼字符。郵件內(nèi)容由只包括一個(gè)句號(hào)的行結(jié)束,也就是如下的字符序列:"<CRLF>.<CRLF
41、>",它指示了郵件的結(jié)束。</p><p> 郵件內(nèi)容的結(jié)束指示要求接收者現(xiàn)在就處理保存的郵件內(nèi)容。此過(guò)程將回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)的內(nèi)容全部清空。如果操作成功,接收者必須返回OK應(yīng)答;如果失敗也必須返回失敗應(yīng)答。</p><p> 當(dāng)接收SMTP收到一條信息時(shí),無(wú)論是用作轉(zhuǎn)發(fā)還是此郵件已經(jīng)到達(dá)目的地,它都必須在郵件內(nèi)容的開始處加上時(shí)間戳這一行,這
42、一行指示了接收到郵件主機(jī)和發(fā)出此郵件主機(jī)的標(biāo)識(shí),以及接收到郵件內(nèi)容的時(shí)間和日期。轉(zhuǎn)發(fā)的信件將有多行這樣的時(shí)間戳。當(dāng)接收SMTP作最后一站的傳送時(shí),它將返回路徑信息行插入郵件中。此行包括了發(fā)送命令中的<reverse-path>的信息。在這里,最后一站的傳送的意思是郵件將被送到目的用戶手中,但在一些情況下,郵件可能需要更進(jìn)一步的加工并由另外的郵件系統(tǒng)傳送。</p><p> 可能在返回路徑中的郵箱與實(shí)
43、際發(fā)送的郵件不一致,這個(gè)情況可能發(fā)生在需要傳送一個(gè)特定的錯(cuò)誤處理信箱而不是信件發(fā)送者那里。上面所述說(shuō)明了,最后的郵件內(nèi)容由一個(gè)返回路徑行,和在其后的一個(gè)或多個(gè)時(shí)間戳行構(gòu)成。這些行后面是郵件內(nèi)容的頭和體信息。</p><p> 當(dāng)處理后面的郵件數(shù)據(jù)指示部分成功時(shí)就需要特定的說(shuō)明。這種情況可能發(fā)生在發(fā)送SMTP發(fā)現(xiàn)當(dāng)郵件需要傳送給多個(gè)用戶時(shí),只能夠成功地向其中的一部分發(fā)送信息這種情況下。在這種情況下,必須對(duì)DATA
44、命令發(fā)送OK應(yīng)答,而接收SMTP組織并發(fā)送一個(gè)"不可傳遞郵件"信息到信息的發(fā)送者。在此信息中或者發(fā)送一個(gè)不成功接收者的列表,或者每次發(fā)送一個(gè)不成接收者,而發(fā)送多次。所有不可傳遞郵件信息由MAIL命令發(fā)送。</p><p> 返回路徑和接收時(shí)間戳例子</p><p> Return-Path: <@GHI.ARPA,@DEF.ARPA,@ABC.ARPA:JOE
45、@ABC.ARPA></p><p> Received: from GHI.ARPA by JKL.ARPA ; 27 Oct 81 15:27:39 PST</p><p> Received: from DEF.ARPA by GHI.ARPA ; 27 Oct 81 15:15:13 PST</p><p> Received: from ABC
46、.ARPA by DEF.ARPA ; 27 Oct 81 15:01:59 PST</p><p> Date: 27 Oct 81 15:01:01 PST </p><p> From: JOE@ABC.ARPA </p><p> Subject: Improved Mailing System Installed </p><p&
47、gt; To: SAM@JKL.ARPA </p><p> This is to inform you that ... </p><p> SEND (SEND)</p><p> 此命令用于開始一個(gè)發(fā)送命令,將郵件發(fā)送到一個(gè)或多個(gè)終端上。參數(shù)域包括了一個(gè)回復(fù)路徑,此命令如果成功就將郵件發(fā)送到終端上了。 </p><p> 回復(fù)
48、路徑包括一個(gè)可選的主機(jī)列表和發(fā)送者郵箱。當(dāng)出現(xiàn)主機(jī)列表時(shí),表示這是一個(gè)傳送路徑,郵件就是經(jīng)過(guò)這個(gè)路徑上的每個(gè)主機(jī)發(fā)送到這里的(列表上第一個(gè)主機(jī)是最后經(jīng)手的主機(jī))。此表用于返回非傳遞信號(hào)到發(fā)送者。因?yàn)槊總€(gè)傳遞主機(jī)地址都被加在此表起始處,它就必須使用發(fā)送IPCE而不是接收IPCE(如果它們不是一個(gè)IPCE的話)清楚的名稱。一些出錯(cuò)信息的回復(fù)路徑可能就是空的。</p><p> 此命令清除回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖
49、區(qū)和郵件內(nèi)容緩沖區(qū),并且將此命令的回復(fù)路徑信息插入到回復(fù)路徑緩沖區(qū)中。</p><p> SEND OR MAIL (SOML)</p><p> 此命令用于開始一個(gè)郵件操作將郵件內(nèi)容傳送到一個(gè)或多個(gè)終端上,或者傳送到郵箱中。對(duì)于每個(gè)接收者,如果接收者終端打開,郵件內(nèi)容將被傳送到接收者的終端上,否則就送到接收者的郵箱中。參數(shù)域包括回復(fù)路徑,如果成功地將信息送到終端或郵箱中此命令成功。&
50、lt;/p><p> 回復(fù)路徑包括一個(gè)可選的主機(jī)列表和發(fā)送者郵箱。當(dāng)出現(xiàn)主機(jī)列表時(shí),表示這是一個(gè)傳送路徑,郵件就是經(jīng)過(guò)這個(gè)路徑上的每個(gè)主機(jī)發(fā)送到這里的(列表上第一個(gè)主機(jī)是最后經(jīng)手的主機(jī))。此表用于返回非傳遞信號(hào)到發(fā)送者。因?yàn)槊總€(gè)傳遞主機(jī)地址都被加在此表起始處,它就必須使用發(fā)送IPCE而不是接收IPCE(如果它們不是一個(gè)IPCE的話)清楚的名稱。一些出錯(cuò)信息的回復(fù)路徑可能就是空的。</p><p&
51、gt; 此命令清除回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū),并且將此命令的回復(fù)路徑信息插入到回復(fù)路徑緩沖區(qū)中。</p><p> SEND AND MAIL (SAML)</p><p> 此命令用于開始一個(gè)郵件操作將郵件內(nèi)容傳送到一個(gè)或多個(gè)終端上,并傳送到郵箱中。如果接收者終端打開,郵件內(nèi)容將被傳送到接收者的終端上和接收者的郵箱中。參數(shù)域包括回復(fù)路徑,如果成功地將信息送到郵箱
52、中此命令成功。</p><p> 回復(fù)路徑包括一個(gè)可選的主機(jī)列表和發(fā)送者郵箱。當(dāng)出現(xiàn)主機(jī)列表時(shí),表示這是一個(gè)傳送路徑,郵件就是經(jīng)過(guò)這個(gè)路徑上的每個(gè)主機(jī)發(fā)送到這里的(列表上第一個(gè)主機(jī)是最后經(jīng)手的主機(jī))。此表用于返回非傳遞信號(hào)到發(fā)送者。因?yàn)槊總€(gè)傳遞主機(jī)地址都被加在此表起始處,它就必須使用發(fā)送IPCE而不是接收IPCE(如果它們不是一個(gè)IPCE的話)清楚的名稱。一些出錯(cuò)信息的回復(fù)路徑可能就是空的。</p>
53、<p> 此命令清除回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū),并且將此命令的回復(fù)路徑信息插入到回復(fù)路徑緩沖區(qū)中。</p><p> RESET (RSET)</p><p> 此命令指示當(dāng)送郵件操作將被放棄。任何保存的發(fā)送者,接收者和郵件內(nèi)容應(yīng)該被拋棄,所有緩沖區(qū)和狀態(tài)表應(yīng)該被清除,接收方必須返回OK應(yīng)答。</p><p> VERIFY
54、 (VRFY)</p><p> 此命令要求接收者確認(rèn)參數(shù)是一個(gè)用戶。如果這是(已經(jīng)知道的)用戶名,返回用戶的全名和指定的郵箱。此命令對(duì)回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)沒(méi)有影響。</p><p> EXPAND (EXPN)</p><p> 此命令要求接收者確認(rèn)參數(shù)指定了一個(gè)郵件發(fā)送列表,如果是一個(gè)郵件發(fā)送列表,就返回表中的成員。如果這是(已經(jīng)
55、知道的)用戶名,返回用戶的全名和指定的郵箱。此命令對(duì)回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)沒(méi)有影響。</p><p> HELP (HELP)</p><p> 此命令導(dǎo)致接收者向HELP命令的發(fā)送者發(fā)出幫助信息。此命令可以帶參數(shù),并返回特定的信息作為應(yīng)答。此命令對(duì)回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)沒(méi)有影響。</p><p> NOOP (
56、NOOP) </p><p> 此命令不影響任何參數(shù)和已經(jīng)發(fā)出的命令。它只是說(shuō)明沒(méi)有任何操作而不是說(shuō)明接收者發(fā)送了一個(gè)OK應(yīng)答。此命令對(duì)回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)沒(méi)有影響。</p><p> QUIT (QUIT)</p><p> 此命令指示接收方必須發(fā)送OK應(yīng)答然后關(guān)閉傳送信道。接收方在接到QUIT命令并做出響應(yīng)之前不應(yīng)該關(guān)閉通信信道。
57、發(fā)送方在發(fā)送QUIT命令和接收到響應(yīng)之前也不應(yīng)該關(guān)閉信道。即使出錯(cuò),也不應(yīng)該關(guān)閉信道。如果連接被提前關(guān)閉,接收方應(yīng)該象接收到RSET命令一樣,取消所有等待的操作,但不恢復(fù)原先已經(jīng)做過(guò)的操作。而發(fā)送方應(yīng)該象接收到暫時(shí)錯(cuò)誤(4XX)一樣假定命令和操作仍在支持之中。</p><p> TURN (TURN)</p><p> 此命令指定接收方要么發(fā)送OK應(yīng)答并改變角色為發(fā)送SMTP,要么發(fā)送
58、拒絕信息并保持自己的角色。如果程序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)。</p><p> 若要拒絕
59、改變角色,接收方可以發(fā)送502應(yīng)答。</p><p> 對(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è)郵件操作。一旦開始了以
60、后就要發(fā)送RCPT和DATA命令。郵件操作可以由RSET命令終止。在一個(gè)會(huì)話中可以有一個(gè)或多個(gè)操作。</p><p> 如果在操作開始參數(shù)不可接受,必須返回501失敗應(yīng)答,同時(shí)接收到的SMTP必須保持在與剛才一致的狀態(tài)下。如果操作中的命令順序出錯(cuò),必須返回503失敗應(yīng)答,同時(shí)接收到的SMTP必須保持在與剛才一致的狀態(tài)下。</p><p> 會(huì)話的最后一個(gè)命令必須是QUIT命令。此命令在
61、會(huì)話的其它時(shí)間不能使用。</p><p> COMMAND語(yǔ)法格式</p><p> 命令是由命令碼和其后的參數(shù)域組成的。命令碼是四個(gè)字母組成的,不區(qū)別大小寫。因?yàn)橄旅娴拿畹淖饔檬窍嗤模?lt;/p><p> MAIL Mail mail MaIl mAIl</p><p> 這對(duì)于引導(dǎo)任何參數(shù)值的標(biāo)記也是適用的,如TO和to就是一樣
62、的。命令碼和參數(shù)由一個(gè)或多個(gè)空格分開。然而在回復(fù)路徑和轉(zhuǎn)發(fā)路徑中的參數(shù)是區(qū)別大小寫的。特別是在一些主機(jī)上,"smith"和"Smith"就根本不是一個(gè)用戶。</p><p> 參數(shù)域由不定長(zhǎng)的字符串組成,它由<CRLF>結(jié)束,接收方在完全接收到此序列前不會(huì)采取任何行動(dòng)。方括號(hào)代表可選的參數(shù)域。如果不選擇的話,系統(tǒng)選擇默認(rèn)的設(shè)置。</p><
63、p> 下面是SMTP命令: HELO <SP> <domain> <CRLF> MAIL <SP> FROM:<reverse-path> <CRLF></p><p> RCPT <SP> TO:<forward-path> <CRLF></p><p> DATA &
64、lt;CRLF></p><p> RSET <CRLF></p><p> SEND <SP> FROM:<reverse-path> <CRLF></p><p> SOML <SP> FROM:<reverse-path> <CRLF></p><
65、;p> SAML <SP> FROM:<reverse-path> <CRLF></p><p> VRFY <SP> <string> <CRLF></p><p> EXPN <SP> <string> <CRLF></p><p> HEL
66、P [<SP> <string>] <CRLF></p><p> NOOP <CRLF></p><p> QUIT <CRLF></p><p> TURN <CRLF></p><p> 3.2.2 SMTP的應(yīng)答碼</p><p>
67、; 對(duì)SMTP命令的響應(yīng)是多樣的,它確定了在郵件傳輸過(guò)程中請(qǐng)求和處理的同步,也保證了發(fā)送SMTP知道接收SMTP的狀態(tài)。每個(gè)命令必須有且只有一個(gè)響應(yīng)。</p><p> SMTP響應(yīng)由三位數(shù)字組成,其后跟一些文本。數(shù)字幫助決定下一個(gè)應(yīng)該進(jìn)入的狀態(tài),而文本對(duì)人是有意義的。三位的響應(yīng)已經(jīng)包括了足夠的信息,不用再閱讀文本,文本可以直接拋棄或者傳遞給用戶。特別的是,文本是與接收和環(huán)境相關(guān)的,所以每次接收到的文本可能不
68、同。在附錄E中可以看到全部的響應(yīng)碼。正規(guī)的情況下,響應(yīng)由下面序列構(gòu)成:三位的數(shù)字,<SP>,一行文本和一個(gè)<CRLF>,或者也可以是一個(gè)多行響應(yīng)。只有EXPN和HELP命令可以導(dǎo)致多行應(yīng)答,然而,對(duì)所有命令,多行響應(yīng)都是允許的。</p><p> REPLY CODES BY FUNCTION GROUPS 500 格式錯(cuò)誤,命令不可識(shí)別(此錯(cuò)誤也包括命令行過(guò)長(zhǎng))</p>
69、<p> 501 參數(shù)格式錯(cuò)誤</p><p> 502 命令不可實(shí)現(xiàn)</p><p> 503 錯(cuò)誤的命令序列</p><p> 504 命令參數(shù)不可實(shí)現(xiàn)</p><p> 211 系統(tǒng)狀態(tài)或系統(tǒng)幫助響應(yīng)</p><p><b> 214 幫助信息</b></p>
70、;<p> 220 <domain> 服務(wù)就緒</p><p> 221 <domain> 服務(wù)關(guān)閉傳輸信道 </p><p> 421 <domain> 服務(wù)未就緒,關(guān)閉傳輸信道(當(dāng)必須關(guān)閉時(shí),此應(yīng)答可以作為對(duì)任何命令的響應(yīng))</p><p> 250 要求的郵件操作完成</p><p&
71、gt; 251 用戶非本地,將轉(zhuǎn)發(fā)向<forward-path></p><p> 450 要求的郵件操作未完成,郵箱不可用(例如,郵箱忙)</p><p> 550 要求的郵件操作未完成,郵箱不可用(例如,郵箱未找到,或不可訪問(wèn))</p><p> 451 放棄要求的操作;處理過(guò)程中出錯(cuò)</p><p> 551 用戶
72、非本地,請(qǐng)嘗試<forward-path></p><p> 452 系統(tǒng)存儲(chǔ)不足,要求的操作未執(zhí)行</p><p> 552 過(guò)量的存儲(chǔ)分配,要求的操作未執(zhí)行</p><p> 553 郵箱名不可用,要求的操作未執(zhí)行(例如郵箱格式錯(cuò)誤)</p><p> 354 開始郵件輸入,以<CRLF>.<CRLF
73、>結(jié)束</p><p><b> 554 操作失敗</b></p><p><b> 4 RFC822</b></p><p> 說(shuō)道發(fā)送和接受郵件,我們就必須不得不提RFC822了。RFC822的全稱是“ARPA因特網(wǎng)文本信件格式的標(biāo)準(zhǔn)”(Standard for the Format of ARPA In
74、ternet Text Messages)。該標(biāo)準(zhǔn)提供了郵件內(nèi)容的格式和相關(guān)語(yǔ)義。</p><p> 4.1 RFC822簡(jiǎn)單介紹</p><p> RFC822規(guī)定的電子郵件內(nèi)容全部由ASCII字符組成,就是通常所說(shuō)的文本文件,因而標(biāo)準(zhǔn)將它稱為Internet文本信件(Internet Text Messages)。</p><p> 從直觀上看,信件
75、非常簡(jiǎn)單,就是一系列由ASCII字符組成的文本行,每一行以回車換行符(“CRLF“,就是ASCII碼的13和10)結(jié)束。</p><p> 從組織上看,信件內(nèi)容結(jié)構(gòu)分為兩大部分,中間用一個(gè)空白行(只有CRLF符的行)來(lái)分隔。第一部分稱為信件的頭部(the header of the message),包括有關(guān)發(fā)送方、接收方、發(fā)送日期等信息。第二部分稱為信件的體部(Body of the message),包括信
76、件內(nèi)容的正文文本。信頭是必需的,信體是可選的,即信體可有可無(wú)。如果不存在信體,用作分隔的空白行也就不需要。在信體中,也可以有用作分隔的空白行。這樣設(shè)計(jì)的信件便于進(jìn)行語(yǔ)法分析,提取信件的基本信息。</p><p> 在RFC822中規(guī)定,信件體就是一系列的向收信人表達(dá)信息的文本行,比較簡(jiǎn)單,可以包含任意文本,并沒(méi)有附加的結(jié)構(gòu)。信件頭則具有比較復(fù)雜的結(jié)構(gòu),在下一小節(jié)中詳述。</p><p>
77、 4.2 信件的頭部</p><p> 4.2.1 信頭的一般格式</p><p> 信頭的結(jié)構(gòu)比較復(fù)雜,信頭由若干信頭字段(header field)組成,這些字段為用戶和程序提供了關(guān)于信件的信息。要了解信頭的結(jié)構(gòu)就要弄清楚各種信頭字段。</p><p> 所有的信頭字段都具有相同的語(yǔ)法結(jié)構(gòu),從邏輯上說(shuō),包括四部分,字段名(field name),緊跟
78、冒號(hào)":" (colon),后跟字段體(field body),最后以回車換行符(CRLF)終止。即</p><p> 信頭字段 = 字段名:字段體 CRLF</p><p> 字段名必須由除了冒號(hào)和空格以外的可打印US—ASCII字符(其值在33和126之間)組成,大多數(shù)字段的字段名稱由一系列字母,數(shù)字組成,中間經(jīng)常插入橫線符。字段名告訴電子郵件軟件如何翻譯該行中
79、剩下的內(nèi)容。</p><p> 字段體可以包括除了CR和LF之外的任何ASCII字符。但是其中的空格,加括號(hào)的注釋,引號(hào)和多行字段都比較復(fù)雜,另外,字段體的語(yǔ)法和語(yǔ)義依賴于字段名,每個(gè)類型的字段有特定的格式。</p><p> RFC822為信件定義了一些標(biāo)準(zhǔn)字段,并提供了用戶自行定義非標(biāo)準(zhǔn)字段的方</p><p> 4.2.2 結(jié)構(gòu)化字段和非結(jié)構(gòu)化字段&l
80、t;/p><p> 每個(gè)字段所包含的信息不同,字段大體可以分為結(jié)構(gòu)化字段和非結(jié)構(gòu)化字段。</p><p> 結(jié)構(gòu)化字段有特定的格式,由語(yǔ)法分析程序檢測(cè)。Sender 字段就是一個(gè)很好的例子,它的字段內(nèi)容是信箱, 有一個(gè)離散的結(jié)構(gòu)。</p><p> 非結(jié)構(gòu)化的字段含有任意的數(shù)據(jù),沒(méi)有固定格式。例如,Subject字段可以含有任意的文字,并且沒(méi)有固定格式。非結(jié)構(gòu)化的
81、字段數(shù)量較少,只有Subject、 Comments、擴(kuò)展字段,非標(biāo)準(zhǔn)字段、IN—Reply和References等。所有其它字段都是結(jié)構(gòu)化的。</p><p> 4.2.3 信頭字段的元素</p><p> 盡管Email信件的總體結(jié)構(gòu)非常簡(jiǎn)單,但一些信頭字段的結(jié)構(gòu)是很復(fù)雜的。下面介紹一些大多數(shù)字段共有的元素。</p><p><b> ?。?)空
82、白符</b></p><p> 像其它文本文件一樣,空白符包括空格符(ASCII碼32)和制表符Tab(ASCII碼19)。此外,行末的回車換行符CRLF也應(yīng)算是空白符。使用空白符可以對(duì)字段進(jìn)行格式化,增加它的可讀性。例如,每個(gè)字段間用CRLF來(lái)分離,在字段內(nèi)用空格來(lái)分隔字段名和字段內(nèi)容。在Subject后面的冒號(hào)和內(nèi)容之間插入空格字符,會(huì)使字段結(jié)構(gòu)更加清晰。在Email中,空白符的使用并沒(méi)有固定的
83、規(guī)則,但應(yīng)當(dāng)正確地使用,僅在需要時(shí)才使用空白符,以便接收軟件進(jìn)行語(yǔ)法分析。</p><p><b> ?。?)注解</b></p><p> 注解是由括號(hào)括起來(lái)的一系列字符,例如,(這份禮物)。注解一般用在非結(jié)構(gòu)化的信頭字段中,沒(méi)有語(yǔ)法語(yǔ)義,僅為人提供了一些附加的信息。如果在加引號(hào)的字符串中有包括在括號(hào)中的字符,那是字符串的一部分,不是注解。在解釋信件的時(shí)候,會(huì)將注
84、解忽略,可以用一個(gè)空格字符代替它們,這樣就什么也不會(huì)破壞。</p><p><b> (3)字段折疊</b></p><p> 每個(gè)信頭字段從邏輯上說(shuō)應(yīng)當(dāng)是一個(gè)由字段名、冒號(hào)、字段體和CRLF組成的單一的行,但為了書寫與顯示的方便,增加可讀性,也為了符合1000/80的行字符數(shù)的限制,可以將超過(guò)80個(gè)字符的信頭字段分為多行,即對(duì)于比較長(zhǎng)的字段,可以分割成幾行,形成
85、折疊。在結(jié)構(gòu)化和非結(jié)構(gòu)化字段中都允許折疊。通過(guò)在字段中某些點(diǎn)插入CRLF符和至少一個(gè)或多個(gè)空白字符來(lái)實(shí)現(xiàn)字段的折疊,第一行后面的行稱為信頭字段的續(xù)行。續(xù)行都以一個(gè)空白符開始,這種方法稱為折疊(folding),例如標(biāo)題字段Subject: This is a test可以表示為:</p><p> Subject: This is a test</p><p> 反之,將一個(gè)被折疊成多
86、行的信頭字段恢復(fù)到它的單行表示的過(guò)程叫做去折疊,只要簡(jiǎn)單地移除后面跟著空格的CRLF,將折疊空白符CRLF轉(zhuǎn)換成空格字符,就可以完成去折疊(unfolding)。在分析被折疊的字段的語(yǔ)法時(shí),要把一個(gè)多行的折疊字段展開為一行,根據(jù)它的非折疊的形式來(lái)分析它的語(yǔ)法與語(yǔ)義。</p><p><b> ?。?)字段大小寫</b></p><p> 字段名稱是不區(qū)分大小寫的,所
87、以Subject、subject或SUBJECT都一樣。不過(guò)字段名稱大小寫有習(xí)慣的常用形式,如主題字段的大小寫形式通常為Subject。字段體的大小寫稍微復(fù)雜點(diǎn),要視情況而定。比如Subject后面的字段體,其中的大寫可能就是縮寫的專用名詞,不能改動(dòng)。</p><p><b> 標(biāo)準(zhǔn)的信頭字段</b></p><p> 下面介紹RFC822中定義的常用的標(biāo)準(zhǔn)信頭字
88、段。</p><p> 表4.1 RFC822常用的標(biāo)準(zhǔn)信頭字段</p><p> 圖2 7 - 2表中的關(guān)鍵字表明了電子郵件借用了辦公室備忘錄中的概念和術(shù)語(yǔ):電子郵件的頭部能夠包含一行說(shuō)明應(yīng)當(dāng)接收到該備忘錄的接收方。象傳統(tǒng)的辦公室備忘錄一樣,電子郵件使用關(guān)鍵字Cc指明一個(gè)復(fù)寫副本(carbon copy).電子郵件軟件必須向Cc:后面的電子郵件地址表中的每個(gè)地址發(fā)送一份消息的副本。
89、</p><p> 傳統(tǒng)的辦公室過(guò)程要求備忘錄的發(fā)送方通知接收方副本是否傳給其它人。有時(shí)發(fā)送方希望將備忘錄的一個(gè)副本給別人而不顯示出有一個(gè)副本被發(fā)送出去。一些電子郵件系統(tǒng)提供這樣的選項(xiàng),遵循傳統(tǒng)的辦公室術(shù)語(yǔ),用盲復(fù)寫副本(blind carbon copy)來(lái)表示。創(chuàng)建消息的用戶</p><p> 在關(guān)鍵字Bcc后給出一個(gè)電子郵件地址表,指定一個(gè)或多個(gè)盲復(fù)寫副本。雖然Bcc在發(fā)送方出現(xiàn)
90、,但當(dāng)信息發(fā)送時(shí),郵件系統(tǒng)將它從消息中除去。每個(gè)接收方必須檢查頭部的To和Cc行以決定信息是直接發(fā)送還是作為盲副本發(fā)送的(有些郵件系統(tǒng)在正文部分附加信息來(lái)告訴接收者它是一個(gè)盲副本)。其它接收者不知道有哪些用戶接收到盲副本。</p><p> 電子郵件使用與傳統(tǒng)的辦公室備忘錄相同的格式和術(shù)語(yǔ):頭部包括與消息有關(guān)的信息,正文包括消息文本。電子郵件頭部的行說(shuō)明發(fā)送方、接收方、日期、主題、應(yīng)當(dāng)收到副本的人的列表。<
91、;/p><p><b> (5)擴(kuò)展字段</b></p><p> 如果想在信頭中加入RFC822中沒(méi)有規(guī)定的字段,就需要?jiǎng)?chuàng)建非標(biāo)準(zhǔn)字段。方法非常簡(jiǎn)單,只要在自定義的信頭字段名的前面使用X-前綴。RFC822將這種方法稱為擴(kuò)展字段。 事實(shí)上已經(jīng)有許多擴(kuò)展字段被廣泛應(yīng)用,但沒(méi)有標(biāo)準(zhǔn)定義。例如:</p><p><b> X-L
92、OOP字段</b></p><p> X-LOOP字段用來(lái)防止郵件的循環(huán)傳送。過(guò)濾或郵件列表處理程序,可以給它處理的每個(gè)信件增加一個(gè)X-LOOP字段,以后就可以根據(jù)這個(gè)字段中含有的特別值,判斷一個(gè)信件是否被循環(huán)傳送。如果確認(rèn)郵件發(fā)生了循環(huán),過(guò)濾或郵件列表處理程序就可以用不同的方式處理該信件。</p><p> ◆X-Mailer字段</p><p>
93、 X-Mailer字段用于指示什么樣的程序產(chǎn)生了這個(gè)信件,它是使用最廣泛的擴(kuò)展字段。產(chǎn)生郵件的軟件可以為所有發(fā)送的信件增加合適的X-Mailer字段,該字段不僅含有軟件的名稱,還包含軟件的版本號(hào)。例如軟件名為L(zhǎng)ittlefox Mailer,版本為V1.0, 可以將“X-Mailer:Littlefox Mailer V1.0”加到郵件信頭中去。</p><p> 圖2 7 - 2列出了一些在因特網(wǎng)電子郵件中
94、可以找到的普通關(guān)鍵字,以及使用它們的目的。</p><p> 關(guān)鍵字 含義</p><p> From 發(fā)送方地址</p><p> To 接收方地址</p><p> Cc 復(fù)制副本地址</p><p> Date 信息創(chuàng)建日期</p>
95、<p> Subject 信息主題</p><p> Reply-To 回復(fù)地址</p><p> X-Charset 使用的字符集(通常為ASCII)</p><p> X-Mailer 發(fā)送信息所使用的軟件</p><p> X-Sender 發(fā)送方地址的副本</p><p
96、> X-Face 經(jīng)編碼的發(fā)送方面孔的圖象</p><p> 整個(gè)系統(tǒng)的核心是收發(fā)信件的操作,因此為了方便維護(hù),以后的升級(jí),故將這兩個(gè)最主要的操作寫成類庫(kù)(.dll)的形式,以組件的形式加載到主程序中,而且其它的功能如果需要的話,也可以通過(guò)這樣的組件的形式增加到主程序中。這也體現(xiàn)了C Sharp這一新的微軟主推語(yǔ)言的方便和高校。而且這樣做也方便了我們小組的程序的順利結(jié)合。</p>
97、<p> 5 命名控件MailSend</p><p> 由于在C Sharp語(yǔ)言中,都是以命名控件來(lái)組織程序的。而所有的類都?xì)w屬于一個(gè)特定的命名空間下。需要的命名空間系統(tǒng)本身自帶了一部分,而且如果系統(tǒng)沒(méi)有你需要的命名空間的話,就可以自己編寫,本節(jié)中的這個(gè)命名空間就是由于需要而編寫的。而調(diào)用某一個(gè)類中的某個(gè)變量成員的方法就是通過(guò) 命名空間名.類名.變量成員 來(lái)訪問(wèn)的,當(dāng)然在C Sharp 中如果在
98、程序開始通過(guò)Using 命名空間名,就可以直接的象C++那樣來(lái)訪問(wèn)成員變量,可以說(shuō)相當(dāng)?shù)姆奖?,這些都會(huì)在程序中體現(xiàn)出來(lái),再次不再做過(guò)多的敘述。</p><p> 5.1 發(fā)送郵件類SmtpMail</p><p> 5.1.1 主要成員變量說(shuō)明</p><p> 1)網(wǎng)絡(luò)連接類及實(shí)例TcpClient tc</p><p> 為
99、 TCP 網(wǎng)絡(luò)服務(wù)提供客戶端連接類TcpClient實(shí)例對(duì)象tc。TcpClient 類提供了一些簡(jiǎn)單的方法,用于在同步阻塞模式下通過(guò)網(wǎng)絡(luò)來(lái)連接、發(fā)送和接收流數(shù)據(jù)。而實(shí)例化的過(guò)程也是連接SMTP服務(wù)器的過(guò)程。它的重載方法之一的兩個(gè)參數(shù)一個(gè)為服務(wù)器名稱字符串,另一個(gè)為服務(wù)器的埠。</p><p> 2)提供用于網(wǎng)絡(luò)訪問(wèn)的基礎(chǔ)數(shù)據(jù)流及其實(shí)例 NetworkStream ns</p><p>
100、 此類提供訪問(wèn)網(wǎng)絡(luò)的基礎(chǔ)數(shù)據(jù)流的方法。其中最基本也是最重要的兩個(gè)方法就是Write()和Read()方法,至于參數(shù)不再次贅述。</p><p> 3)一維字符串?dāng)?shù)組變量FilePath</p><p> 此字符串?dāng)?shù)組主要用來(lái)存放用戶選擇的附件的絕對(duì)路徑名,并在發(fā)送帶附件的郵件時(shí)用到。</p><p> 4)發(fā)送郵件所需的基本參數(shù)</p><
101、;p> 比如用于ESMTP等錄檢驗(yàn)用的用戶名、密碼,發(fā)送郵件需要的收信人,發(fā)信人地址以及主題等等在此不再贅述。</p><p> 5.1.2 主要成員函數(shù)說(shuō)明</p><p> 1)重載的構(gòu)造函數(shù) SmtpMail()</p><p> 此函數(shù)主要用于在初始化過(guò)程中,把用戶選擇的附件的路徑以參數(shù)的形式傳給FilePath。</p>&l
102、t;p> 2)添加附件的函數(shù)AddAttachment</p><p> 傳給FilePath的路徑,通過(guò)這樣一個(gè)函數(shù)就可以循環(huán)的動(dòng)態(tài)的添加到IList接口的一個(gè)對(duì)象中了,方便以后在具體的實(shí)現(xiàn)的過(guò)程中的使用。</p><p> 3)得到上傳的附件的文件流GetStream</p><p> 由于在網(wǎng)絡(luò)中的操作都是以網(wǎng)絡(luò)流的形式來(lái)實(shí)現(xiàn)的,因此先將上傳
103、的附件轉(zhuǎn)換成文件流,然后再用Write的方法把這些附件的文件流寫入到網(wǎng)絡(luò)中,來(lái)完成發(fā)送附件的操作。具體實(shí)現(xiàn)代碼如下所示:</p><p> private string GetStream(string FilePath) </p><p><b> { </b></p><p> //建立文件流對(duì)象 </p><p&
104、gt; System.IO.FileStreamFileStr=new System.IO.FileStream(FilePath,System.IO.FileMode.Open); </p><p> byte[] by=new byte[System.Convert.ToInt32(FileStr.Length)]; </p><p> FileStr.Read(by,0,by
105、.Length); </p><p> FileStr.Close(); </p><p> return(System.Convert.ToBase64String(by)); </p><p><b> }</b></p><p> 4)將字符串編碼為Base64字符串的函數(shù)Base64Encode<
106、/p><p> 由于ESMTP的LOGIN認(rèn)證機(jī)制是采用Base64編碼,當(dāng)用戶發(fā)出AUTHLOGIN的命令后,服務(wù)器返回334的應(yīng)答碼等待用戶輸入。如果身份確認(rèn)后服務(wù)器返回235的應(yīng)答碼,否則返回失敗信息。所以要將用戶名和密碼轉(zhuǎn)換成Base64編碼然后再發(fā)給服務(wù)器。此函數(shù)的作用就是把給定的字符串轉(zhuǎn)換成相應(yīng)的Base64編碼的字符串。</p><p> 5)發(fā)送SMTP命令的函數(shù)Sen
107、dCommand</p><p> 這個(gè)函數(shù)的作用是把SMTP命令的字符串轉(zhuǎn)換成對(duì)應(yīng)的字節(jié)型值(C#中規(guī)定的Write方法只能寫入字節(jié)型的數(shù)據(jù))然后寫入網(wǎng)絡(luò)中,如果操作成功就返回一個(gè)標(biāo)志為真的布爾型變量,如果操作失敗或者發(fā)生異常就返回標(biāo)志為假的布爾型變量。具體代碼如下所示:</p><p> private bool SendCommand(string str) </p>
108、<p><b> { </b></p><p><b> //定義一個(gè)數(shù)組</b></p><p> byte[] WriteBuffer; </p><p> //設(shè)定一個(gè)布爾類型的變量</p><p> bool state=false; </p><
109、p> WriteBuffer = Encoding.Default.GetBytes(str);</p><p> //加入防錯(cuò)機(jī)制,可以有效提高程序運(yùn)行的效率和捕獲出錯(cuò)信息</p><p><b> try</b></p><p><b> {</b></p><p> //向網(wǎng)絡(luò)
110、中寫入數(shù)據(jù)</p><p> ns.Write(WriteBuffer,0,WriteBuffer.Length); </p><p> state=true;</p><p><b> }</b></p><p> catch(Exception ex)</p><p><b>
111、; {</b></p><p><b> //返回出錯(cuò)信息</b></p><p> MessageBox.Show (ex.ToString ());</p><p> state=false;</p><p><b> }</b></p><p>&
112、lt;b> //返回標(biāo)志位</b></p><p> return state; </p><p><b> }</b></p><p> 6)接受服務(wù)器應(yīng)答的函數(shù)RecvResponse</p><p> 它的作用就是從網(wǎng)絡(luò)流中讀取服務(wù)器返回的字節(jié)型的信息,將其轉(zhuǎn)換成字符串型的變量,然后
113、將其返回,可以通過(guò)其返回值來(lái)判斷操作是否成功。具體實(shí)現(xiàn)代碼如下所示:</p><p> private string RecvResponse() </p><p><b> { </b></p><p> int StreamSize=0; </p><p> string ReturnValue ="
114、;"; </p><p> //定義一個(gè)字節(jié)型的數(shù)組</p><p> byte[] ReadBuffer = new byte[1024] ; </p><p><b> try </b></p><p><b> { </b></p><p> //從
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 電子郵件客戶端畢業(yè)論文
- 畢業(yè)論文--電子郵件客戶端軟件(含全套資料)
- 畢業(yè)設(shè)計(jì)---電子郵件客戶端軟件
- 畢業(yè)設(shè)計(jì)---電子郵件客戶端軟件
- 畢業(yè)論文--電子郵件客戶端軟件(含全套資料).doc
- 畢業(yè)設(shè)計(jì)---電子郵件客戶端軟件
- 開題報(bào)告---電子郵件客戶端軟件
- 開題報(bào)告--電子郵件客戶端軟件
- c#電子郵件客戶端軟件
- 畢業(yè)設(shè)計(jì)---電子郵件客戶端軟件.doc
- 開題報(bào)告---電子郵件客戶端軟件
- 畢業(yè)設(shè)計(jì)---電子郵件客戶端軟件.doc
- 畢業(yè)設(shè)計(jì)---電子郵件客戶端軟件1
- 電子郵件客戶端軟件設(shè)計(jì)畢業(yè)設(shè)計(jì)
- 開題報(bào)告---電子郵件客戶端軟件.doc
- 開題報(bào)告---電子郵件客戶端軟件.doc
- 開題報(bào)告--電子郵件客戶端軟件.doc
- 實(shí)驗(yàn)2 電子郵件客戶端的設(shè)置
- 課程設(shè)計(jì)---電子郵件客戶端發(fā)送功能
- 電子郵件檢測(cè)軟件的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
評(píng)論
0/150
提交評(píng)論