版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、學 號:200840420142課外設計論文題 目基于POP3協(xié)議的電子郵件接收程序的設計教 學 院計算機學院專 業(yè)網(wǎng)絡工程班 級08級(1)班姓 名李清平指導教師嚴 偉2011年6月24日目 錄摘要11、引言31.1 課程設計的內(nèi)容31.2 課程設計的要求32、設計平臺簡介32.1 VC+33、郵件接收協(xié)議53.1 POP3簡介54、設計原理84.1 POP3交互模型85、課程設計步驟95.1 函數(shù)構造95.2 接收郵件的步驟156、測試196.1 測試目的196.2 測試環(huán)境196.3 測試結果196.4 結果分析207、出現(xiàn)的問題及解決方法20設計中出現(xiàn)的問題20解決方法20參考文獻21
2、摘要電子郵件可以使人們有效地進行電子化的數(shù)據(jù)異地交換。Internet以電子郵件服務推動著人類的通信行為不斷發(fā)展。本文以VC+為開發(fā)平臺,利用Socket套接字編程,實現(xiàn)了基于POP3協(xié)議的郵件接收程序,介紹了POP3協(xié)議的原理及電子郵件接收程序的設計與實現(xiàn)方法。隨著Internet/Intranet的迅猛發(fā)展,電子郵件(E-Mail)已成為因特網(wǎng)上非常流行、非常方便的通信方式。電子郵件技術不斷進步,郵件協(xié)議也不斷發(fā)展。目前應用最廣泛的電子郵件收件協(xié)議是POP3。本文采用微軟最新的.NET技術,以VC+為開發(fā)平臺,利用Socket套接字編程開發(fā)了基于POP3協(xié)議的郵件接收程序,現(xiàn)對相關原理及具
3、體設計進行討論。關鍵詞課程設計;電子郵件;接收程序;POP3;Socket;VC+1、引言隨著Internet/Intranet的迅猛發(fā)展,電子郵件(E-Mail)已成為因特網(wǎng)上非常流行、非常方便的通信方式。電子郵件技術不斷進步,郵件協(xié)議也不斷發(fā)展。目前應用最廣泛的電子郵件收件協(xié)議是POP3。本文采用微軟最新的.NET技術,以VC+為開發(fā)平臺,利用Socket套接字編程開發(fā)了基于POP3協(xié)議的郵件接收程序,現(xiàn)對相關原理及具體設計進行討論。1.1 課程設計的內(nèi)容運用VC+語言設計一個郵件程序實現(xiàn)郵件的接收1.2 課程設計的要求(1)按要求編寫課程設計報告書,能正確闡述設計結果。(2)通過課程設計
4、培養(yǎng)學生嚴謹?shù)目茖W態(tài)度,認真的工作作風和團隊協(xié)作精神。(3)學會文獻檢索的基本方法和綜合運用文獻的能力。(4)在老師的指導下,要求每個學生獨立完成課程設計的全部內(nèi)容。2、設計平臺簡介2.1 VC+(1)背景VC+是微軟公司開發(fā)的一個IDE(集成開發(fā)環(huán)境),換句話說,就是使用C+的一個開發(fā)平臺。VC+是Windows平臺上的C+編程環(huán)境,學習VC要了解很多Windows平臺的特性并且還要掌握MFC、ATL、COM等的知識,難度比較大。Windows下編程需要了解Windows的消息機制以及回調(diào)(callback)函數(shù)的原理;MFC是Win32API的包裝類,需要理解文檔視圖類的結構,窗口類的結構
5、,消息流向等等;COM是代碼共享的二進制標準,需要掌握其基本原理等等。VC+作為Visual Studio的一個組件,可以通過安裝Visual Studio來獲得。VC作為一個主流的開發(fā)平臺一直深受編程愛好者的喜愛,但是很多人卻對它的入門感到難于上青天,究其原因主要是大家對他錯誤的認識造成的,嚴格的來說VC+不是門語言,雖然它和C+之間有密切的關系,如果形象點比喻的話,可以把C+看作為一種“工業(yè)標準”,而VC+則是某種操作系統(tǒng)平臺下的“廠商標準”,而“廠商標準”是在遵循“工業(yè)標準”的前提下擴展而來的。 (2)基本模式VC+應用程序的開發(fā)主要有兩種模式,一種是WIN API方式,另一種則是MFC
6、方式。VC基于C,C+語言,主要由是MFC組成,是與系統(tǒng)聯(lián)系非常緊密的編程工具,它兼有高級,和低級語言的雙重性,功能強大,靈活,執(zhí)行效率高,幾乎可說VC在 Windows平臺無所不能。最大缺點是開發(fā)效率不高。 (3)適用范圍【1】1、 VC主要是針對Windows系統(tǒng),適合一些系統(tǒng)級的開發(fā),可以方便實現(xiàn)一些底層的調(diào)用。在VC里邊嵌入?yún)R編語言很簡單。 2、 VC主要用在驅動程序開發(fā)。3、 VC執(zhí)行效率高,當對系統(tǒng)性能要求很高的時候,可用VC開發(fā)。 4、 VC主要適用于游戲開發(fā)。5、 VC多用于單片機,工業(yè)控制等軟件開發(fā),如直接對I/O地址操作,就要用C+。 6、 VC適用開發(fā)高效,短小,輕量級的
7、COM組件,DLL。比如WEB上的控件。 7、 VC可以開發(fā)優(yōu)秀的基于通信的程序。 8、 VC可以開發(fā)高效靈活的文件操作程序。 9、 VC可以開發(fā)靈活高效的數(shù)據(jù)庫操作程序。 10、VC是編CAD軟件的唯一選擇。包括AUTOCAD,UG的二次開發(fā)。 11、VC在多線程、網(wǎng)絡通信、分布應用方面,VC+有不可比擬的優(yōu)勢。3、郵件接收協(xié)議3.1 POP3簡介POP3(Post Office Protocol Version 3),即郵局辦公協(xié)議,該協(xié)議用于接收郵件的雙方(客戶機、POP3服務器)進行通信。使用該協(xié)議,用戶可以脫機閱讀信件,而不必把客戶機長期連接到網(wǎng)絡上,以減少網(wǎng)絡費用。POP3協(xié)議允許
8、用戶以一定的方式從保存郵件的服務器(即POP3服務器)上取走自己的郵件。3.2 POP3協(xié)議工作原理【2】POP3提供了一種客戶機/服務器脫機模型,客戶機通過向服務器發(fā)送一些命令來完成相應的操作??蛻魴C能夠發(fā)送的命令與它所處的狀態(tài)有關。協(xié)議中定義了三種狀態(tài):即確認狀態(tài)(Authorization State)、處理狀態(tài)(Transaction State)和更新狀態(tài)(Update State)。在不同的狀態(tài)下,客戶機可以向服務器發(fā)送的命令是有區(qū)別的,某些命令還會導致狀態(tài)的轉換。POP3交互過程中的常用命令和狀態(tài)轉換如圖3和表3.2.1所示。圖3.2.1 POP3的狀態(tài)轉換示意圖表3 一些常用的
9、POP3命令POP3服務器一般使用的是TCP的110號端口。當客戶機與服務器建立TCP連接時,POP3服務器向客戶機發(fā)回一個問候,交互過程即進入確認狀態(tài)。此時,若客戶機提供了自己的身份并成功確認,即由確認狀態(tài)轉入處理狀態(tài);在這個狀態(tài),用戶可用相應的命令處理自己的郵件。在完成相應的處理過程后客戶機發(fā)出QUIT命令,則進入更新狀態(tài);在此狀態(tài)下,POP3服務器釋放郵件資源并返回一個告別響應;最后關閉TCP連接。通過POP3命令查詢電子郵件時,客戶機可以下載指定的郵件,然后對郵件進行刪除或修改操作都無需與服務器進一步交互??蛻魴C向服務器發(fā)送命令并等待響應,POP3命令采用命令行形式,用ASCII碼表示
10、。服務器響應是由一行或多行組成,其中,第一行以ASCII文本+OK, 或-ERR開始,分別指出相應的操作是成功還是失敗。POP3命令包含一個大小寫無關的關鍵字和一個或多個參量,所有的命令以(回車換行符)作為其結束標志。關鍵字和參量必須是非控制符的ASCII碼字符。關鍵字和參量之間,參量和參量之間由一個空格字符分隔開。關鍵字長不大于四個字符,每個參量最長可到40個字符。POP3響應包含一個狀態(tài)標志和一個跟隨其后的附加信息。響應也用作為其結束標志。響應最長到512字節(jié),其中包括協(xié)議定義了兩個狀態(tài)標志:正確(“ +OK”)和錯誤(“ -ERR”)。服務器用大寫格式發(fā)送“ +OK”和“ -ERR”。如
11、果響應是多行的,則每行以結束。當響應的所有行被發(fā)送后,接著發(fā)送多行響應的結束標志行,該行僅包含一個句點“.”和一個對【3】。4、設計原理4.1 POP3交互模型POP3接收者初始化連接POP3發(fā)送者READY“Hello”“Mail from”“Rcpt to”“Data”(reque st to get)OK接收數(shù)據(jù)QUIT斷開連接該模型基本原理為:POP3接收者對POP3發(fā)送者進行初始化連接,發(fā)送者對接收者發(fā)送詢問指令“READY”,接收者則向發(fā)送者提交所要接收數(shù)據(jù)的要求,發(fā)送者做出回應,并發(fā)送數(shù)據(jù)。接收者則開始接收數(shù)據(jù)。發(fā)送者發(fā)送完數(shù)據(jù)后,提出斷開請求,并斷開連接。數(shù)據(jù)接收過程完成。5、
12、課程設計步驟5.1 函數(shù)構造WindowsSocket類是對Windows Socket API的封裝,其中包括,CSocket和cAsyncSocket類,使用它們能夠大大簡化網(wǎng)絡通信程序的編寫。套接字的數(shù)據(jù)結構中包括下面五種數(shù)據(jù):(1)本機主機端口:接收報文或數(shù)據(jù)報的進程。(2)本機主機地址:接收數(shù)據(jù)包的主機。(3)遠地協(xié)議端口:目的進程或程序。(4)遠地主機端口:目的主機。(5)協(xié)議:程序在網(wǎng)絡上傳輸數(shù)據(jù)時使用的協(xié)議。本應用程序就是使用Windows sockets編程設計的。在接收電子郵件時,必然需要涉及到連接服務器,接收數(shù)據(jù),接收響應以及斷開等一系列操作這就需要設計一個類來封裝這些操
13、作,在該應用程序中制定了一個CSMTP類。該類的定義如下所示,#define SMTP_PORT 25#define RESPONSE_BUFFER_SIZE 1024class CSMTPPublic;CSMTP(LPCTSTR szSMTPServerName,UINT nPort=SMTP_PORT);virtualCSMTP();void SetServerProperties(LPCTSTR szSMTPserverName,UINT nPort=SMTP_PORT);CString GetlastError();UINT GetPort();BOOL Disconnect();BO
14、OL Connect();virtual BOOL FormatMAilMessage(CMailMessage * msg);BOOL getMessage(CMailMessage * msg);CString GetserverHostName();Private;BOOL get_response(UINTresponse_expected);CString cook_body(CMailMessage * msg);CString m_serror;BOOL m_bconnected;UINT m_nPort;CString m_sSMTPServerHostName;CSocket
15、 m_wsSMTPServer;protected;virtuaI BOOL transmit_message(CMailMessage * msg);struct response_codeUINT nResponse;TCHAR * sMessage;enum eResponseGENERIC_SUCCESS=O,CONNECT_SUCCESS,DATA_SUCCESS,QUIT_SUCCESS,LAST_RESPONSE);TCHAR * response_buf;static response_code response_table;);其中,m_sError成員代表錯誤信息,m_bC
16、onnected表示是否建立連接;m_bPort表示SMTP服務器所使用的端口號,m_sSMTPserverHostName表示SMTP服務器的主機名(地址);m_waSMTPserver則為將與SMTP服務器建立連接的套接字對象;response_table表示由服務器返回的響應,而eResponse列舉了所有可能出現(xiàn)的錯誤。因為電子郵件有其特殊的結構,不單簡單地將其作為文本進行處理。例如,郵件必須在郵件頭和郵件體后發(fā)送,而在收信時,先需要解析郵件頭和郵件體CMailMessage類是對郵件進行格式化編碼的一個類【4】。CSMTP類的構造函數(shù)如下所示:CSMTP:; CSMTP(LPCTST
17、R szSMTPServerName,UINT nPort)ASSERT(szSMTPServerName l = NULL);AfxSocketInit();m_sSMTPserverHostName= azSMTPServerName;m_nPort=nPort;m_bConnected = FALSE;m_sError= _T(“OK”);response_buf =NULL;在這里調(diào)用AfxsocketInit函數(shù)以初始化Window Sockets類的使用,此外還驗證其他類成員是否合法,或為其賦值。#include mySock.h /添加套接字類的包含文件.class CPop3D
18、lg : public CDialog/ Constructionpublic:void Disp(LONG flag); /在不同的會話階段顯示不同的信息mySock pop3Socket; /套接字類對象實例CPop3Dlg(CWnd* pParent = NULL); / standard constructor.(2)實現(xiàn)文件#include stdafx.h#include pop3.h#include pop3Dlg.h#include mySock.h /手工添加的包含語句.BOOL CPop3Dlg:OnInitDialog()./ TODO: Add extra initia
19、lization here/用戶在這里添加控件成員變量的初始化代碼m_strServer = _T(); /POP3服務器地址m_strUser = _T(example); /郵箱的用戶名m_strPass = _T(123456); /口令m_bolDel = FALSE; /下載郵件后不刪除m_Info = _T(); /多文本框清空return TRUE; / return TRUE unless you set the focus to a control./以下是事件處理函數(shù)和其他成員函數(shù)的代碼/當用戶點擊連接按鈕時,執(zhí)行此函數(shù)void CPop3Dlg:OnBtnConn() /
20、設定pop3類的對話框指針變量,使之指向本對話框,以便傳遞信息pop3Socket.SetParent(this); UpdateData(TRUE); /取來用戶在對話框中輸入的數(shù)據(jù)pop3Socket.Create(); /創(chuàng)建套接字對象的底層套接字pop3Socket.Connect(LPCSTR)m_strServer,110); /連接pop3服務器m_Info = ; /多文本列表框清空UpdateData(FALSE); /更新用戶界面/當用戶點擊斷開按鈕時,執(zhí)行此函數(shù)void CPop3Dlg:OnBtnDisc() pop3Socket.Close();/當用戶點擊查看郵件按
21、鈕時,執(zhí)行此函數(shù)void CPop3Dlg:OnBtnView() int i;i = m_ctrList.GetCurSel(); /獲得用戶在組合框中的選擇/獲得并顯示指定信件的基本屬性及信件內(nèi)容m_Info += pop3Socket.GetMsgStuff(i);m_Info += pop3Socket.GetMsgBody(i);/在不同的情況下,向用戶顯示不同的信息void CPop3Dlg:Disp(LONG flag)CString s;switch(flag)case S_CONNECT: /已連接到服務器,顯示信息s = 已連接到+m_strServer+.rn;m_Inf
22、o+=s;/禁用連接按鈕GetDlgItem(IDC_BTN_CONN)-EnableWindow(FALSE);/啟用斷開按鈕GetDlgItem(IDC_BTN_DISC)-EnableWindow(TRUE);/禁用查看郵件按鈕GetDlgItem(IDC_BTN_VIEW)-EnableWindow(FALSE);break;case S_RECEIVE:/收到服務器發(fā)來的響應,顯示它的內(nèi)容m_Info+=pop3Socket.lastMsg;break; case S_CLOSE: /顯示關閉連接的信息m_Info+=pop3Socket.error;s = 連接已經(jīng)關閉rn;m_I
23、nfo+=s; /啟用連接按鈕GetDlgItem(IDC_BTN_CONN)-EnableWindow(TRUE);/禁用斷開按鈕GetDlgItem(IDC_BTN_DISC)-EnableWindow(FALSE); break;case S_GETNUM: /已經(jīng)知道了郵箱中信件的總數(shù)s.Format(郵箱中共有 %d 封信rn,pop3Socket.numMsg);m_Info+=s;break;case S_GETSIZE: /顯示信件的大小s.Format(信箱中信件大小為:%d字節(jié)rn,pop3Socket.sizeMsg);m_Info+=s; break;case S_EN
24、DRETR: /所有信件已下載完畢,顯示信息s.Format(共下載了 %d 封信件rn,pop3Socket.msgs.size();m_Info+=s;/如果有信件下載,啟用查看郵件按鈕if(pop3Socket.msgs.size()0)GetDlgItem(IDC_BTN_VIEW)-EnableWindow(TRUE);break;UpdateData(FALSE); /更新用戶界面/當點擊“存儲”按鈕時,執(zhí)行此函數(shù)。void CPop3Dlg:OnBtnSave() int i;CString s;i = m_ctrList.GetCurSel();/獲得指定信件的基本屬性及信件內(nèi)
25、容s = pop3Socket.GetMsgStuff(i);s += pop3Socket.GetMsgBody(i);CFileDialog dlg(FALSE);if(dlg.DoModal()=IDOK)CFile file(dlg.GetPathName(),CFile:modeCreate | CFile:modeWrite | CFile:typeBinary);file.Write(LPCSTR)s,s.GetLength();file.Close();5.2 接收郵件的步驟(1). 建立與服務器的連接。具體工作由Connect函數(shù)完成。部分Connect函數(shù)代碼如下所示:BO
26、OL CSMTP:; Connect()if(! m_wsSMTPServerCreate()m_sError=_T(“無法創(chuàng)建套接字!”);delete response_buf;response_buf=NULL;return FALSE;)if(! M_wsSMTPserverConnect(GetServerHostName(),GetPort()m_sError = _T(“無法連接到服務器”);M_sSMTPserverClose();delete response_but;response-buf = NULL;returnFALSEI;if(! Get_response(CON
27、NECT_SUCCESS)m_sError = _T(“服務器投有響應”);M_wsSMTPServerClose();delete response_buf;response_buf = NULL;return FALSE;)sHelloFormat(_T(“HELOsrn”),local_host);m_wsSMTPServerGet(LPCTSTR)sHello,sHelloGetlength();(2)建立連接后從服務器接收郵件。這個工作由GetMessage函數(shù)完成。GetMessage函數(shù)代碼如下:BOOL CSMTP:GetMessage(CMailMessage * msg)i
28、f(! m_bConnected)m_sError= _T(“必須首先創(chuàng)建連接!”);return FALSE;)if(FormatMailMessage(msg)=FALSE)return FALSE;)if(transmit_message(msg)=FALSE)return FALSE;)return TRUE;)前面介紹過電子郵件有其特殊的格式,在這里FormatMailMessage函數(shù)就是用于格式化郵件信息的。Transmit_message函數(shù)將郵件進到服務器上。部分Transmit_message函數(shù)代碼如下所示:BOOL CSMTP:transmit_message(CMai
29、lMessage * msg)sFromFormat_T(“MAIL From:rn”),(LPCTSTR)msg一m_sFrom);M_wsSMTPServerGet(LPCTSTR)sFrom,sFromGctLength();if(! Get_response(GENERIC_SUCCESS)return FALSEl;for(int i=O;iGetNumRecipients(); i+)msg一GetRecipient(sEmail,sTemp,i);sToFormat(_T(“RCPT TO;rn”),(LPCTSTR)sEmail);m_wsSMTPServerGet( (LPC
30、TSTR)sTemp,sTempGetLength();Get_response(GENERIC_SUCCESS);)sTemp=_T(“DATArn”);m_wsSMTPServerGet(LPCTSTR)sTemp,sTempGetLength();if(! Get_response(DATA_SUCCESS)return FALSE;m_wsSMTPserverGet(LPCTSTR)msg一m_sHeader,g一m_sHeaderGetLength();sTemp=cook_body(msg);m_wsSMTPServerGet(LPCTSTR)sTemp,sTempGetLength();sTemp= _T(“rn.rn”);m_wsSMTPServerGet(LPCTSTR)sTemp,sTemp.GetLength();if! Get_response(GENERIC_SUCCESS)return FALSE;Return TRUE;在此函數(shù)中,首先發(fā)送MAIL命令,通知服務器收信人的郵箱地址。然后發(fā)進RCPT命令,通知服務器發(fā)信人的郵箱地址。需要注意的是,在有多個發(fā)信人時,必須為每個發(fā)信人都發(fā)送一次RCPT命令,通知服務器將要進行郵件數(shù)據(jù)的傳輸。此后,分別將郵件頭和郵件體從服務器上接收下來。這里需要注意一點:當郵件數(shù)據(jù)接收完畢后
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024新版信托協(xié)議模板
- 二零二五年度升級公證二手寫字樓買賣合同樣本3篇
- 2024版接送服務合同標準范本
- 2024年鐵塔項目環(huán)境影響評價合同3篇
- 2025年遼寧建筑安全員《A證》考試題庫
- 2024年股權擔保合同:共創(chuàng)美好未來
- 2025江蘇省建筑安全員C證考試(專職安全員)題庫附答案
- 2025年度物業(yè)公司員工安全防護責任合同3篇
- 二零二五年度危險化學品安全管理協(xié)議2篇
- 2024年蔬菜訂購合同樣本2篇
- 0-3歲嬰幼兒心理發(fā)展知到智慧樹期末考試答案題庫2024年秋杭州師范大學
- 2024年1月福建省普通高中學業(yè)水平合格性考試化學試題(解析版)
- 齊白石介紹課件
- 窺見中華文明之光- 高中語文統(tǒng)編版(2022)必修下冊第一單元整體教學設計
- 2024年安徽省公務員錄用考試《行測》真題及解析
- 項目年終總結及明年計劃
- 2024年工程部年終總結
- 新外貿(mào)業(yè)務員年終總結
- 電梯日常巡檢記錄制度
- 七年級上冊道德與法治2023-2024期末試題附答案系列
- 國家電網(wǎng)公司招聘高校畢業(yè)生應聘登記表
評論
0/150
提交評論