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

正文內(nèi)容

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

2025-02-01 11:23本頁(yè)面
  

【正文】 協(xié)議;另一種是郵件接收協(xié)議―― POP 協(xié)議。目前, SMTP 協(xié)議已經(jīng)有了大量的實(shí)現(xiàn),應(yīng)用廣泛。目的在于掌握 SMTP 的工作原理,并實(shí)現(xiàn)一個(gè)能夠發(fā)送郵件的完整郵件客戶端。用計(jì)算機(jī)語(yǔ)言對(duì) SMTP 協(xié)議的工作原理進(jìn)行了描述。在實(shí)現(xiàn)過程中,用到了 VC++中的 MFC 框架,使得軟件能夠符合有關(guān)的 WINDOWS 程序標(biāo)準(zhǔn),并且有了清晰的結(jié)構(gòu)規(guī)劃,給維護(hù)帶來了方便。它是互聯(lián)網(wǎng)上的一種通訊協(xié)議,工作于應(yīng)用層,使用端口 為 25。 SMTP 協(xié)議的目標(biāo)是可靠高效地傳送郵件,它獨(dú)立于傳送子系統(tǒng)而且僅要求一條可以保證傳送數(shù)據(jù)單元順序的通道。理解到傳送系統(tǒng)(或 IPCE)不是一對(duì)一的是很重要的。郵件是一個(gè)應(yīng)用程 序或進(jìn)程間通信。更特別的是,郵件可以通過不同網(wǎng)絡(luò)上的主機(jī)接力式傳送。協(xié)議制定者制定了一系 列的相關(guān)協(xié)議,如:有關(guān)認(rèn)證的部分和附件傳送部分等。目前按照郵件協(xié)議的規(guī)定已經(jīng)不僅僅能夠傳送文本,而且能夠傳送文件,網(wǎng)頁(yè)以及多媒體信息。郵件傳送的模型,沒有變化。 工作模型 SMTP 設(shè)計(jì)基于以下通信模型:針對(duì)用戶的郵件請(qǐng)求,發(fā)送 SMTP 建立與接收SMTP 之間建立一個(gè)雙向的傳送通道,用于發(fā)送與接收 SMTP 的命令與應(yīng)答碼。 SMTP 命令由發(fā)送 SMTP 發(fā)出,由接收 SMTP 接收,而應(yīng)答則 反方向傳送。如果 SMTP接受者可以接收郵件則返回 OK 應(yīng)答。如果 SMTP 接收者能夠接收,那么返回 OK 作為應(yīng)答;如果不能收到,則返回拒絕應(yīng)答(但并不中止整個(gè)郵件操作),雙發(fā)如此重復(fù)多次。如圖 1所示。為了能夠?qū)?SMTP 服務(wù)器提供中繼能力,它必須擁有最終目的主機(jī)地址和郵箱名稱。向前路徑是源路徑,而回復(fù)路徑是返回路徑(它用于發(fā)生錯(cuò)誤時(shí)返回郵件)。 命令與應(yīng)答對(duì)大小寫不敏感, 也就是說,命令和應(yīng)答可以是大寫,小寫或兩者的混合,但這一點(diǎn)對(duì)用戶郵件名稱卻不一定是對(duì)的,因?yàn)橛械闹鳈C(jī)對(duì)用戶名大小寫是敏感的。 命令與應(yīng)答由 ASCII 字母表組成,當(dāng)傳送服務(wù)提供 8位字節(jié)傳送通道,每 7位字符正確傳送,而最高位被填充為 0。 工作過程 從 SMTP 協(xié)議的整體工作過程來看,客戶端和服務(wù)器是典型的 C/S 結(jié)構(gòu),由客戶端向服務(wù)器發(fā)起連接請(qǐng)求,發(fā)送相關(guān)的命令(也可以說是要求的服務(wù)),等待服務(wù)器的相關(guān)信息。本節(jié)中提供了一些相關(guān)過程舉例和命令的說明,具體描述了 SMTP協(xié)議中數(shù)據(jù)的交互過程。 傳送 在 SMTP 發(fā)送操作中有三步,操作由 MAIL 命令開始給出發(fā)送者標(biāo)識(shí)。 1) 過程中的第一步是 MAIL 命令, reversepath>包括源郵箱。它給出反向路徑以進(jìn)行錯(cuò)誤信息返回。 reversepath中不止包括了郵箱,它包括了主機(jī)和源郵箱的反向路由,其中的第一個(gè)主機(jī)就是發(fā)送此命令的主機(jī)。 RCPTSP TO: forwardpathCRLF 此命令給出向前路徑標(biāo)識(shí)接收者,如果命令被接收,接收方返回一個(gè) 250 OK應(yīng)答,并存儲(chǔ)向前路徑。此過程可能會(huì)重復(fù)若干次。 3) 過程中的第三步是發(fā)送 DATA 命令。當(dāng)信件結(jié)尾收到并存儲(chǔ)后,接收者發(fā)送一個(gè) 250 OK 應(yīng)答。 SMTP 通過在最后一行僅發(fā)送一個(gè)句號(hào)來表示郵件 內(nèi)容的結(jié)束,在接收方,一個(gè)對(duì)用戶透明的過程將此符號(hào)過濾掉,以不影響正常的數(shù)據(jù)。 郵件內(nèi)容指示符確認(rèn)郵件操作并告知接收者可以存儲(chǔ)和再發(fā)送數(shù)據(jù)了。 DATA 命令僅在郵件操作未完成 或源無效的情況下失敗。這些命令只能以上面的順序使用。 SMTP 過程例子此例是在 主機(jī)的 wangyoucao2020 發(fā)送郵件給 主機(jī)的 xia, li 和 yue 的。 end with < CRLF> .< CRLF> S: Blah blah blah... S:..等等 S: < CRLF> .< CRLF> R: 250 OK 此信被第一和三兩個(gè)人接收,而第二個(gè)人在此主機(jī)上沒有郵箱。這條通道就是發(fā)送者和接接收者用戶發(fā)送和接收數(shù)據(jù)的保證。 建立命令為 :HELO( EHLO)。這兩個(gè)命令的正確應(yīng)答碼為 220 和 221。 打開傳送通道時(shí),要交換一些信息以確定雙方的身份。接下來客戶端就會(huì)根據(jù)一定的順序,來繼續(xù)的和服務(wù)器朋友進(jìn)行交流,直到雙方談話結(jié)束,客戶端會(huì)主動(dòng)的說 QUIT,表示自己要走了。之后雙方的交流就正式的結(jié)束了。 圖 2 SMTP協(xié)議應(yīng)答碼 命令列表如圖 3所示。在這個(gè)體系中,建立之初由 RFC821 文檔規(guī)定的內(nèi)容已經(jīng)不能滿足人們?nèi)找媾蛎浀男枨?。下面?jiǎn)單介紹幾個(gè)相關(guān)的協(xié)議: RFC2821 文檔:該文檔是 RFC821 的 較為完整的 版本。類似于 821 文檔。 它更全面,也更 合理 。其中定義了新的關(guān)鍵字 AUTH LOGIN,并且規(guī)定了身份認(rèn)證的格式和驗(yàn)證的字符串采用的編碼方式??蛻舳耸褂?EHLO 命令聲明自己的身份。服務(wù)器返回操作正確的 250應(yīng)答碼??蛻舳税l(fā)送 AUTH LOGIN命令給服務(wù)器,服務(wù)器返回 334 要求客戶端發(fā)送 BASE64 編碼后的用戶名。服務(wù)器驗(yàn)證無誤后,返回 334 代碼,并要求客戶端發(fā)送密碼。說明驗(yàn)證成功。 RFC2045 文檔: MIME( Multipurpose Inter Mail Extensions),是對(duì)郵件傳送中的有關(guān)多媒體信息進(jìn)行說明。)在該協(xié)議中,規(guī)定了一些關(guān)鍵的格式字段如: A MIMIVersion header field , A ContentType header field , A ContentTransferEncoding header field 以及兩個(gè)擴(kuò)展的字段 ContentID 、 Content Description header fields 等字段,并且對(duì) BASE64 編碼格式進(jìn)行了說明。對(duì)于協(xié)議的相關(guān)知識(shí)只能停留在理論階段。 本軟件是為了學(xué)習(xí)目的而開發(fā)出的系統(tǒng),采用 VC++ 作為開發(fā)平臺(tái), C++作為開發(fā)的語(yǔ)言。對(duì)發(fā)送和接收的數(shù)據(jù)進(jìn)行分析,把文字描述的協(xié)議轉(zhuǎn)化為計(jì)算機(jī)語(yǔ)言,并 提供方便用戶使用的操作界面。利用該客戶端,用戶可以方便的發(fā)送郵件。這是一個(gè)集成的開發(fā)環(huán)境。雖然年代久遠(yuǎn),但是到目前為止,仍然是一款經(jīng)典之作,在開發(fā)平臺(tái)的陣營(yíng)有著重要的地位。 Visual C++支持的正是 MFC 的應(yīng)用框架。它使得開發(fā)者能夠把主要的精力都放在程序的邏輯部分,而不必為了那些瑣屑的消息管理和消息傳遞或是消息循環(huán)而大傷腦筋,大大提高軟件的開發(fā)效率。支持 MFC 框架只是 Visual C++IDE 的一個(gè)特性而已。例如:提供了工作區(qū)窗口,能夠方便的對(duì)類、文件、資源進(jìn)行視圖化管理;提供了代碼編輯時(shí)的提示功能,在開發(fā)較大的項(xiàng)目時(shí),能夠讓開發(fā)者方便的找到自己想調(diào)用的方法;提供了斷點(diǎn) 機(jī)制,讓程序調(diào)試更加方便 、 快捷;還提供了各種可視化的工程管理工具, 大大提高了開發(fā)效率 。對(duì) 于開發(fā)者 而言,不必把大量的時(shí)間都放在那些與程序無關(guān)的事情上,無疑是一 件好事 。 在該 IDE 中也提供了對(duì)開發(fā)人員來說最重要的工具之一,開發(fā)文檔。就算你對(duì)這個(gè)工具絲毫不了解,也可以通過該文檔快速的上手使用。對(duì)本軟件而言,應(yīng)該具備如下功能: 1)可以保存用戶輸入數(shù)據(jù)。 3)可以對(duì)有關(guān)數(shù)據(jù)進(jìn)行加密。 5)圖形界面要信息完整、操作舒適、界面雅觀。 2) 根據(jù) MFC提供的 API 連接服務(wù)器,建立一條連接發(fā)送者和接收者的通道。生成滿足SMTP 協(xié)議要求的數(shù)據(jù)。 5) 對(duì)郵件發(fā)送過程中,發(fā)送者與接收者之間的命令與應(yīng)答碼之間的關(guān)系進(jìn)行分析。 總體設(shè)計(jì) 目前流行的工作平臺(tái)有很多,可以實(shí)現(xiàn)目標(biāo)的編程語(yǔ)言也有多種。已經(jīng)超越了 C++稱為最受歡迎的語(yǔ)言之一。調(diào)用下 JAVA 有關(guān)郵件發(fā)送的類庫(kù),那么整個(gè)的郵件發(fā)送過程就變成了對(duì)少數(shù)幾個(gè)屬性的設(shè)定問題,整個(gè)工程的主要任務(wù)就不再是對(duì) SMTP 協(xié)議的分析,而僅僅是對(duì)有關(guān)界面的設(shè)計(jì)(而且 JAVA 的界面設(shè)計(jì)相對(duì)于其他的可視化來說好像有些不足,目前似乎只有 NetBeans 支持的比較好)。因此沒有考慮使用 JAVA 來完成本設(shè)計(jì)。結(jié)構(gòu)化的程序設(shè)計(jì)方式,也讓人自然而然的從上而下的去思考。但 C語(yǔ)言并沒有提供太多有關(guān)圖形設(shè)計(jì)方面的框架(或者是目前沒有用于 C 語(yǔ)言的應(yīng)用程序框架)。如此一來,得不償失。使用開發(fā)語(yǔ)言為 C++,是典型的面向?qū)ο笤O(shè)計(jì)語(yǔ)言。因此,在該程序的設(shè)計(jì)過程中,選取了 C++作為開發(fā)語(yǔ)言, VC++ 作為程序設(shè)計(jì)的 IDE。整個(gè)程序就是使用了 MFC 提供的應(yīng)用程序框架,并在其中添加了上述幾個(gè)工具 類,相互協(xié)調(diào)工作而得來。 各模塊設(shè)計(jì) 實(shí)現(xiàn) SMTP 協(xié)議的 核心類庫(kù) 如上所述,目前與 SMTP 協(xié)議有關(guān)的核心類共四個(gè),對(duì)于郵件的所有操作,均封裝在四個(gè)工具類中。四個(gè)子模塊各守其則,分別代表了某一種功能或?qū)嶓w。使用該模塊可以建立或斷開與服務(wù)器的連接、向服務(wù)器發(fā)送消息、從服務(wù)器接受消息并分析得到的消息代碼 是否正確、在服務(wù)器返回錯(cuò)誤消息時(shí)獲取到該消息。該類提供了兩個(gè)重要的程序接口 Connect 和 TransmitMessage。由于當(dāng)前大多數(shù) SMTP 服務(wù)器都已經(jīng)要求用戶進(jìn)行身份驗(yàn)證,因此在該類中還封裝了對(duì)發(fā)送者身份驗(yàn)證的操作。 圖 4 CSMTP類類圖 成員 變量 說明: 1) private BOOL m_bConnected:私有成員變量,表示 當(dāng)前是否與服務(wù)器連接。 2) private UINT m_nPort:私有成員變量,表示與服務(wù)器連接的端口。表示使用服務(wù)器的 25 號(hào)端口。例如: 。 5) private CStringList * m_psErrorList:私有成員變量,是用于存放產(chǎn)生的錯(cuò)誤消息的列表。 7) protected static ResponseCode* responseTable[]:保護(hù)的靜態(tài)成員變量,代表消息碼與對(duì)應(yīng)消息的映射表。在該方法中客戶端接收從服務(wù)器發(fā)送來的消息,并進(jìn)行解析,然后根據(jù)給定的參數(shù)responseExpected 來進(jìn)行判斷。 2) public void SetServerProperties(CString szSMTPServerName , UINT nPort=SMTP_PORT):該方法根據(jù)獲得的字符串類型和 UINT 類型參數(shù)來設(shè)置要連接的服務(wù)器的名稱以及端口號(hào)。其默認(rèn)值為 SMTP_PORT 25。如果沒有錯(cuò)誤信息,則返回空。 5) public BOOL Connect():連接服務(wù)器方法。 如果連接成功則返回 TRUE; 否則返回 FALSE。在該方法中封裝了郵件發(fā)送的操作并 對(duì) SMTP 協(xié)議規(guī)定的命令和應(yīng)答碼的交互操作做了實(shí)現(xiàn), 而且與郵件發(fā)送有關(guān)的身份驗(yàn)證操作也在該方法中實(shí)現(xiàn)。在發(fā)送過程中,順序發(fā)送命令: AUTH LOGIN、MAIL FROM 、 RCPT TO(可重復(fù)多次)、 DATA (結(jié)束符 )、 QUIT,并在每次發(fā)送后設(shè)置一個(gè)接收指令,用于接收從服務(wù)器傳回的數(shù)據(jù),并進(jìn)行分析。 7) private CString CookBody(CMailMessage * msg):該方法用于剔除在郵件正文以及郵件中與結(jié)束標(biāo)志沖突的字符。當(dāng)郵件發(fā)送到服務(wù)器后,會(huì)自動(dòng)的把郵件正文中的被替換的字符換回為原來的字符,從而保證郵件的正確性。該對(duì)象包含有關(guān)的郵件信息,方便在本方法中對(duì)要發(fā)送的郵件進(jìn)行操作。該方法采用查表的方式,根據(jù)郵件服務(wù)器發(fā)送的消息,來確定返回消息的具體信息,該方 法主要在郵件操作出錯(cuò)時(shí),提供錯(cuò)誤信息。有關(guān)應(yīng)答碼和與應(yīng)答碼 相關(guān) 信息,均在本類的靜態(tài)成員變量 ResponseCode responseTable 中做了規(guī)定。該類的設(shè)計(jì)借鑒了 JAVA 中 JavaBean的定義方式,對(duì)私有數(shù)據(jù)進(jìn)行封裝只能通過對(duì)應(yīng)的方法進(jìn)行 存取。其類圖如 圖 5所示。使用 MFC 提供的 CPtrArray 類型變量,能夠方便的存儲(chǔ)多個(gè)附件的信息。 3) protected CString m_sSubject、 m_sFrom、 m_sTo、 m_sHeader、 m_sBody、m_sPassword、 CTime m_tDateTime:表示郵件的信息,分別為 :郵件的標(biāo)題、郵件發(fā)送者、郵件接收者、郵件頭信息、郵件體正文、身份驗(yàn)證的密碼以及郵件發(fā)送的時(shí)間。這設(shè)計(jì)的方式參考了 JAVA 中的 JavaBean 的設(shè)計(jì)模式。 4) private CArray CRecipient,CRecipientamp。表示郵件接收者的一個(gè)數(shù)組。該變量就是用于存儲(chǔ)多個(gè)接收者的。返回值為郵件中已有的附件的個(gè)數(shù)。返回值與該方法 意義相同 。 3) public int GetNumberRecipients(RECIPIENTS_TYPE type=TO):作用是獲取當(dāng)前的接收者的數(shù)目。參數(shù) type 是個(gè) enum RECIPIENT_TYPE 類型的變量,有三個(gè)合法值,分別為: TO,CC,BCC。對(duì)于后兩個(gè)值,本版本沒有提供支持 。默認(rèn)的接收者類型為 TO,也是當(dāng)前版本唯一能夠支持的類型。 5) public void AddToHeader(CString sTemp):該方法作用是向郵件添加頭信息。 6) public virtual void PrepareHeader():本方法的作用是根據(jù)對(duì)象本身的成員變量來生成郵件頭。這些域構(gòu)成了郵件頭的信息。這些域的生成均包含在了該方
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1