電子郵件系統(tǒng)的設(shè)計(jì)與開發(fā)_第1頁
電子郵件系統(tǒng)的設(shè)計(jì)與開發(fā)_第2頁
電子郵件系統(tǒng)的設(shè)計(jì)與開發(fā)_第3頁
電子郵件系統(tǒng)的設(shè)計(jì)與開發(fā)_第4頁
電子郵件系統(tǒng)的設(shè)計(jì)與開發(fā)_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、山東農(nóng)業(yè)大學(xué)畢業(yè)論文 題目: 電子郵件系統(tǒng)的設(shè)計(jì)與開發(fā) 院 部信息學(xué)院專業(yè)班級(jí)計(jì)算機(jī)科學(xué)與技術(shù) 04級(jí)7班屆 次2021屆學(xué)生姓名李康男學(xué) 號(hào)2004160839指導(dǎo)教師姜紅花 二八年六月中英文摘要第一章 電子郵件的開展背景和意義 電子郵件翻譯自英文的E-mail,它表示通過電子通訊系統(tǒng)進(jìn)行信件的書寫、發(fā)送和接收。30多年前,人們創(chuàng)造了電子郵件這種便捷的信息傳遞方式,這是人類通信歷史上的一次革命。電子郵件的興起是在20世紀(jì)80年代,70年代的寂靜主要是因?yàn)楫?dāng)時(shí)使用Arpanet網(wǎng)絡(luò)的人太少,網(wǎng)絡(luò)的速度也僅為目前56Kbps標(biāo)準(zhǔn)速度的二十分之一。受網(wǎng)絡(luò)速度的限制,那時(shí)的用戶只能發(fā)送些簡單的信息,

2、根本無法象現(xiàn)在這樣發(fā)送大量照片;到80年代中期,個(gè)人電腦興起,電子郵件開始在電腦迷以及大學(xué)生中廣泛傳播開來;到90年代中期,隨著計(jì)算機(jī)技術(shù)的開展,出現(xiàn)了功能強(qiáng)大的Internet。在Internet眾多的效勞功能中,電子郵件E-mail就是其強(qiáng)大功能中的一個(gè)。自此,電子郵件被廣為使用。今天使用的最多的通訊系統(tǒng)是互聯(lián)網(wǎng),同時(shí)電子郵件也是互聯(lián)網(wǎng)上最受歡送的功能之一。通過電子郵件系統(tǒng),您可以用非常低廉的價(jià)格,以非常快速的方式,與世界上任何一個(gè)角落的網(wǎng)絡(luò)用戶聯(lián)絡(luò)系,這些電子郵件可以是文字、圖象、聲音等各種方式。同時(shí),您可以得到大量免費(fèi)的新聞、專題郵件,并實(shí)現(xiàn)輕松的信息搜索。這是任何傳統(tǒng)的方式也無法相比

3、的。正是由于電子郵件的使用簡易、投遞迅速、收費(fèi)低廉,易于保存、全球暢通無阻,使得電子郵件被廣泛地應(yīng)用,它使人們的交流方式得到了極大的改變。 隨著網(wǎng)絡(luò)越來越普及,現(xiàn)在已經(jīng)是人人一個(gè)電子郵箱甚至有多個(gè)電子郵箱。在Internet上使用最多的效勞當(dāng)屬電子郵件效勞了??梢?,電子郵件與人們的工作、學(xué)習(xí)和生活息息相關(guān),它已經(jīng)深深的融入到每個(gè)人的生活中,生活在這個(gè)網(wǎng)絡(luò)時(shí)代的人是不可能沒有電子郵箱的。電子郵箱已經(jīng)由以前科技工作者用于科技信息交流轉(zhuǎn)變到現(xiàn)在大多數(shù)人用來進(jìn)行日常生活工作學(xué)習(xí)的交流工具。同時(shí),電子郵箱的功能也發(fā)生了翻天覆地的變化。由原來只能收發(fā)文本到現(xiàn)在的收發(fā)多媒體文件。簡化郵件的編碼,減少編碼造成

4、的數(shù)據(jù)冗余。這些都得宜于與電子郵箱有關(guān)的網(wǎng)絡(luò)協(xié)議的開展和有關(guān)硬件的改良。 現(xiàn)在我們每天都習(xí)慣于通過E-mail進(jìn)行交流,各大網(wǎng)站也幾乎都推出了自己的基于WEB的免費(fèi)郵件系統(tǒng)。電子郵件已無可爭議的地成為互聯(lián)網(wǎng)上最受用戶歡送的效勞。郵件的平安也逐漸受到人們的重視。至今已出現(xiàn)了各種平安保障措施來加強(qiáng)E-mail的平安性。隨著電子郵件效勞的完善和平安性的不斷提高。電子郵件毫無疑問將在人類的通信史上占有一席之地。如同其他的網(wǎng)絡(luò)效勞,電子郵件系統(tǒng)也有其使用的傳輸協(xié)議,包括SMTPSimple Mail Transfer Protocol,簡單郵件傳輸協(xié)議、POPPost Office Protocol,郵

