版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
電子郵件客戶端軟件的研討與開發(fā)
1.引言1.1電子郵件簡單引見 電子郵件(簡稱E-mai1)又稱電子信箱、電子郵政,它是—種用電子手段提供信息交換的通訊方式。它是全球多種網(wǎng)絡(luò)上運用最普遍的一項效力。這種非交互式的通訊,加速了信息的交流及數(shù)據(jù)傳送,它是—個簡易、快速的方法。經(jīng)過銜接全世界的Internet,實現(xiàn)各類信號的傳送、接納、存貯等處置,將郵件送到世界的各個角落。到目前為止,可以說電子郵件是Internet資源運用最多的一種效力,E-mai1不只局限于信件的傳送,還可用來傳送文件、聲音及圖形、圖像等不同類型的信息。例如比較著名的郵件收發(fā)軟件有系統(tǒng)自帶的OutLook,還有比較著名的第三方軟件FoxMaiL,F(xiàn)astMail等等。1.2開發(fā)背景引見 當(dāng)前流行的各大郵件客戶端軟件的除了最主要的收發(fā)信件之外,功能越來越復(fù)雜,但是人們平常真正用到的功能很少,很多功能尤其對于那些計算機知識相對缺乏的人來說,更加顯得太過于華美而不太適用。有鑒于此,在了解RFC底層協(xié)議的根底上,我們開發(fā)了這個各種功能相對簡單適用的郵件客戶端程序,簡化了很多不用要的功能。1.3運轉(zhuǎn)環(huán)境及開發(fā)環(huán)境1.3.1開發(fā)環(huán)境AMDAthlon(TM),512M內(nèi)存,80G硬盤Microsoft?Windows?XPProfessionalMicrosoft?VisualStudio2003(CSharp)Microsoft?DeveloperNetworkforVisualStudio.NET20031.3.2運轉(zhuǎn)環(huán)境Intel?Pentium?2及以上處置器,32M以上內(nèi)存,4G以上硬盤Microsoft?Windows?9X/NT操作系統(tǒng)800*600或以上的屏幕分辨率確保機器上安裝有.NetFrameWork1.0或者以上版本
2.軟件架構(gòu)及系統(tǒng)用例圖2.1系統(tǒng)架構(gòu)軟件的總體架構(gòu)如圖2.1:2.2系統(tǒng)總體用例用戶新建賬號發(fā)送郵件接納郵件純文本郵件帶附件郵件2.3程序功能框圖3SMTP協(xié)議的研討 由于要開發(fā)的是郵件客戶端程序,就不得不用到SMTP協(xié)議和POP協(xié)議。而我個人擔(dān)任的是郵件發(fā)送功能的實現(xiàn),因此就必然會涉及到SMTP〔SimpleMailTransferProtocol〕協(xié)議。SMTP被用來在因特網(wǎng)上發(fā)送郵件,該協(xié)議規(guī)定了一些根本的命令和方法使客戶端與效力器進展交互,以到達發(fā)送郵件的目的。3.1SMTP協(xié)議簡介及任務(wù)原理3.1.1引見簡單郵件傳輸協(xié)議〔SMTP〕的目的是可靠高效地傳送郵件,它獨立于傳送子系統(tǒng)而且僅要求一條可以保證傳送數(shù)據(jù)單元順序的通道。SMTP的一個重要特點是它可以在傳送中接力傳送郵件,傳送效力提供了進程間通訊環(huán)境〔IPCE〕,此環(huán)境可以包括一個網(wǎng)絡(luò),幾個網(wǎng)絡(luò)或一個網(wǎng)絡(luò)的子網(wǎng)。了解到傳送系統(tǒng)〔或IPCE〕不是一對一的是很重要的。進程能夠直接和其它進程經(jīng)過知的IPCE通訊。郵件是一個運用程序或進程間通訊。郵件可以經(jīng)過銜接在不同IPCE上的進程跨網(wǎng)絡(luò)進展郵件傳送。更特別的是,郵件可以經(jīng)過不同網(wǎng)絡(luò)上的主機接力式傳送。3.2SMTP協(xié)議的命令和應(yīng)對3.2.1SMTP協(xié)議的命令 SMTP命令定義了郵件傳輸或由用戶定義的系統(tǒng)功能。它的命令是由<CRLF>終了的字符串。而在帶有參數(shù)的情況下,命令本身由<SP>和參數(shù)分開,假設(shè)未帶參數(shù)可以直接和<CRLF>銜接。郵箱的語法格式必需和接納站點的格式一致。下面討論SMTP幾個常用的命令和應(yīng)對。下面是SMTP命令:HELO<SP><domain><CRLF>MAIL<SP>FROM:<reverse-path><CRLF>RCPT<SP>TO:<forward-path><CRLF>DATA<CRLF>NOOP<CRLF>QUIT<CRLF>TURN<CRLF>3.2.2SMTP的應(yīng)對碼對SMTP命令的呼應(yīng)是多樣的,它確定了在郵件傳輸過程中懇求和處置的同步,也保證了發(fā)送SMTP知道接納SMTP的形狀。每個命令必需有且只需一個呼應(yīng)。SMTP呼應(yīng)由三位數(shù)字組成,其后跟一些文本。數(shù)字協(xié)助決議下一個應(yīng)該進入的形狀,而文本對人是有意義的。三位的呼應(yīng)曾經(jīng)包括了足夠的信息,不用再閱讀文本,文本可以直接丟棄或者傳送給用戶。特別的是,文本是與接納和環(huán)境相關(guān)的,所以每次接納到的文本能夠不同。在附錄E中可以看到全部的呼應(yīng)碼。正規(guī)的情況下,呼應(yīng)由下面序列構(gòu)成:三位的數(shù)字,<SP>,一行文本和一個<CRLF>,或者也可以是一個多行呼應(yīng)。只需EXPN和HELP命令可以導(dǎo)致多行應(yīng)對,然而,對一切命令,多行呼應(yīng)都是允許的。REPLYCODESBYFUNCTIONGROUPS500格式錯誤,命令不可識別〔此錯誤也包括命令行過長〕501參數(shù)格式錯誤502命令不可實現(xiàn)4命名控件MailSend 由于在CSharp言語中,都是以命名控件來組織程序的。而一切的類都歸屬于一個特定的命名空間下。需求的命名空間系統(tǒng)本身自帶了一部分,而且假設(shè)系統(tǒng)沒有他需求的命名空間的話,就可以本人編寫,本節(jié)中的這個命名空間就是由于需求而編寫的。而調(diào)用某一個類中的某個變量成員的方法就是經(jīng)過命名空間名.類名.變量成員來訪問的,當(dāng)然在CSharp中假設(shè)在程序開場經(jīng)過Using命名空間名,就可以直接的象C++那樣來訪問成員變量,可以說相當(dāng)?shù)姆奖悖@些都會在程序中表達出來,在此不再做過多的表達。4.1發(fā)送郵件類SmtpMail4.1.1主要成員變量闡明1) 網(wǎng)絡(luò)銜接類及實例TcpClienttc為TCP網(wǎng)絡(luò)效力提供客戶端銜接類TcpClient實例對象tc。TcpClient類提供了一些簡單的方法,用于在同步阻塞方式下經(jīng)過網(wǎng)絡(luò)來銜接、發(fā)送和接納流數(shù)據(jù)。而實例化的過程也是銜接SMTP效力器的過程。它的重載方法之一的兩個參數(shù)一個為效力器稱號字符串,另一個為效力器的埠。2〕提供用于網(wǎng)絡(luò)訪問的根底數(shù)據(jù)流及其實例NetworkStreamns此類提供訪問網(wǎng)絡(luò)的根底數(shù)據(jù)流的方法。其中最根本也是最重要的兩個方法就是Write〔〕和Read〔〕方法,至于參數(shù)不再次贅述。3〕一維字符串?dāng)?shù)組變量FilePath此字符串?dāng)?shù)組主要用來存放用戶選擇的附件的絕對途徑名,并在發(fā)送帶附件的郵件時用到。4〕發(fā)送郵件所需的根本參數(shù)比如用于ESMTP等錄檢驗用的用戶名、密碼,發(fā)送郵件需求的收信人,發(fā)信人地址以及主題等等在此不再贅述。4.1.2主要成員函數(shù)闡明1〕重載的構(gòu)造函數(shù)SmtpMail〔〕 此函數(shù)主要用于在初始化過程中,把用戶選擇的附件的途徑以參數(shù)的方式傳給FilePath。2〕添加附件的函數(shù) AddAttachment 傳給FilePath的途徑,經(jīng)過這樣一個函數(shù)就可以循環(huán)的動態(tài)的添加到IList接口的一個對象中了,方便以后在詳細的實現(xiàn)的過程中的運用。3〕得到上傳的附件的文件流 GetStream 由于在網(wǎng)絡(luò)中的操作都是以網(wǎng)絡(luò)流的方式來實現(xiàn)的,因此先將上傳的附件轉(zhuǎn)換成文件流,然后再用Write的方法把這些附件的文件流寫入到網(wǎng)絡(luò)中,來完成發(fā)送附件的操作。4〕將字符串編碼為Base64字符串的函數(shù) Base64Encode 由于ESMTP的LOGIN認證機制是采用Base64編碼,當(dāng)用戶發(fā)出AUTHLOGIN的命令后,效力器前往334的應(yīng)對碼等待用戶輸入。假設(shè)身份確認后效力器前往235的應(yīng)對碼,否那么前往失敗信息。所以要將用戶名和密碼轉(zhuǎn)換成Base64編碼然后再發(fā)給效力器。此函數(shù)的作用就是把給定的字符串轉(zhuǎn)換成相應(yīng)的Base64編碼的字符串。5) 發(fā)送SMTP命令的函數(shù) SendCommand 這個函數(shù)的作用是把SMTP命令的字符串轉(zhuǎn)換成對應(yīng)的字節(jié)型值〔C#中規(guī)定的Write方法只能寫入字節(jié)型的數(shù)據(jù)〕然后寫入網(wǎng)絡(luò)中,假設(shè)操作勝利就前往一個標(biāo)志為真的布爾型變量,假設(shè)操作失敗或者發(fā)生異常就前往標(biāo)志為假的布爾型變量6) 接受效力器應(yīng)對的函數(shù) RecvResponse它的作用就是從網(wǎng)絡(luò)流中讀取效力器前往的字節(jié)型的信息,將其轉(zhuǎn)換成字符串型的變量,然后將其前往,可以經(jīng)過其前往值來判別操作能否勝利。詳細實現(xiàn)代碼如下所示:7)重載的函數(shù)Dialog它們的作用是與效力器交互,發(fā)送命令并接納回應(yīng)。不同的是參數(shù)是字符串類型的那個函數(shù),每次發(fā)送一條命令,并接受效力器的呼應(yīng),根據(jù)呼應(yīng)的信息來判別交互的結(jié)果能否勝利。而參數(shù)是字符串?dāng)?shù)組的函數(shù)每次發(fā)送的是一組命令,用于和效力器的交互,這個函數(shù)主要是用于ESMTP效力器的驗證的功能,由于驗證的過程是一個等待然后又輸入的過程,因此將他們放在一個數(shù)組中有利于了解和操作。而他們的實現(xiàn)主要是經(jīng)過調(diào)用上面的發(fā)送SMTP命令函數(shù)SendCommand以及接受SMTP效力器呼應(yīng)的函數(shù)RecvResponse來實現(xiàn)的。詳細的代碼如下所示:8) 郵件發(fā)送程序 SendMail這是整個程序的中心部分。詳細的實現(xiàn)SMTP協(xié)議的程序正是經(jīng)過它一步一步實現(xiàn)并最終實現(xiàn)發(fā)送簡單郵件甚至帶附件的郵件的功能。而它的實現(xiàn)是調(diào)用以上給出的各個函數(shù)的結(jié)果。以下就簡單的經(jīng)過幾個SMTP命令的格式來實現(xiàn)privateboolSendEmail() { //銜接網(wǎng)絡(luò) try { //建立一個TCP銜接 tc=newTcpClient(mailserver,mailserverport); } catch { MessageBox.Show("銜接失敗","請確認"); returnfalse; } //獲取當(dāng)前流的資料 ns=tc.GetStream(); SMTPCodeAdd(); //驗證網(wǎng)絡(luò)銜接能否正確 if(RightCodeHT[RecvResponse().Substring(0,3)]==null) { returnfalse; } string[]SendBuffer;
if(ESmtp) { SendBuffer=newString[4]; SendBuffer[0]="EHLO"+mailserver+enter; SendBuffer[1]="AUTHLOGIN"+enter; SendBuffer[2]=Base64Encode(username)+enter; SendBuffer[3]=Base64Encode(password)+enter;if(!Dialog(SendBuffer,"SMTP效力器驗證失敗,請核對用戶名和密碼。")) returnfalse; } else { SendBufferstr="HELO"+mailserver+enter; if(!Dialog(SendBufferstr,"")) returnfalse; } SendBufferstr="MAILFROM:<"+From+">"+enter; if(!Dialog(SendBufferstr,"發(fā)件人地址錯誤,或不能為空")) returnfalse; //把傳過來的收件人的地址分割然后提交給效力器 stringsplit=";";
string[]address=Regex.Split(Recipient,split); SendBuffer=newstring[address.Length]; for(inti=0;i<SendBuffer.Length;i++) { SendBuffer[i]="RCPTTO:<"+address[i]+">"+enter; } if(!Dialog(SendBuffer,"收件人地址有誤")) returnfalse; SendBufferstr="DATA"+enter; if(!Dialog(SendBufferstr,"")) returnfalse; SendBufferstr="From:"+FromName+"<"+From+">"+enter;SendBufferstr+=enter+"."+enter; if(!Dialog(SendBufferstr,"錯誤信件信息")) returnfalse; SendBufferstr="QUIT"+enter; if(!Dialog(SendBufferstr,"斷開銜接時錯誤")) returnfalse; //封鎖流對象 ns.Close(); //封鎖銜接 tc.Close(); FilePath=null; returntrue; }4.2AddExtra類 這個附加的小類只是提供一些前往當(dāng)前系統(tǒng)時間,獲取主機名,主機IP,有關(guān)協(xié)助等小的功能,在此僅對協(xié)助信息中的“關(guān)于〞操作函數(shù)稍加闡明。由于它闡明了在CSharp中調(diào)用WindowsAPI函數(shù)所需如下幾個步驟:4.2.1調(diào)用WindowsAPI所需的命名空間----usingSystem.Runtime.InteropServices;而調(diào)用顯示關(guān)于對話框的函數(shù)ShellAbout還需求用到兩個命名空間如下所示---usingSystem.Reflection;---usingSystem.Diagnostics;4.2.2在程序中聲明所需的API函數(shù)[DllImport("shell32.dll")]staticexternintShellAbout(IntPtrhWnd,stringszApp,stringszOtherStuff,IntPtrhIcon);4.2.3在程序中詳細的運用Assemblyass=Assembly.GetExecutingAssembly();FileVersionInfomyVersion=FileVersionInfo.GetVersionInfo(ass.Location);ShellAbout(this.Handle,"郵件收發(fā)系統(tǒng)#","版本"+myVersion.FileMajorPart+"."+myVersion.FileMinorPart+"."+myVersionpanyName,this.Icon.Handle);至此就完成了在CSharp中調(diào)用WindowsAPI函數(shù)的過程。而在此程序中最主要的調(diào)用了兩個WINDOWSAPI函數(shù),一個就是動態(tài)的獲取圖標(biāo)句柄的函數(shù)SHGetFileInfo()和動態(tài)調(diào)用相關(guān)聯(lián)的翻開指定程序的函數(shù)ShellExecute().下面章節(jié)將對這兩個函數(shù)進展完全的用法解析。4.3程序用到的主要API函數(shù)完全解析 SHGetFileInfo用法完全解析一.函數(shù)名:SHGetFileInfo二.作用:動態(tài)的獲取圖標(biāo)的句柄三.在C#中的聲明方式:[DllImport(“shell32.dll〞)]PrivatestaticexternintShGetFileInfo(stringpszPath,uintdwAttributes,refSHFILEINFOpsi,uintcbFileInfo,uintflags);四.各個參數(shù)的解析:1.pszPath-指定的文件名〔可以是絕對的途徑,也可以是相對的途徑〕。 當(dāng)uFlags的取值中不包含SHGFI_PIDL時,可直接指定;否那么 pszPath要經(jīng)過計算獲得,不能直接指定;2.dwFileAttributes-文件屬性。 僅當(dāng)uFlags的取值包含SHGFI_USEFILEATTRIBUTES時 有效,普通不用此參數(shù)。3.psfi-前往獲取的文件的信息。是一個構(gòu)造體類型的變量。它的原型如下所示: privatestructSHFILEINFO { publicIntPtrhIcon; publicintiIcon; publicuintdwAttributes; [MarshalAs(UnmanagedType.LPStr,SizeConst=256)] publicstringszDisplayName; [MarshalAs(UnmanagedType.LPStr,SizeConst=80)] publicstringszTypeName; }; 各個參數(shù)代表的含義: 1)hIcon-文件的圖標(biāo)句柄。 2)iIcon-圖標(biāo)的系統(tǒng)索引號。 3)dwAttributes-文件的屬性值。 4)szDisplayName-文件的顯示名〔稱號的最大長度〕。 5)szTypeName-文件的類型名〔最大長度默許是80個字符〕。4.cbFileInfo-psfi的字節(jié)數(shù)。5.uFlags-指明需求前往的文件信息標(biāo)識符。常用的是:SHGFI_ICON;//獲得圖標(biāo)
SHGFI_DISPLAYNAME;//獲得顯示名
SHGFI_TYPENAME;//獲得類型名
SHGFI_ATTRIBUTES;//獲得屬性
SHGFI_LARGEICON;//獲得大圖標(biāo)
SHGFI_SMALLICON;//獲得小圖標(biāo)
SHGFI_PIDL;//pszPath是一個標(biāo)識符五.補充闡明:函數(shù)SHGetFileInfo()的前往值也隨uFlags的取值變化而有所不同。經(jīng)過調(diào)用SHGetFileInfo()可以由psfi參數(shù)得到文件的圖標(biāo)句柄,但要留意在uFlags參數(shù)中不運用SHGFI_PIDL時,SHGetFileInfo()不能獲得"我的電腦"等虛似文件夾的信息。
ShellExecute用法完全解析一.函數(shù)名:ShellExecute二.作用: ShellExecute不僅可以運轉(zhuǎn)EXE文件,也可以運轉(zhuǎn)曾經(jīng)關(guān) 聯(lián)的文件。三.在C#中的聲明://EntryPoint給出Dll入口點的稱號,假設(shè)沒有給出,那么用方法本身的稱號。[DllImport("shell32.dll",EntryPoint="SHGetFileInfo")]privatestaticexternintShellExecute(IntPtrhwnd,stringOperation,stringFileName,stringParameters,stringDirectory,intShowCmd);四.各個參數(shù)解析: ●hWnd:用于指定父窗口句柄。當(dāng)函數(shù)調(diào)用過程出現(xiàn)錯誤時,它將作為Windows音訊窗口的父窗口。例如,可以將其設(shè)置為運用程序主窗口句柄,即Application.Handle,也可以將其設(shè)置為桌面窗口句柄〔用GetDesktopWindow函數(shù)獲得〕。●Operation:用于指定要進展的操作。其中“open〞操作表示執(zhí)行由FileName參數(shù)指定的程序,或翻開由FileName參數(shù)指定的文件或文件夾;“print〞操作表示打印由FileName參數(shù)指定的文件;“explore〞操作表示閱讀由FileName參數(shù)指定的文件夾。當(dāng)參數(shù)設(shè)為nil時,表示執(zhí)行默許操作“open〞。●FileName:用于指定要翻開的文件名、要執(zhí)行的程序文件名或要閱讀的文件夾名?!馪arameters:假設(shè)FileName參數(shù)是一個可執(zhí)行程序,那么此參數(shù)指定命令行參數(shù),否那么此參數(shù)應(yīng)為nil或PChar(0)?!馜irectory:用于指定默許目錄?!馭howCmd:假設(shè)FileName參數(shù)是一個可執(zhí)行程序,那么此參數(shù)指定程序窗口的初始顯示方式,否那么此參數(shù)應(yīng)設(shè)置為0。假設(shè)ShellExecute函數(shù)調(diào)用勝利,那么前往值為被執(zhí)行程序的實例句柄。假設(shè)前往值小于32,那么表示出現(xiàn)錯誤。五.補充闡明 上述僅僅是ShellExecute函數(shù)的規(guī)范用法5.軟件運轉(zhuǎn)界面5.1新建郵件帳號用戶翻開軟件之后,需求新建一個郵件
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度新能源儲能項目農(nóng)民工勞務(wù)合同規(guī)范4篇
- 二零二五版年薪制勞動合同:大數(shù)據(jù)分析行業(yè)專家協(xié)議4篇
- 2025年度農(nóng)行房貸利率調(diào)整專項合同書2篇
- 二零二五白蟻滅治與老舊建筑改造服務(wù)合同3篇
- 二零二五年度建筑工程合同履行補充協(xié)議范本3篇
- 個人承包旅游景區(qū)開發(fā)與經(jīng)營合同(2024版)3篇
- 二零二五年度節(jié)能環(huán)保門窗定制采購合同2篇
- 二手住宅買賣合同(2024版)范例2篇
- 二零二五版木托盤租賃與物流信息化建設(shè)合同4篇
- 管理決策知到智慧樹章節(jié)測試課后答案2024年秋山西財經(jīng)大學(xué)
- 飛鼠養(yǎng)殖技術(shù)指導(dǎo)
- 壞死性筋膜炎
- 2024輸血相關(guān)知識培訓(xùn)
- 整式的加減單元測試題6套
- 股權(quán)架構(gòu)完整
- 山東省泰安市2022年初中學(xué)業(yè)水平考試生物試題
- 注塑部質(zhì)量控制標(biāo)準全套
- 人教A版高中數(shù)學(xué)選擇性必修第一冊第二章直線和圓的方程-經(jīng)典例題及配套練習(xí)題含答案解析
- 銀行網(wǎng)點服務(wù)禮儀標(biāo)準培訓(xùn)課件
- 二年級下冊數(shù)學(xué)教案 -《數(shù)一數(shù)(二)》 北師大版
- 晶體三極管資料
評論
0/150
提交評論