【正文】
sTemp , int amp。本方法根據(jù) BASE64 編碼的定義,對(duì)數(shù)據(jù)進(jìn)行了編碼。 成員 函數(shù) 說(shuō)明: 1) public DWORD CBASE64::ComputeLen(DWORD size):該方法的作用是計(jì)算編碼后數(shù)據(jù)的長(zhǎng)度 。其類圖 如圖 7所示。為類的調(diào)用者提供了統(tǒng)一的操作接口。sFilename):該方法的作用是根據(jù)傳遞進(jìn)來(lái)的參數(shù)文件名,來(lái)把本地文件中的內(nèi)容讀取出來(lái),并添加到當(dāng)前附件對(duì)象中。添加到郵件時(shí)使用。使用該類可以根據(jù)提供的文件名讀取出正確的文件,保存文件名和標(biāo)題。在方法中,根據(jù)當(dāng)前添加的郵件附件的個(gè)數(shù)來(lái)添加標(biāo)志。 7) public virtual void PrepareBody():該方法的作用是生成一個(gè)滿足SMTP 協(xié)議的郵件體。根據(jù) SMTP 協(xié)議的規(guī)定,郵件的頭包括: From、 To(可重復(fù)多次 )、 Subject、 Date、 XMailer、 MIMEVersion: 、 Contenttype 等多 個(gè)域。szEmailAddress 表示郵件的地址, szFriendlyName 表示名稱。分別代表:普通接收者,抄送和密送。 2) public int GetAttachmentNum():該方法的作用是獲取當(dāng)前附件的個(gè)數(shù)。 成員函數(shù)說(shuō)明: 1) public int AddAttachMent(CString filename):該方法的作用是添加根據(jù)參數(shù)提供的文件名稱,把該文件當(dāng)成附件添加到當(dāng)前的郵件中。 m_Recipients:私有成員變量。對(duì)于每個(gè)域均有一對(duì)對(duì)應(yīng)的存取方法 Get 和 Set 來(lái)對(duì)其進(jìn)行操作。 圖 5 CMailMessage類類圖 成員變量 說(shuō)明 : 1) public CPtrArray m_Attachments:公有成員變量,表示郵件的附件。 二、 CMailMessage 子模塊:該模塊用于表示郵件的所有內(nèi)容,如:郵件的發(fā)送者、接收者、標(biāo)題、正文以及附件。 8) protected static ResponseCode* GetServerResponseMessage(UINT):該方法的作用是根據(jù)傳遞進(jìn)來(lái)的消息碼來(lái)返回一個(gè)與消息碼對(duì)應(yīng)的服務(wù)器消息 。在 SMTP協(xié)議中規(guī)定 :郵件正文以 DATA命令開始,以“ ”標(biāo)志結(jié)束,為了避免在郵件正文中,出現(xiàn)上述的結(jié)束標(biāo)志,必須在發(fā)送郵件前檢測(cè)郵件,把郵件中所有的與郵件結(jié)束符號(hào)相 同的字 符替換為“ CRLF..CRLF”,來(lái)避免在郵件發(fā)送時(shí)出現(xiàn)結(jié)束位置 不明 的錯(cuò)誤。本方法的參數(shù) msg 應(yīng)包含就是要發(fā)送的郵件的信息,如發(fā)送的來(lái)源、目的地、郵件的題目、發(fā)送時(shí)間、正文內(nèi)容以及附件,均存儲(chǔ)在 msg 對(duì)象中。通過(guò)該方法,可以根據(jù)SetServerProperties 方法設(shè)置的屬性,連接到指定的服務(wù)器 。 3) public CString GetLastError():通過(guò)調(diào)用該方法,能夠獲取服務(wù)器返回的錯(cuò)誤信息。如果判斷正確,那么返回 TRUE;否則返回 FALSE。 6) protected TCHAR* responseBuf:保護(hù)成員變量,用于存放服務(wù)器返回的消息。 3) private CString m_nSMTPServerHostName:私有成員變量,表示服務(wù)器的名稱。 TRUE 表示已連接; FALSE 表示沒(méi)有進(jìn)行連接。其他模塊只需調(diào)用其接口方法,并傳遞正確的參數(shù),就可以方便的與服務(wù)器建立連接,并傳送郵件內(nèi)容。 一、 CSMTP 子模塊:該模塊封裝了有關(guān)郵件發(fā)送過(guò)程的操作。結(jié)構(gòu)清晰,功能相對(duì)完備,既完成了預(yù)期的需求,也學(xué)習(xí)到了有關(guān) SMTP 協(xié)議的知識(shí)。利用其面向?qū)ο蟮奶匦?,在開發(fā)過(guò)程中能夠方便的向軟件添加功能。開發(fā)者可能會(huì)花大量的時(shí)間在分析事件的流程上,而不是程序的邏輯。 整個(gè)工程使用 C語(yǔ)言實(shí)現(xiàn) 論速度而言,除開低等的匯編, C語(yǔ)言絕對(duì)的獨(dú)占熬頭,并且 C語(yǔ)言的語(yǔ)法簡(jiǎn)單,構(gòu)建出的程序結(jié)構(gòu)也清晰。如果選擇使用 JAVA 作為開發(fā)語(yǔ)言,并使用一種集成 IDE,如:JBUILDER。 6) 圖形界面編程。 3) 提供 BASE64 的加密算法,能夠?qū)τ脩糨斎氲臄?shù)據(jù)進(jìn)行加密。 4)可以發(fā)送郵件信息(含附件)。 4 SMTP 協(xié)議客戶端軟件設(shè)計(jì)與實(shí)現(xiàn) 需求分析與總體設(shè)計(jì) 功能分析 由本設(shè)計(jì)的題目可知,本設(shè)計(jì)的目的就是建立一款能夠發(fā)送郵件的客戶端軟件。除非你是個(gè)只喜歡把代碼都 CO、 CO進(jìn)去的時(shí)間浪費(fèi)者,否則選擇選擇 VC++這樣的 IDE無(wú)疑會(huì)對(duì)你有很大的幫助。作為一款優(yōu)秀的集成開發(fā)環(huán)境,它提供了很多方便開發(fā)的功能。在整個(gè)程序的構(gòu)建時(shí),也是使用了這 個(gè)大名鼎鼎的 Microsoft Foundation Class 框架。由軟件業(yè)巨頭微軟強(qiáng)力推出。生成一個(gè)能夠向任何實(shí)現(xiàn)了 SMTP 協(xié)議的郵件服務(wù)器發(fā)送郵件的客戶端軟件,服務(wù)器端可以任意選取(實(shí)現(xiàn) SMTP 協(xié)議即可)。為了加深對(duì) SMTP 協(xié)議的理解,全面掌握 SMTP 協(xié)議,提高動(dòng)手能力和解決實(shí)際問(wèn)題的能力,而 提出了該課題。(可以把其看成是 822 文檔的全面升級(jí)版本,當(dāng)然這種說(shuō)法并不準(zhǔn)確,因?yàn)樗鼈児餐c(diǎn)僅僅是都對(duì)內(nèi)容格式進(jìn)行說(shuō)明??蛻舳税l(fā)送密碼給服務(wù)器,等待服務(wù)器的驗(yàn)證結(jié)果,服務(wù)器返回235 Authentication successful 信息給客戶端。然后繼續(xù)發(fā)送 250 應(yīng)答碼,要求客戶端去進(jìn)行身份驗(yàn)證。 C: AUTH LOGIN S: 334 Username 的 BASE64 編碼 C: 用戶名 的 BASE64 編碼 S: 334 Password 的 BASE64 編碼 C: 密碼的 BASE64 編碼 S: 235 Authentication successful. 當(dāng)客戶端發(fā)送連接請(qǐng)求到 服務(wù)器時(shí),服務(wù)器返回 220 應(yīng)答碼,說(shuō)明目前服務(wù)器已經(jīng)準(zhǔn)備工作。 RFC2554 文檔: ESMTP( SMTP Service Extension for Authentication),它是對(duì) SMTP 協(xié)議的擴(kuò)展,確切來(lái)說(shuō)是對(duì)于郵件傳輸中有關(guān)身份認(rèn)證部分的規(guī)定。沒(méi)有 改變?nèi)魏卧械拿?,只是?jiǎn)單的增加了內(nèi)容。 圖 3 SMTP協(xié)議規(guī)定的命令關(guān)鍵字 相關(guān)協(xié)議的簡(jiǎn)單介紹 電子郵件系統(tǒng)經(jīng)過(guò)幾十年的發(fā)展,已經(jīng)形成了較為完善的技術(shù)體系。服務(wù)器會(huì) 回 復(fù)它一個(gè)正常的代碼。信道正常被建立或銷毀的時(shí)候,服務(wù)器端和客戶端會(huì)分別依靠命令和應(yīng)答碼來(lái)打開或關(guān)閉信道。在 SMTP 中規(guī)定了建立和銷毀通道的命令。 S:MAIL FROM: R: 250 OK S: RCPT TO: R: 250 OK S: RCPT TO: R: 550 No such user here S: RCPT TO: R: 250 OK S: DATA R: 354 Start mail input。 上面所述的過(guò)程是一個(gè)發(fā)送操作。 注意:郵件內(nèi)容包括如下提示: Date , Subject , From , To 。 DATACRLF 如果命令被接收,接收方返回一個(gè) 354 Intermediate 應(yīng)答,并認(rèn)定以下的 各行都是信件內(nèi) 容。如果接收者未知,接收方會(huì)返回一個(gè) 550 Failure 應(yīng)答。如果請(qǐng)求被接收,接收方返回一個(gè) 250 OK應(yīng)答。一系列或更多的 RCPT 命令緊跟其后,給出了接收者信息,然后是 DATA命令列出發(fā)送的郵件內(nèi)容,最后郵件內(nèi)容指示符確認(rèn)操作。得到服務(wù)器的信息后,對(duì)這些信息進(jìn)行分析,再繼續(xù)進(jìn)行下一步操作。這樣 SMTP 實(shí)現(xiàn)中就將用戶郵箱名稱保留成初始時(shí)的樣子,主機(jī)名稱對(duì)大小寫不敏感。 MAIL 命令參數(shù)是回復(fù)路徑,它指定郵件從何處來(lái);而 RCPT 命令的參數(shù)是轉(zhuǎn)發(fā)路徑的,它指定郵件向何處去。當(dāng)接收者收到全部郵件后就會(huì)收到特別的序列,如果接受者成功處理了郵件,則返回 OK 應(yīng)答。 一旦傳送通道建立, SMTP 發(fā)送者發(fā)送 MAIL 命令指明郵件發(fā)送者。以下就以 RFC821 文檔中規(guī)定描述有關(guān)的內(nèi)容。相關(guān)文檔也由最初的RFC821 文檔,擴(kuò)展為目前的 RFC282 RFC2045- 204 RFC2554 等多個(gè)。郵件可以通 過(guò)連接在不同 IPCE(Interprocess Communication Environment)上的進(jìn)程跨網(wǎng)絡(luò)進(jìn)行郵件傳送。 SMTP 的一個(gè)重要特點(diǎn)是它能夠在傳送中接力傳送郵件,傳送服務(wù)提供了進(jìn)程間通信環(huán)境( IPCE),此環(huán)境可以包括一個(gè)網(wǎng)絡(luò),幾個(gè)網(wǎng)絡(luò)或一個(gè)網(wǎng)絡(luò)的子網(wǎng)。 2 SMTP 協(xié)議概述 協(xié)議簡(jiǎn)介 SMTP,簡(jiǎn)單郵件傳輸協(xié)議是 Simple Mail Transfer Protocol 的縮寫。 本畢業(yè)設(shè)計(jì)以 SMTP 協(xié)議為理論基礎(chǔ),以面向?qū)ο蟮姆绞皆?VC++ 平臺(tái)下進(jìn)行實(shí)現(xiàn)。本軟件實(shí)現(xiàn)的是用于發(fā)送郵件的SMTP 協(xié)議。電子郵件技術(shù)具有方便、快捷、成本低廉等特性。 EMail。該軟件實(shí)現(xiàn)了 SMTP協(xié)議,具有向郵件服務(wù)器發(fā)送身份驗(yàn)證消息以及郵件的功能,使用戶能夠在本地通過(guò)客戶端程序向服務(wù)器發(fā)送郵件信息。論文著重對(duì)郵件服務(wù)所使用的 SMTP 協(xié)議進(jìn)行了分析,并根據(jù) ESMTP 協(xié)議的規(guī)定添加了身份驗(yàn)證的功能增加了 郵件服務(wù)的安全性。通過(guò)本設(shè)計(jì)可以掌握 SMTP 協(xié)議,了解到當(dāng)前郵件服務(wù)的一些不足。從常規(guī)的郵件發(fā)送過(guò)程出發(fā),采用 C++語(yǔ)言在 VC++的平臺(tái)下,借助 VC++ 提供的應(yīng)用程序框架 MFC加以實(shí)現(xiàn)。 關(guān)鍵詞 : SMTP協(xié)議 ; 郵件 ; C++; 客戶端 The design and implementation of a SMTP Client Abstract This thesis is pleted in the foundation of the SMTP protocol client software MyEMail. It relates to the software design, implementation, testing and so on. Through the design, the SMTP protocol can be mastered and the deficiencies of current mail service can be understood. The thesis focuses on analyzing the SMTP protocol used by the mail service and adds the authentication function which will increase the mail service security according to the provisions of the protocol ESMTP. MyEMail SMTP software is based on the principles of the protocol, the model and working processes of agreement. And it is a practical and SMTP protocol based client software. The software analyzes the working model and processes of protocol. It starts with the conventional mail process and uses the C++ language and MFC framework in VC++ platform. The SMTP protocol is implemented in this software. It can send authentication information and to the mail server. The users can send authentication information and Email to the server through local software. At present, although the protocol stipulates that the website information can be used in the text, it means that the mail content can contain malicious code, which has potential safe problems. So, the support is not provided in the design. Key words: SMTP Protocol。采用電子郵件服務(wù)可以方便快捷的與朋友、同事或合作伙伴進(jìn)行溝通, 傳遞信息。 目前與郵件相關(guān)的協(xié)議大概可以分為兩種:一種是郵件發(fā)送協(xié)議―― SMTP協(xié)議;另一種是郵件接收協(xié)議―― POP 協(xié)議。目的在于掌握 SMTP 的工作原理,并實(shí)現(xiàn)一個(gè)能夠發(fā)送郵件的完整郵件客戶端。在實(shí)現(xiàn)過(guò)程中,用到了 VC++中的 MFC 框架,使得軟件能夠符合有關(guān)的 WINDOWS 程序標(biāo)準(zhǔn),并且有了清晰的結(jié)構(gòu)規(guī)劃,給維護(hù)帶來(lái)了方便。 SMTP 協(xié)議的目標(biāo)是可靠