5、局協(xié)議和IMAPInternet Message Access Protocal消息訪問協(xié)議等,這些協(xié)議應(yīng)用于電子郵件的發(fā)送和接收。一些郵件處理軟件如OutLook Express和FoxMail等就是按照SMTP和POP3 協(xié)議結(jié)合Windows Sockets套接字進(jìn)行設(shè)計(jì)來收發(fā)郵件的。第二章 電子郵件收發(fā)原理及相關(guān)技術(shù) 本章簡單介紹了SMTP協(xié)議,POP3協(xié)議的工作原理。只有較深入的掌握了這兩個(gè)協(xié)議的主要內(nèi)容,才能理解基于SMTP,POP3的郵件收發(fā)系統(tǒng)是怎樣工作。2.1 SMTP協(xié)議簡介2.1.1 SMTP協(xié)議原始命令碼和工作原理SMTP(Simple Mail Transfer Pr

6、otocol)即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)那么,或者說是由它來控制信件傳輸?shù)囊环N中轉(zhuǎn)方式。SMTP協(xié)議屬于TCP/IP協(xié)議族,它幫助每臺(tái)計(jì)算機(jī)在發(fā)送或中轉(zhuǎn)信件時(shí)找到下一個(gè)目的地。通過SMTP協(xié)議所指定的效勞器,我們就可以把Email寄到收信人的效勞器上了,整個(gè)過程只要幾分鐘。SMTP效勞器那么是遵循SMTP協(xié)議的發(fā)送郵件效勞器,用來發(fā)送或中轉(zhuǎn)電子郵件。(1)SMTP協(xié)議的通信模型 首先針對(duì)用戶發(fā)出的郵件請求,由發(fā)送SMTP建立一條連接到接收SMTP的雙工通訊鏈路,這里的接收SMTP是相對(duì)于發(fā)送SMTP而言的,實(shí)際上它既可以是最終的接收者也可以是中間傳送者。發(fā)送

7、SMTP負(fù)責(zé)向接收SMTP發(fā)送SMTP命令,而接收SMTP那么負(fù)責(zé)接收并反應(yīng)應(yīng)答。 文件系統(tǒng)發(fā)送SMTP接受SMTPSMTP命令郵件內(nèi)容文件系統(tǒng)用戶應(yīng)答圖2-1 SMTP協(xié)議通信模型示意圖(2)SMTP協(xié)議的命令和應(yīng)答從前面的通訊模型可以看出SMTP協(xié)議在發(fā)送SMTP和接收SMTP之間的會(huì)話是靠發(fā)送SMTP的SMTP命令和接收SMTP反應(yīng)的應(yīng)答來完成的。在通訊鏈路建立后,發(fā)送SMTP發(fā)送MAIL FROM:命令指令郵件發(fā)送者,假設(shè)接收SMTP此時(shí)可以接收郵件那么作出OK的應(yīng)答,然后發(fā)送SMTP繼續(xù)發(fā)出RCPT命令以確認(rèn)郵件是否收到,如果接收到就作出OK的應(yīng)答,否那么就發(fā)出拒絕接收應(yīng)答,但這并不

8、會(huì)對(duì)整個(gè)郵件操作造成影響。雙方如此反復(fù)屢次,直至郵件處理完畢。SMTP協(xié)議共包含10個(gè)SMTP命令,列表如下:- 表2-1 SMTP命令 命令說明-HELLO domainCRLF 識(shí)別發(fā)送方到接收SMTP的一個(gè)HELLO命令 MAIL FROM:reverse-pathCRLF reverse-path 為發(fā)送者地址。此命令告訴接收方一個(gè)新郵件發(fā)送的開始并對(duì)所有的狀態(tài)和緩沖區(qū)進(jìn)行初始化。此命令開始一個(gè)郵件傳 輸處理最終完成將郵件數(shù)據(jù)傳送到一個(gè)或多個(gè)郵箱中。 RCPT TO:forward-pathCRLF 標(biāo)識(shí)各個(gè)郵件接收者的地址 DATA CRLF 接收SMTP將把其后的行為看作郵件數(shù)據(jù)去

9、處理,以CRLF.CRLF標(biāo)識(shí)數(shù)據(jù)的結(jié)尾。 REST CRLF 退出/復(fù)位當(dāng)前的郵件傳輸 NOOP CRLF 要求接收SMTP僅做OK應(yīng)答。用于測試 QUIT CRLF 要求接收SMTP返回一個(gè)OK應(yīng)答并關(guān)閉傳輸。 VRFY string CRLF 驗(yàn)證指定的郵箱是否存在,由于平安因素,效勞器多禁止此命令。 EXPN string CRLF 驗(yàn)證給定的郵箱列表是否存在,擴(kuò)充郵箱列表,也常禁止使用。 HELP CRLF 查詢效勞器支持什么命令 VRFY CRLF 用于驗(yàn)證給定的用戶郵箱是否存在,以及接收關(guān)于該用戶的詳細(xì)信息。EXPN CRLF 用于擴(kuò)充郵件列表。-注:CRLF為回車、換行,ASC

10、II碼分別為13、10十進(jìn)制。- MAILFROM命令中指定的地址是稱作envelopefrom地址,不需要和發(fā)送者自己的地址是一致的。RCPTTO與之等同,指明的接收者地址稱為envelopeto地址,而與實(shí)際的to:行是什么無關(guān)。郵件被分為信封局部,信頭局部和信體局部envelopefrom,envelopeto與messagefrom:,messageto:完全不相干。evnelope是由效勞器主機(jī)間SMTP后臺(tái)提供的,而messagefrom/to是由用戶提供的。有無冒號(hào)也是區(qū)別。SMTP協(xié)議的每一個(gè)命令都會(huì)返回一個(gè)應(yīng)答碼,應(yīng)答碼的每一個(gè)數(shù)字都是有特定含義的,如第一位數(shù)字為2時(shí)表示命令

