freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

一個(gè)smtp客戶端程序的設(shè)計(jì)與實(shí)現(xiàn)—畢業(yè)設(shè)計(jì)論文-閱讀頁(yè)

2024-12-19 11:23本頁(yè)面
  

【正文】 法的實(shí)現(xiàn)中,通過(guò)調(diào)用該方法就可以獲得一個(gè)滿足 SMTP 協(xié)議要求的郵件頭。根據(jù) SMTP 協(xié)議的規(guī)定:郵件的正文和附件消息均要滿足固定的格式。該方法中規(guī)定的郵件分隔標(biāo)志為 BOUNDARY,該標(biāo)志由 PrepareHeader()方法中定義。所有附件添加結(jié)束后,會(huì)添加一個(gè)為“ BOUNDARY”的結(jié)束符號(hào)。 三、 CMIMEMessage 子模塊:該模塊用于表示郵 件的附件。并提供了能夠取出這些屬性的方法。 圖 6 CMIMEMessage類圖 成員變量說(shuō)明 : 1) protected CString m_Filename:保護(hù)成員變量,表示附件所代表的文件的文件名。 2) protected CString m_FileContent、 TCHAR * m_ContentBuffer:保護(hù)成員變量,表示附件所代表的文件的內(nèi)容。 成員 函數(shù) 說(shuō)明: 1) public BOOL Attach(const CString amp。并且根據(jù)傳遞進(jìn)來(lái)的參數(shù),分別給 bufLen、 m_FileContent、 m_Filename、m_Title 等成員變量賦值。 2) public CString GetFilename() 、 CString GetTitle() 、 CString GetContent()、 TCHAR * GetContentBuffer()、 DWORD GetBufferLength():上述 方法作用分別為獲取附件名稱、附件標(biāo)題、附件內(nèi)容(以字符串形勢(shì)返回)、附件內(nèi)容(以數(shù)組方式返回)、附件的長(zhǎng)度。 四、 CBASE64 子模塊:在 SMTP 的相關(guān)協(xié)議中規(guī)定,對(duì)于身份驗(yàn)證的用戶名、密碼、郵件的正文以及附件的內(nèi)容均要采用 BASE64 的方式進(jìn)行編碼。提供了對(duì)兩種數(shù)據(jù)源的加密操作和一種解密操作。 圖 7 CBASE64類圖 成員變量說(shuō)明: 1) static CString base64:該變量是歸類所屬的成員變量。 2) private CString sEncode 、 CString sDecode:表示編碼和解碼的數(shù)據(jù)。參數(shù)為編碼前的長(zhǎng)度,返回值為編碼后的長(zhǎng)度。參數(shù) TCHAR *buf 表示要進(jìn)行編碼的數(shù)據(jù)的首地址,參數(shù) DWORD nSize 則表示要編碼的長(zhǎng)度。本類為該方法提供了一個(gè)重載的方法,其參數(shù)為 CString szEncoding 和 int nSize。在兩種方法中,返回值均為編碼后的數(shù)據(jù)。length):根據(jù) BASE64 編碼方式的定義,在解碼過(guò)程中,要先把要編碼后的數(shù)據(jù)根據(jù) BASE64的對(duì)應(yīng)表變換成編碼時(shí)所得到的中間碼。參數(shù) CString sTemp 和 int amp。 4) CString CBASE64::Decode(CString szDecoding , int nSize):該方法 的作用是根據(jù)傳遞進(jìn)來(lái)的參數(shù)對(duì)數(shù)據(jù)進(jìn)行解碼。一個(gè)良好的界面能夠帶給用戶以愉快的使用體驗(yàn),從而會(huì)加大對(duì)作品的喜愛(ài)程度。這三個(gè)類均由 IDE環(huán)境的 AppWizard 功能導(dǎo)航完成。本軟件采用的是第一種。代表當(dāng)前的應(yīng)用程序。這個(gè)類定義的對(duì)象可以說(shuō)是程序的入口點(diǎn) (并不是真正的入口,真正的入口是 WinMain 函數(shù) )。定義一個(gè)該類的全局對(duì)象是程序能夠運(yùn)行與否的關(guān)鍵部分。用于提供美觀、方便操作 的界面給用戶使用并保存用戶輸入的數(shù)據(jù)。該類是本軟件的操作平臺(tái)。該對(duì)話框資源如圖 8 所示。其對(duì)應(yīng)的對(duì)話框資源如圖 9 所示。其中界面類由 MFC 自動(dòng)創(chuàng)建,而工具類則由作者設(shè)計(jì)完成,整個(gè)軟件的開(kāi)發(fā)過(guò)程就是把工具類添加進(jìn)界面類并使 之能夠協(xié)調(diào)工作的過(guò)程 ( 開(kāi)發(fā)者的工作都是這樣)。在主界面對(duì)話框的相關(guān)事件處理方法中,會(huì)調(diào)用CSMTP 的連接和傳送消息方法,并把用戶輸入的數(shù)據(jù)裝配為一個(gè)完整的CMailMessage 消息供 CSMTP 使用。在 CSMTP 和 CMailMessage中又會(huì)看到,它們對(duì) CBASE64 類的調(diào)用。 類的關(guān)系圖如圖 10所示。 郵件發(fā)送實(shí)現(xiàn) 在郵件發(fā)送之前首先要與服務(wù)器建立連接,該操作由 CSMTP 類的 Connect 操作完成。 //首先要建立接收消息緩沖區(qū),接收服務(wù)器的消息 thisresponseBuf = new TCHAR[RESPONSE_BUFFER_SIZE]。 if( !this()) //用用戶指定的服務(wù)器和端口號(hào)碼連接到服務(wù)器,成功繼續(xù)執(zhí)行 ; 失敗返回 if( !this(p,thisGetPort())) //接收服務(wù)器發(fā)送的消息代碼,為 220 說(shuō)明服務(wù)器接受了請(qǐng)求,否則出錯(cuò) if(!thisGetResponse(SMTP_SERVER_READY) ) //發(fā)送 EHLO 命令給服務(wù)器,要求建立一條通信通道 (EHLO %s\r\n , localHostName)。if( !thisGetResponse(SMTP_SERVER_TASK_FINISH) ) 如果在上述過(guò)程中沒(méi)有出錯(cuò),那么就得到了一條客戶端與服務(wù)器進(jìn)行信息交互的通道。綜上所述,建立與服務(wù)器連接過(guò)程程序流程圖如圖 11所示。連接建立結(jié)束。相關(guān)的操作是在 CSMTP 類中的 TransmitMessage 方法中完成的。發(fā)送后等待服務(wù)器的回復(fù),如果回復(fù)為 AUTH_OK, //那么繼續(xù)下面的操作,否則返回錯(cuò)誤信息 ( _T(AUTH LOGIN\r\n) ) 。 if( !thisGetResponse(AUTH_OK) ) //使用 CBASE64 對(duì)用戶名進(jìn)行加密并發(fā)送 CString username = ( sFrom , () )+\r\n 。 if( !thisGetResponse(AUTH_OK) ) //使用 CBASE64 對(duì)密碼進(jìn)行加密并發(fā)送 ,如果驗(yàn)證成功,服務(wù)器會(huì)返回 //AUTH_SUCCESSFULLY 來(lái)標(biāo)識(shí)。 password = (password , ())+\r\n。 if( !thisGetResponse(AUTH_SUCCESSFULLY) ) //接下來(lái)發(fā)送 MAIL FROM: SOURCE命令; //RCPT TO:Destination命令; //DATA 命令,當(dāng) DATA 命令傳送結(jié)束后就是對(duì)郵件內(nèi)容的傳遞。 this( (LPCTSTR)sTemp , () )。 } //在郵件內(nèi)容的末尾,是規(guī)定的格式“ \r\n.\r\n” ,當(dāng)服務(wù)器接收到這些字符時(shí)就會(huì)知道,郵件內(nèi)容的傳送已經(jīng)結(jié)束了。//結(jié)束符號(hào) this( (LPCTSTR)sTemp , () )。 if( !thisGetResponse(SMTP_SERVER_TASK_FINISH) ){ return FALSE 。 this( (LPCTSTR)sTemp , () )。} 如果上述過(guò)程都是正確的,那么說(shuō)明郵件已經(jīng)正確的發(fā)出。對(duì)于在郵件的發(fā)送過(guò)程中,正文也是通過(guò)上述方法進(jìn)行傳遞的,只是正文的內(nèi)容由 CMailMessage 進(jìn)行了封裝實(shí)現(xiàn),而 CSMTP 所作的工作只是發(fā)送而已。程序流程圖如圖 12 所示。有關(guān)郵件頭的操作封裝在 CMailMessage 類的PrepareHeader 方法中,方法內(nèi)容如下: //指明目的地 sTemp = _T(To: )。 ithisGetNumberRecipients() 。 sTemp += (i0?_T(,):_T())。 sTemp += _T()。 sTemp += _T()。 //指定發(fā)送的時(shí)間 thism_tDateTime = this()。 sTemp += this(%a, %d %b %y %H:%M:%S %Z)。 thisAddToHeader(sTemp) 。sTemp +=_T(\r\n)。 BOUNDARY=BOUNDARY)。 有關(guān)郵件正文的操作則封裝在 PrepareBody 方法中 ,方法如下: //給正文添加一段相關(guān)的分割標(biāo)志,以及正文的格式 CString bodyHeader = _T(\r\nBOUNDARY\r\n)\ _T(Contenttype: text/plain。 CBASE64 base64 。 thism_sBody = bodyHeader + () 。 ithis() 。 CMIMEMessage*pAttachment= (CMIMEMessage*) (i)。 name=%s\r\n)\ _T(ContentTransferEncoding: base64\r\n)\ T(ContentDisposition: attachment。 TCHAR * buf = pAttachmentGetContentBuffer() 。 (buf , pAttachmentGetBufferLength())。 sContent += \r\n\r\n 。} //給郵件添加一個(gè)正文結(jié)束符號(hào) CString szFinalBoundary = \r\n\r\nBOUNDARY 。 thism_AttachmentString = sTemp 。 通過(guò) PrepareBody 操作可以把郵件的正文進(jìn)行格式化,并保存,以供 CSMTP使用。畢竟 CMailMessage 類是用于掌管郵件內(nèi)容的類,沒(méi)有把與郵件有關(guān)的東西交給它更令人放心的了。 圖 13 郵件格式示例 郵件的編碼方式 目前幾乎所有實(shí)現(xiàn)了 SMTP 協(xié)議的郵件服務(wù)器都要求 發(fā)送者進(jìn)行所謂的身份驗(yàn)證。 而為了能夠提供多語(yǔ)言的支持(比如有些服務(wù)器能夠提供中文的用戶名)那么在發(fā)送信息的時(shí)候就要把發(fā)出的消息轉(zhuǎn)化成由’ az’、’ AZ’ , ‘ 09’ ,’ +’ ,’ /’ 64 個(gè)字符組成的文本信息。不僅僅是身份驗(yàn)證需要 BASE64 編碼,郵件的正文和附件都需要轉(zhuǎn)化成 BASE64 格式的編碼。把原文的 24 個(gè)二進(jìn)制位當(dāng)成一個(gè) bit 流,從左到右每 6位為一個(gè)單元提取出來(lái),作為一個(gè)索引值。不足 4 個(gè)字 符的用‘ =’進(jìn)行補(bǔ)齊。編碼實(shí)現(xiàn)如下: //計(jì)算編碼后的消息長(zhǎng)度 int buflen = nSize/3 * 3 。 i buflen。0xfc)2 )。0x03)4)+((szEncoding[i+1]amp。 sTemp+=_T(((szEncoding[i+1]amp。0xc0)6))。0x3f))。 sTemp += _T( (szEncoding[i]amp。 sTemp += _T( ((szEncoding[i]amp。 sTemp += _T(64) 。 }else if(n%3==2) { //如果有兩個(gè)剩余的字符,那么用一個(gè) =補(bǔ)足 sTemp += _T( (szEncoding[i]amp。 sTemp+=_T((szEncoding[i]amp。0xf0)4) sTemp += _T( ((szEncoding[i+1]amp。 sTemp += _T( 64 )。ilen。 } BASE64 的編碼方式流程圖 如圖 14 所示。所有的測(cè)試測(cè)試工作大概可以分為兩個(gè)時(shí)期:第一時(shí)期是在完成子模塊后,對(duì)子模塊進(jìn)行單獨(dú)的測(cè)試;第二時(shí)期則是所有模塊完成后,連接成 整個(gè)軟件時(shí)所作的系統(tǒng)測(cè)試。 子模塊測(cè)試:模塊完成后,針對(duì)每個(gè)子模塊進(jìn)行了簡(jiǎn)單的單元測(cè)試。在測(cè)試前,事先準(zhǔn)備了測(cè)試所用的數(shù)據(jù)和預(yù)期的結(jié)果。整個(gè)過(guò)程是迭代式的,從最初的版本得到最終的結(jié)果。傳遞源給 CBASE64 對(duì)象的 Encode 方法,然后從方法中獲得結(jié)果,與預(yù)期結(jié)果進(jìn)行比對(duì)。否則,修改代碼。調(diào)用準(zhǔn)備測(cè)試的方法,得到結(jié)果。 3) 傳遞第三個(gè)源數(shù)據(jù),如: xiaxia(長(zhǎng)度為 3n)和預(yù)期結(jié)果。 如果能夠順利通過(guò)上述的三個(gè)測(cè)試用例,那么說(shuō)明對(duì)于加密的數(shù)據(jù)的長(zhǎng)度是沒(méi)有提供限制的。如果均能通過(guò)測(cè)試,那么就通過(guò)測(cè)試, 否則就需要更改代碼。當(dāng)完成了所有模塊的子模塊測(cè)試,那么就進(jìn)行第二階段的測(cè)試。把所有子模塊鏈接為一個(gè)完整的 系統(tǒng),在整合的過(guò)程中可能會(huì)出現(xiàn)許多問(wèn)題,因此系統(tǒng)測(cè)試必不可少。主要目標(biāo)是發(fā)現(xiàn)與接口有關(guān)的問(wèn)題,測(cè)試每個(gè)功能是否都能正常工作。測(cè)試用例如下: 服務(wù)器: 發(fā)信人: wangyoucao2020163 收信人: 標(biāo)題: test 正文:測(cè)試用例 密碼: ********(發(fā)信人的密碼 ) 單擊確定后,發(fā)送郵件,發(fā)送成功返回正確信息。 圖 15 發(fā)送成功 服務(wù)器: 發(fā)信人: 收信人: 標(biāo)題:測(cè)試 正文:測(cè)試 密碼: 123456(錯(cuò)誤密碼) 單擊確定后發(fā)送,發(fā)送失敗,返回錯(cuò)誤信息,如 圖 16所示。 當(dāng)然,本次完成的軟件不是完美無(wú)缺的。但是不可能完全杜絕軟件中的錯(cuò)誤。 結(jié) 論 成果 通過(guò)一段時(shí)間的學(xué)習(xí)和準(zhǔn)備工作,在計(jì)劃規(guī)定的時(shí)間內(nèi),完成了系統(tǒng)的基本功能,能夠滿足預(yù)期需求。在發(fā)送成功時(shí)能夠返回正確信息;發(fā)送錯(cuò)誤時(shí),能夠返回錯(cuò)誤的代碼和原因。 體會(huì) 這次做的項(xiàng)目帶有一定的學(xué)習(xí)目的,在整個(gè)的開(kāi)發(fā)過(guò)程中學(xué)到了很多知識(shí)。其次,我體會(huì)到了動(dòng)手實(shí)踐能力的重要性,有許多知識(shí)在理
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1