11、成功;為5表失?。?表沒有完成。一些較復(fù)雜的郵件程序利用該特點(diǎn),首先檢查應(yīng)答碼的首數(shù)字,并根據(jù)其值來決定下一步的動(dòng)作。下面將SMTP的應(yīng)答碼列表如下:- 表2-2 應(yīng)答碼說明-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效勞就緒 221 domain效勞關(guān)閉 421 domain效勞未就緒,關(guān)閉傳輸信道 250 要求的郵件操作完成 251 用戶非本地,將轉(zhuǎn)發(fā)向forward-path 450 要求的郵件操作未完成,郵箱不可用 例如,郵箱忙550 要求的郵件操作未完成,郵箱不可

12、用 例如,郵箱未找到,或不可訪問451 放棄要求的操作;處理過程中出錯(cuò) 551 用戶非本地,請嘗試forward-path 452 系統(tǒng)存儲(chǔ)缺乏,要求的操作未執(zhí)行 552 過量的存儲(chǔ)分配,要求的操作未執(zhí)行 553 郵箱名不可用,要求的操作未執(zhí)行 354 開始郵件輸入,以"."結(jié)束 554 操作失敗 3SMTP協(xié)議工作原理SMTP協(xié)議規(guī)定的命令是以明文方式進(jìn)行的。SMTP工作在兩種情況下:一是電子郵件從客戶機(jī)傳輸?shù)叫谄鳎欢菑哪骋粋€(gè)效勞器傳輸?shù)搅硪粋€(gè)效勞器。SMTP是個(gè)請求/響應(yīng)協(xié)議,命令和響應(yīng)都是基于ASCII文本,并以CR和LF符結(jié)束。響應(yīng)包括一個(gè)表示返回狀態(tài)的三位數(shù)字

13、代碼。SMTP效勞器在TCP協(xié)議25號(hào)端口監(jiān)聽連接請求。連接和發(fā)送過程如下: a.建立TCP連接 b.客戶端發(fā)送HELO命令以標(biāo)識(shí)發(fā)件人自己的身份,然后客戶端發(fā)送MAIL命令效勞器端正希望以O(shè)K作為響應(yīng),說明準(zhǔn)備接收。 c.客戶端發(fā)送RCPT命令,以標(biāo)識(shí)該電子郵件的方案接收人,可以有多個(gè)RCPT行。效勞器端那么表示是否愿意為收件人接受郵件。 d.協(xié)商結(jié)束,發(fā)送郵件,用命令DATA發(fā)送。 e.以.表示結(jié)束輸入內(nèi)容一起發(fā)送出去。 f.結(jié)束此次發(fā)送,用QUIT命令退出。2.1.2 SMTP協(xié)議的會(huì)話流程在進(jìn)行程序設(shè)計(jì)之前有必要弄清SMTP協(xié)議的會(huì)話流程,其實(shí)前面介紹的內(nèi)容已經(jīng)可以大致勾勒出用SMTP

14、發(fā)送郵件的框架了,對(duì)于一次普通的郵件發(fā)送,其過程大致為:先建立TCP連接,隨后客戶端發(fā)出HELLO命令以標(biāo)識(shí)發(fā)件人自己的身份,并繼續(xù)由客戶端發(fā)送MAIL命令,如效勞器應(yīng)答為"OK",可繼續(xù)發(fā)送RCPT命令來標(biāo)識(shí)電子郵件的收件人,在這里可以有多個(gè)RCPT行,而效勞器端那么表示是否愿意為收件人接受該郵件。在雙方協(xié)商結(jié)束后,用命令DATA將郵件發(fā)送出去,其中對(duì)表示結(jié)束的"."也一并發(fā)送出去。隨后結(jié)束本次發(fā)送過程,以QUIT命令退出。下面通過一個(gè)實(shí)例,從langruisohu 發(fā)送郵件到renpingsina 來更詳細(xì)直觀地描述此會(huì)話流程:S;SENDER R:

15、RECIEVORs: 建立連接R:220 sina Simple Mail Transfer Service Ready S:HELLO sohu /客戶端發(fā)出HELLO命令以標(biāo)識(shí)發(fā)件人自己的身份R:250 sina S:MAIL FROM:langruisohu /客戶端發(fā)送MAIL命令R:250 OK /250 要求的郵件操作完成S:RCPT TO:renpingsina /發(fā)送RCPT命令來標(biāo)識(shí)電子郵件的收件人,在這里可以有多個(gè)RCPT行R:250 OK /250 效勞器端那么表示是否愿意為收件人接受該郵件S:DATA /命令DATA將郵件發(fā)送出去R:354 Start mail inp

16、ut;end with "CRLF.CRLF"S: Blah blah blah.S: .等等S: <CRLF>.<CRLF>R:250 OKS:QUITR:221 sina Service closing transmission channel 2.2 POP3協(xié)議2.2.1 POP3協(xié)議用于電郵接收的工作模式和原理 POP的全稱是 Post Office Protocol,即郵局協(xié)議,用于電子郵件的接收,它使用TCP的110端口。現(xiàn)在常用的是第三版 ,所以簡稱為 POP3。POP3仍采用Client/Server工作模式,Client被稱為客戶

17、端,Server是效勞器端。 應(yīng)用層協(xié)議建立在網(wǎng)絡(luò)層協(xié)議之上,相應(yīng)的軟件會(huì)調(diào)用應(yīng)用層的相應(yīng)協(xié)議。如當(dāng)翻開Foxmail這個(gè)郵件軟件收取郵件時(shí),F(xiàn)oxmail這個(gè)軟件就會(huì)調(diào)用TCP/IP參考模型中的應(yīng)用層協(xié)議-POP協(xié)議。POP這個(gè)應(yīng)用層的協(xié)議會(huì)指揮TCP協(xié)議,利用IP協(xié)議將一封大郵件拆分成假設(shè)干個(gè)數(shù)據(jù)包在Internet上傳送。(1)POP3標(biāo)準(zhǔn)命令 這個(gè)協(xié)議只包含12個(gè)命令其中有3個(gè)完全可以忽略它們的存在。這些命令被客戶端計(jì)算機(jī)用來發(fā)送給遠(yuǎn)程效勞器。反過來,效勞器返回給客戶端計(jì)算機(jī)兩個(gè)回應(yīng)代碼。POP3命令由一個(gè)命令和一些參數(shù)組成。所有命令以一個(gè)CRLF對(duì)結(jié)束。命令和參數(shù)由可打印的ASCII

18、字符組成,它們之間由空格間隔。命令一般是三到四個(gè)字母,每個(gè)參數(shù)卻可達(dá)40個(gè)字符長。POP3效勞器響應(yīng)由一個(gè)狀態(tài)碼和一個(gè)可能跟有附加信息的命令組成。不同效勞器的回應(yīng)會(huì)有所不同,但開頭局部都是一樣的所有響應(yīng)也是由CRLF對(duì)結(jié)束?,F(xiàn)在有兩種狀態(tài),"確定"("+OK")和"失敗"("-ERR")。-表2-3 POP3標(biāo)準(zhǔn)命令(2) POP工作原理簡介下面簡單介紹一下電子郵件軟件收取電子郵件的過程,一般我們在電子郵件軟件的賬號(hào)屬性上設(shè)置一個(gè)POP效勞器的URL(Uniform Resource Locator )比方pop.

19、163 ,以及郵箱的賬號(hào)和密碼。當(dāng)我們按下電子郵件軟件中的收取鍵后,電子郵件軟件首先會(huì)調(diào)用DNS(Domain Name Server)協(xié)議對(duì)POP效勞器進(jìn)行解析IP地址,當(dāng)IP地址被解析出來后,郵件程序便開始使用TCP協(xié)議連接郵件效勞器的110端口,因?yàn)镻OP效勞器是比擬忙的,所以在這個(gè)過程中我們相對(duì)要等比擬長的時(shí)間。當(dāng)郵件程序成功地連上POP效勞器后,其先會(huì)使用USER命令將郵箱的賬號(hào)傳給POP效勞器,然后再使用PASS命令將郵箱的賬號(hào)傳給效勞器,當(dāng)完成這一認(rèn)證過程后,郵件程序使用STAT命令請求效勞器返回郵箱的統(tǒng)計(jì)資料,比方郵件總數(shù)和郵件大小等,然后LIST便會(huì)列出效勞器里郵件數(shù)量。然后

20、郵件程序就會(huì)使用RETR命令接收郵件,接收一封后便使用DELE命令將郵件效勞器中的郵件置為刪除狀態(tài)。當(dāng)使用QUIT時(shí),郵件效勞器便會(huì)將置為刪除標(biāo)志的郵件給刪了。通俗地講,郵件程序從效勞器接收郵件,其實(shí)就是一個(gè)對(duì)話過程,POP協(xié)議就是用于電子郵件的一門語言。 3 POP3會(huì)話的3個(gè)狀態(tài) a."確認(rèn)"狀態(tài)首先TCP連接由POP3客戶翻開,POP3效勞器發(fā)送一個(gè)單行確實(shí)認(rèn)。這個(gè)消息可以是由CRLF結(jié)束的任何字符。例如,它可以是:S:+OKPOP3serverready此時(shí)POP3會(huì)話就進(jìn)入了"確認(rèn)"狀態(tài)。此時(shí),客戶必須向效勞器證明它的身份。在此介紹兩種可能的處

21、理機(jī)制,一種是USER和PASS命令,另一種是在后面要介紹的APOP命令用USER和PASS命令進(jìn)行確認(rèn)過程,客戶必須首先發(fā)送USER命令,如果POP3效勞器以"確認(rèn)"狀態(tài)碼響應(yīng),客戶就可以發(fā)送PASS命令以完成確認(rèn),或者發(fā)送QUIT命令終止POP3會(huì)話。如果POP3效勞器返回"失敗"狀態(tài)碼,客戶可以再發(fā)送確認(rèn)命令,或者發(fā)送QUIT命令。當(dāng)客戶發(fā)送了PASS命令后,效勞器根據(jù)USER和PASS命令的附加信息決定是否允許訪問相應(yīng)的存儲(chǔ)郵件。一旦效勞器通過這些數(shù)據(jù)決定允許客戶訪問儲(chǔ)存郵件,效勞器會(huì)在郵件上加上排它鎖,以防止在進(jìn)入"更新"狀

22、態(tài)前對(duì)郵件的改變。如果成功獲得了排它鎖,效勞器返回一個(gè)"確認(rèn)"狀態(tài)碼。會(huì)話進(jìn)入"操作狀態(tài)",同時(shí)沒有任何郵件被標(biāo)記為刪除。如果郵件因?yàn)槟撤N原因不能翻開例如,排它鎖不能獲得,客戶不能訪問相應(yīng)的郵件或者郵件不能進(jìn)行語法分析,效勞器將返回"失敗"狀態(tài)碼。在返回"失敗"狀態(tài)碼后,效勞器會(huì)關(guān)閉連接。如果效勞器沒有關(guān)閉連接,客戶可以重新發(fā)送確認(rèn)命令,重新開始,或者發(fā)送QUIT命令。在效勞器翻開郵件后,它為每個(gè)消息指定一個(gè)消息號(hào),并以八進(jìn)制表示每個(gè)消息的長度。第一個(gè)消息被指定為1,第二個(gè)消息被指定為2,以此類推,第N個(gè)消息被指定

23、為N。在POP3命令和響應(yīng)中,所以的消息號(hào)和長度以十進(jìn)制表示。下面是在"確認(rèn)"狀態(tài)中可用的命令:USER username;PASS password; QUIT b."操作"狀態(tài)一旦客戶向效勞器成功地確認(rèn)了自己的身份,效勞器將鎖住并翻開相應(yīng)的郵件,這時(shí)POP3會(huì)話進(jìn)入"操作"狀態(tài)?,F(xiàn)在客戶可以重復(fù)下面的POP3命令,對(duì)于每個(gè)命令效勞器都會(huì)返回應(yīng)答。最后,客戶發(fā)送QUIT命令,會(huì)話進(jìn)入"更新"狀態(tài)。下面是在"操作"狀態(tài)中可用的命令:STAT;LISTmsg;RETRmsg;DELEmsg;NOO

24、P;RSET; TOPmsgn;UIDLmsg c."更新"狀態(tài)當(dāng)客戶在"操作"狀態(tài)下發(fā)送QUIT命令后,會(huì)話進(jìn)入"更新"狀態(tài)。注意:如果客戶在"確認(rèn)"狀態(tài)下發(fā)送QUIT后,會(huì)話并不進(jìn)入"更新"狀態(tài)。如果會(huì)話因?yàn)镼UIT命令以外的原因中斷,會(huì)話并不進(jìn)入"更新"狀態(tài),也不從效勞器中刪除任何信件。QUIT在"更新"狀態(tài)有效。; 可選的POP3命令:APOPnamedigest在"確認(rèn)"狀態(tài)有效 TOPmsgn; UIDLmsg在"

25、操作"狀態(tài)有效 注:除了STAT,LIST和UIDL的響應(yīng)外,其它命令的響應(yīng)均為"+OK"和"-ERR"。響應(yīng)后的所有文本將被客戶略去。2.2.2 POP3會(huì)話流程S:<等待連接到TCP端口110>C:<翻開連接>S:+OKPOP3serverreadyC:USER usernameS:+OKC:PASS passwordS:+OKC:STAT /請求效勞器發(fā)回關(guān)于郵箱的統(tǒng)計(jì)資料,如郵件總數(shù)和總字節(jié)數(shù)S:+OK2320C:LIST /返回郵件數(shù)量和每個(gè)郵件的大小S:+OK2messages(320octets)S:112

26、0S:2200S:.C:RETR1 /回由參數(shù)標(biāo)識(shí)的郵件的全部文本S:+OK.S:<效勞器發(fā)送信件1>S:C:DELE1S:+OKmessage1deletedC:QUITS:+OKdeweyPOP3serversigningoff(maildropempty)C:<關(guān)閉連接>S:<等待下一次連接>2.3 RFC822簡介 電子郵件是全世界通用的。你可以給任何一個(gè)人發(fā)送電子郵件而不用考慮他所處的地理位置在哪或他使用的是什么軟件作為郵件接受客戶端。和其他與Internet相關(guān)的事物一樣或者可以說,與計(jì)算機(jī)技術(shù)相關(guān)的事物,電子郵件也是基于一種標(biāo)準(zhǔn)的,而人們把這個(gè)

27、特殊的標(biāo)準(zhǔn)稱作RFC 822。這個(gè)標(biāo)準(zhǔn)早在二十多年前準(zhǔn)確的日期是一九八二年八月十三日就公布于世,在這期間它根本沒有改變。在2001年公布的RFC 2822標(biāo)準(zhǔn)取代了RFC 822,但是它的根本內(nèi)容和RFC 822是完全一致的,只是做了一些很小的更新和改動(dòng)。而其他的一些郵件標(biāo)準(zhǔn),比方RFC 850在USENET上使用,同樣也基于RFC 822標(biāo)準(zhǔn)。RFC,Request For Comments 2.4 Winsock簡介 許多網(wǎng)絡(luò)程序都是采用Socket套接字實(shí)現(xiàn)的,對(duì)于一些標(biāo)準(zhǔn)的網(wǎng)絡(luò)協(xié)議如HTTP、FTP和SMTP等協(xié)議的編程也是基于套接字程序的,只是端口號(hào)不再是隨意設(shè)定而要由協(xié)議來指定,比

28、方HTTP端口在80、FTP是21,而SMTP那么是25。Socket只是提供在指定的端口上同指定的效勞器從事網(wǎng)絡(luò)上的通訊能力,至于客戶和效勞器之間是如何通訊的那么由網(wǎng)絡(luò)協(xié)議來規(guī)定,這對(duì)于套接字是完全透明的。因此可以由Socket套接字為SMTP提供網(wǎng)絡(luò)通訊根底,而對(duì)于網(wǎng)絡(luò)通訊連路建立好之后采取什么樣的通訊應(yīng)答那么要按SMTP協(xié)議的規(guī)定去執(zhí)行了。本科題為方便起見,沒有采用編寫較復(fù)雜的Windows Sockets API進(jìn)行編程,而是使用經(jīng)過較好封裝的MFC 的CSocket類。2.5 MFC簡介 MFC (Microsoft Foundation Class Library)中的各種類結(jié)合起

29、來構(gòu)成了一個(gè)應(yīng)用程序框架,它的目的就是讓程序員在此根底上來建立Windows下的應(yīng)用程序,這是一種相對(duì)SDK來說更為簡單的方法。因?yàn)榭傮w上,MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,程序員所要做的就是通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個(gè)輪廓。Microsoft Visual C+提供了相應(yīng)的工具來完成這個(gè)工作:AppWizard可以用來生成初步的框架文件代碼和資源等;資源編輯器用于幫助直觀地設(shè)計(jì)用戶接口;ClassWizard用來協(xié)助添加代碼到框架文件;最后,編譯,那么通過類庫實(shí)現(xiàn)了應(yīng)用程序特定的邏輯。 MFC封裝了Win32 API,OLE API,ODBC

30、 API等底層函數(shù)的功能,并提供更高一層的接口,簡化了Windows編程。同時(shí),MFC支持對(duì)底層API的直接調(diào)用。 MFC提供了一個(gè)Windows應(yīng)用程序開發(fā)模式,對(duì)程序的控制主要是由MFC框架完成的,而且MFC也完成了大局部的功能,預(yù)定義或?qū)崿F(xiàn)了許多事件和消息處理,等等。框架或者由其本身處理事件,不依賴程序員的代碼;或者調(diào)用程序員的代碼來處理應(yīng)用程序特定的事件。 MFC是C+類庫,程序員就是通過使用、繼承和擴(kuò)展適當(dāng)?shù)念悂韺?shí)現(xiàn)特定的目的。例如,繼承時(shí),應(yīng)用程序特定的事件由程序員的派生類來處理,不感興趣的由基類處理。實(shí)現(xiàn)這種功能的根底是C+對(duì)繼承的支持,對(duì)虛擬函數(shù)的支持,以及MFC實(shí)現(xiàn)的消息映射

31、機(jī)制。第三章 電子郵件系統(tǒng)的設(shè)計(jì)和開發(fā)本章首先對(duì)SMTP協(xié)議,POP3協(xié)議的工作流程作了詳細(xì)的分析,然后按照SMTP和POP3 協(xié)議結(jié)合Windows Sockets套接字進(jìn)行設(shè)計(jì)實(shí)現(xiàn)代碼并封裝成CSMTP協(xié)議類和CPOP3協(xié)議類。最后根據(jù)客戶端的根本需求設(shè)計(jì)成客戶端郵件收發(fā)軟件,并以友好的界面形式呈現(xiàn)出來。3.1 效勞器端作用簡介SMTP,POP3采用Client/Server工作模式,Client被稱為客戶端,一般我們?nèi)粘J褂秒娔X都是作為客戶端,而Server效勞器那么是網(wǎng)管人員進(jìn)行管理的。SMTP效勞器的主要功能就是接收來自客戶端的SMTP協(xié)議命令,然后對(duì)這些命令進(jìn)行解析,根據(jù)不同的命令

32、進(jìn)行不同的處理,處理完成之后,將結(jié)果發(fā)送給客戶端。圖要作說明serverclientclientclient 圖3-1 Client/Server工作模式示意圖 以下用簡單的流程圖來分別示范SMTP,POP3的效勞器端與他們對(duì)應(yīng)的客戶端的會(huì)話: 圖3-2 SMTP會(huì)話流程示意圖如圖示,連接和發(fā)送過程如下: a.建立TCP連接 b.客戶端發(fā)送HELO命令以標(biāo)識(shí)發(fā)件人自己的身份,然后客戶端發(fā)送MAIL命令效勞器端正希望以O(shè)K作為響應(yīng),說明準(zhǔn)備接收。 c.客戶端發(fā)送RCPT命令,以標(biāo)識(shí)該電子郵件的方案接收人,可以有多個(gè)RCPT行。效勞器端那么表示是否愿意為收件人接受郵件。 d.協(xié)商結(jié)束,發(fā)送郵件,用

33、命令DATA發(fā)送。 e.以.表示結(jié)束輸入內(nèi)容一起發(fā)送出去。 f.結(jié)束此次發(fā)送,用QUIT命令退出。 圖3-2 POP3會(huì)話流程示意圖如圖示,當(dāng)郵件程序成功地連上POP效勞器后,其先會(huì)使用USER命令將郵箱的賬號(hào)傳給POP效勞器,然后再使用PASS命令將郵箱的賬號(hào)傳給效勞器,當(dāng)完成這一認(rèn)證過程后,郵件程序使用STAT命令請求效勞器返回郵箱的統(tǒng)計(jì)資料,比方郵件總數(shù)和郵件大小等,然后LIST便會(huì)列出效勞器里郵件數(shù)量。然后郵件程序就會(huì)使用RETR命令接收郵件,也可在接收一封后便使用DELE命令將郵件效勞器中的郵件置為刪除狀態(tài)。當(dāng)使用QUIT時(shí),郵件效勞器便會(huì)將置為刪除標(biāo)志的郵件給刪了。3.2 客戶端程

34、序設(shè)計(jì)本節(jié)主要介紹客戶端的實(shí)現(xiàn)。本人選擇使用VC+6.0來實(shí)現(xiàn)本系統(tǒng)的客戶端,VC+6.0是使用面向?qū)ο笳Z言C+的開發(fā)環(huán)境,更有利于集中精力于主要功能的實(shí)現(xiàn)。由圖3-2,圖3-3可以明顯看出客戶端需完成的任務(wù):1發(fā)送SMTP命令,處理相應(yīng)效勞器的響應(yīng),將郵件按RFC822格式編碼并發(fā)送。2發(fā)送POP3命令,處理相應(yīng)效勞器的響應(yīng),將郵件按RFC822格式解碼并發(fā)送。本系統(tǒng)的現(xiàn)實(shí)主要使用了CSMTP,CPOP3,CmailMessage封裝類。CSMTP類中的成員函數(shù)主要實(shí)現(xiàn)發(fā)送SMTP命令并處理SMTP效勞器響應(yīng) ,CPOP3的成員函數(shù)主要實(shí)現(xiàn)發(fā)送POP3命令并處理POP3效勞器響應(yīng),CMail

35、Message實(shí)現(xiàn)郵件的編碼解碼功能。3.2.1郵件的格式化由于電子郵件結(jié)構(gòu)上的特殊性,在傳輸時(shí)是不能當(dāng)作簡單的文本來直接處理的,而必須按照一定的格式對(duì)郵件頭和郵件體進(jìn)行格式化處理之后才可以被發(fā)送。需要進(jìn)行格式化的局部主要有:發(fā)件人地址、收件人地址、主題和發(fā)送日期等。在RFCRequest For Comments文檔的RFC 822里對(duì)郵件的格式化有詳盡的說明.在本論文中由CMailMessage類中的成員函數(shù)實(shí)現(xiàn)郵件的編碼解碼功能。BOOL EncodeHeader();BOOL DecodeHeader();void EncodeBody();void DecodeBody();下面通過

36、VC+6.0按照RFC 822文檔規(guī)定將格式化郵件的局部編寫如下局部代碼:BOOL CMailMessage:EncodeHeader()/此函數(shù)為郵件頭部編碼(此處僅列出了關(guān)鍵局部) CString sTo;CString sDate;CString sEmail = ""CString sFriendly = ""m_tDateTime = m_tDateTime.GetCurrentTime();/ Format: Mon, 01 Jun 98 01:10:30 GMTm_sHeader.Format( "From: %srn"

37、"To: %srn""Date: %srn""Subject: %srn", / Include other extension lines if desired(LPCTSTR)m_sFrom, /sender(LPCTSTR)sTo, /recipients (LPCTSTR)sDate, /日期(LPCTSTR)m_sSubject);/主題void CMailMessage:EncodeBody() /此函數(shù)為郵件體編碼(此處僅列出了關(guān)鍵局部)CString sCooked = ""LPTSTR szBad

38、 = "rn.rn"LPTSTR szGood = "rn.rn"int nPos;int nBadLength = strlen( szBad );if( m_sBody.Left( 3 ) = ".rn" )m_sBody = "." + m_sBody;while( (nPos = m_sBody.Find( szBad ) > -1 ) /npos中是結(jié)束符所在的位子,即共有多少有意義的字符sCooked = m_sBody.Mid( 0, nPos );sCooked += szGood;m_sBo

39、dy = sCooked + m_sBody.Right( m_sBody.GetLength() - (nPos + nBadLength) ); /最后以"rn.rn"結(jié)尾3.2.2 SMTP&POP3協(xié)議封裝類 很多EMAIL系統(tǒng)都是使用SMTP協(xié)議來作為發(fā)送協(xié)議,而POP3協(xié)議來作為接受協(xié)議。本節(jié)編寫了有關(guān)于SMTP,POP3協(xié)議的C+類,這樣的話呢,我們可以在連接的時(shí)候使用它。并且,類中實(shí)現(xiàn)的一些功能類似于SMTP,POP3協(xié)議中的一些命令。以下程序是通過使用MFC中CSocket類中成員函數(shù)的使用實(shí)現(xiàn)的,它包含在afxsock.h中。CSMTP clas

40、s中的關(guān)鍵函數(shù)如下:BOOL Connect(); /格式化并發(fā)送HELLO命令,連接SMTP效勞器BOOL Disconnect(); /斷開連接SMTP效勞器virtual BOOL FormatMailMessage( CMailMessage* msg );/ 調(diào)用CMailMessage類EncodeHeader()EncodeBody()對(duì)郵件格式化BOOL SendMessage( CMailMessage* msg );/ 調(diào)用CSMTP類 FormatMailMessage( ) transmit_message( )BOOL get_response( UINT respo

41、nse_expected ); /判斷應(yīng)答碼是否為期望值BOOL transmit_message( CMailMessage* msg ); /發(fā)送SMTP命令調(diào)用get_response處理效勞器應(yīng)答碼并發(fā)送郵件頭和郵件體SMTP協(xié)議類中局部成員函數(shù)的實(shí)現(xiàn)如下(此處僅列出了關(guān)鍵局部):CSMTP:CSMTP( LPCTSTR szSMTPServerName, UINT nPort ) AfxSocketInit(); / 用AfxSocketInit()函數(shù)對(duì)套接字進(jìn)行初始化;BOOL CSMTP:Connect()if( !m_wsSMTPServer.Create() )/用Crea

42、te()創(chuàng)立套接字對(duì)象m_sError = _T( "Unable to create the socket." );return FALSE;if( !m_wsSMTPServer.Connect( GetServerHostName(), GetPort() ) ) /由該套接字通過Connect建立同郵件效勞器的連接。m_sError = _T( "Unable to connect to server" );m_wsSMTPServer.Close();if( !get_response( CONNECT_SUCCESS ) )m_sError

43、= _T( "Server didn't respond." );m_wsSMTPServer.Close();return FALSE;sHello.Format( "HELO %srn", local_host );m_wsSMTPServer.Send( (LPCTSTR)sHello, sHello.GetLength() );if( !get_response( GENERIC_SUCCESS ) ) m_wsSMTPServer.Close();return FALSE;m_bConnected = TRUE;return TRUE;

44、BOOL CSMTP:SendMessage(CMailMessage * msg)if( FormatMailMessage( msg ) = FALSE )return FALSE;if( transmit_message( msg ) = FALSE )return FALSE;return TRUE;BOOL CSMTP:FormatMailMessage( CMailMessage* msg )if( msg->EncodeHeader() = FALSE )return FALSE;msg->EncodeBody();if( msg->m_sBody.Right(

45、 2 ) != "rn" )msg->m_sBody += "rn" /確認(rèn)最后以rn.rn結(jié)束return TRUE;BOOL CSMTP:transmit_message(CMailMessage * msg) / Send the MAIL commandsFrom.Format( "MAIL From: <%s>rn", (LPCTSTR)msg->m_sFrom );m_wsSMTPServer.Send( (LPCTSTR)sFrom, sFrom.GetLength() );if( !get_re

46、sponse( GENERIC_SUCCESS ) )return FALSE;/ Send RCPT commands (one for each recipient)for( int i = 0; i < msg->GetNumRecipients(); i+ ) msg->GetRecipient( sEmail, sTemp, i );sTo.Format( "RCPT TO: <%s>rn", (LPCTSTR)sEmail );m_wsSMTPServer.Send( (LPCTSTR)sTo, sTo.GetLength() );

47、get_response( GENERIC_SUCCESS );/ Send the DATA commandsTemp = "DATArn" m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );/ Send the headerm_wsSMTPServer.Send( (LPCTSTR)msg->m_sHeader, msg->m_sHeader.GetLength() );/ Send the bodym_wsSMTPServer.Send( (LPCTSTR)msg->m_sBody, m

48、sg->m_sBody.GetLength() );/ Signal end of data"CRLF.CRLF"sTemp = "rn.rn"m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );return TRUE;到此為止,已根本在程序中表達(dá)出了SMTP協(xié)議類的功能,能在Socket套接字所提供的網(wǎng)絡(luò)通訊能力根底之上實(shí)現(xiàn)以SMTP命令和SMTP應(yīng)答碼為根本會(huì)話內(nèi)容的通訊交互過程,從而最終實(shí)現(xiàn)SMTP協(xié)議對(duì)電子郵件的發(fā)送。CPOP3 class中的關(guān)鍵函數(shù)如下:BOOL Discon

49、nect();/發(fā)送QUIT 命令BOOL Connect(); /創(chuàng)立并初始化套節(jié)字,發(fā)送USER,PASS 命令BOOL GetMessage( UINT nMsg, CMailMessage* msg); /發(fā)送RETR命令,獲得郵件int CPOP3:GetNumMessages()/發(fā)送STAT獲得郵件總數(shù)及字節(jié)數(shù)BOOL DeleteMessage( UINT nMsg );/發(fā)送DELETE命令BOOL get_response( UINT executed_action );CPOP3協(xié)議類中局部成員函數(shù)的實(shí)現(xiàn)如下(此處僅列出了關(guān)鍵局部):CPOP3:CPOP3( LPCTST

50、R szPOP3ServerName, UINT nPort, LPCTSTR sUsername, LPCTSTR sPassword)AfxSocketInit();/在正式使用套接字之前,先用AfxSocketInit()函數(shù)對(duì)套接字進(jìn)行初始化 BOOL CPOP3:Connect() if( !m_wsPOP3Server.Create() ) /用Create()創(chuàng)立套接字對(duì)象m_sError = _T( "Unable to create the socket." );return FALSE;/由該套接字通過Connect建立同郵件效勞器的連接if( !m_w

51、sPOP3Server.Connect( GetServerHostName(), GetPort() ) ) m_sError = _T( "Unable to connect to server" );m_wsPOP3Server.Close();return FALSE;/命令 USER & PASS對(duì)在網(wǎng)絡(luò)上發(fā)送明文用戶名和 口令給效勞器sUser.Format( "USER %srn", GetUsername();m_wsPOP3Server.Send( (LPCTSTR)sUser, sUser.GetLength() );if(

52、!get_response( IDENTIFICATION ) )m_wsPOP3Server.Close();return FALSE;sPass.Format( "PASS %srn", GetPassword();m_wsPOP3Server.Send( (LPCTSTR)sPass, sPass.GetLength() );if( !get_response( AUTHENTIFICATION ) )m_wsPOP3Server.Close();return FALSE;m_bConnected = TRUE;return TRUE;BOOL CPOP3:GetMe

53、ssage( UINT nMsg, CMailMessage* msg)CString sMsg;CString sRetr;sRetr.Format("RETR %drn",nMsg);m_wsPOP3Server.Send( (LPCTSTR)sRetr, sRetr.GetLength() );while ( sMsg.Find("rn.rn")<0 ) int nChars = m_wsPOP3Server.Receive( response_buf, RESPONSE_BUFFER_SIZE );if ( nChars = SOCKET_ERROR ) return FALSE;m_sResponse=response_buf;sMsg+=m_sResponse.Left( nChars ); sMsg=sMsg.Mid(sMsg.Find("rn")+2); /first line of output is +OKsMsg=sMsg.Left(sMsg.GetLen

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論