




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、1 1C#C#網(wǎng)絡編程技術教程第八章電子郵件協(xié)議編程網(wǎng)絡編程技術教程第八章電子郵件協(xié)議編程第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 2 2學習目標學習目標了解電子郵件協(xié)議的相關基礎知識。了解電子郵件協(xié)議的相關基礎知識。掌握掌握SMTPSMTP、ESMTPESMTP協(xié)議格式及其編程方法。協(xié)議格式及其編程方法。掌握掌握POP3POP3協(xié)議格式及其編程方法。協(xié)議格式及其編程方法。掌握掌握System.Web.MailSystem.Web.Mail郵件編程。郵件編程。第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 3 3本章內(nèi)容本章內(nèi)容8.1 8.1 電子郵件協(xié)議概述電子郵件協(xié)議概述 8.2
2、 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 8.3 ESMTP8.3 ESMTP協(xié)議編程協(xié)議編程 8.4 POP38.4 POP3協(xié)議編程協(xié)議編程 8.5 System.Web.Mail 8.5 System.Web.Mail 第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 4 48.1 8.1 電子郵件協(xié)議概述電子郵件協(xié)議概述 電子郵件是Internet上最常見的服務。電子郵件可以允許兩個或多個用戶間建立通信聯(lián)系,實現(xiàn)電子化的郵政通信方式。電子郵件的收取、發(fā)送等服務必須由基于電子郵件協(xié)議的電子郵件系統(tǒng)來實現(xiàn)。電子郵件系統(tǒng)主要由郵件服務器和郵件客戶端組成,郵件服務器又包括郵件發(fā)送處理服務器(
3、遵循SMTP)和郵件接收處理服務器(遵循POP3協(xié)議)。一般的郵件服務器(126、Yahoo、Hotmail、Sohu等)都包括這兩個功能。常見電子郵件系統(tǒng)組成如圖8.1所示。圖8.1 電子郵件系統(tǒng)組成第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 5 58.1 8.1 電子郵件協(xié)議概述電子郵件協(xié)議概述 對應于郵件服務器的兩個部分,郵件客戶端有發(fā)送郵件和接收郵件兩個功能以及其他一些輔助功能,其中發(fā)送郵件的部分遵循SMTP,接收郵件的部分遵循POP3協(xié)議。通常各個郵件服務器都提供了Web方式的郵件客戶端,用戶只需要用IE瀏覽器就可以訪問郵箱,但是Web郵件客戶端有一定的局限性,例如每次都需要打
4、開IE、進入網(wǎng)站,再登錄郵箱。Web郵件客戶端只能在線瀏覽郵件,在沒有網(wǎng)絡連接的情況下,就不能瀏覽郵件了。與電子郵件相關的協(xié)議主要有:RFC822、SMTP、POP3和IMAP4。1RFC822郵件格式 RFC822定義了SMTP、POP3、IMAP以及其他電子郵件傳輸協(xié)議所提交、傳輸?shù)膬?nèi)容。RFC822定義的郵件由兩部分組成:信封和郵件內(nèi)容。信封包括與傳輸、投遞郵件有關的信息。郵件內(nèi)容包括標題和正文。2SMTP SMTP(Simple Transfer Protocol,簡單郵件傳輸協(xié)議)是Internet上傳輸電子郵件的標準協(xié)議,用于提交和傳送電子郵件,該協(xié)議規(guī)定了主機之間傳輸電子郵件的標
5、準交換格式和郵件在鏈路層上的傳輸機制。SMTP通常用于把電子郵件從客戶機傳輸?shù)椒掌?,以及從一臺服務器傳輸?shù)搅硪慌_服務器。3POP3 POP3(Post Office Protocol 3,郵局協(xié)議第三版)是Internet上傳輸電子郵件的標準協(xié)議。它提供信息存儲功能,負責為用戶保存收到的電子郵件,并且從郵件服務器上下載取回這些郵件。4IMAP4 IMAP4(Internet Message Access Protocol 4,網(wǎng)際消息訪問協(xié)議第四版),當電子郵件客戶機軟件在筆記本計算機上允許時,IMAP4比POP3更適用。使用IMAP4時,用戶可以有選擇地下載電子郵件,甚至只是下載部分郵件。
6、因此,IMAP4要比POP3復雜。第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 6 68.2 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協(xié)議)通常是發(fā)送E-mail的協(xié)議,該協(xié)議的默認端口是25。 SMTP服務器會主動監(jiān)聽TCP端口25,郵件客戶端如果需要發(fā)送郵件,首先要建立一個TCP連接。當連接建立后,SMTP協(xié)議中規(guī)定命令并等待響應。8.2.1 郵件格式 RFC 822 Standard for ARPA Internet Text Message定義了郵件格式由郵件標題和郵件內(nèi)容兩部分構成。1郵件標題一
7、般郵件的標題內(nèi)容如下: Received:by ;Thu,10 July 2008 13:10:25+0800 Message-ID:0c6501b1452a$3d4c8ef0$ From:Hua Jin Date:Thu,10 July 2008 13:10:25+0800 Reply-To:Jin Hua To: Subject:c# Network Programming X-Mailer:Microsoft Outlook Express 5.50.4133.2400第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 7 78.2 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 標題定義的內(nèi)容
8、如下:(1)From:發(fā)件人賬號。(2)To:收件人賬號。(3)Reply-To:回復郵件的收件人賬號。(4)Subject:郵件主題。(5)Date:郵件處理日期。(6)Received:郵件服務器處理的日期,該內(nèi)容由郵件服務器自行加入郵件標題中。(7)Message-ID:郵件服務器所定義的郵件序號。(8)X-Mailer:郵件工具。(9)其他:根據(jù)不同類型的郵件服務器而加入的標題內(nèi)容。2郵件內(nèi)容根據(jù)RFC 822的定義,郵件內(nèi)容以ASCII為其文字格式。SMTP協(xié)議用于發(fā)送郵件,其默認端口為25,SMTP協(xié)議定義了字段保留字及特殊符號等,以確保郵件能在郵件服務器間成功地被傳送。RFC 8
9、22定義了SMTP字段保留字及符號。如:Reply-To:Jin Hua 其中:(1)Reply-To:字段保留字。(2)(:):保留字與內(nèi)容間需要用冒號隔開。(3)(”):用戶名等置于引號之中。(4)():郵件賬號及Message-ID等置于括號內(nèi)。(5)(,):當含有多個郵件賬號時,用逗號隔開。(6)():在郵件賬號中,用戶登錄名與郵件服務器的DNS名稱以連接。(7)CRLF:每一行結尾要以CRLF結束,CRLF含義如表8.1所示。第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 8 88.2 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 項 目說 明ASCIIHex轉(zhuǎn) 義 字 符CR回車13
10、0X0DrLF換行100X0An第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 9 98.2 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 8.2.2 SMTP信息 RFC 821 Simple Mail Transfer Protocol 定義了SMTP發(fā)送郵件的流程、格式、指令等內(nèi)容。下面是客戶端發(fā)送郵件至郵件服務器及服務器響應的內(nèi)容,為區(qū)別起見,每一行的開始位置加上“S:”或“C:”,代表服務器端或客戶端響應及發(fā)送信息。C:Trying to connect to host smtp:,port:25C:Connected to smtp.mail S:220 Simple Mail Tr
11、ansfer Service ReadyC:HELO S:250 Hello C:MAIL FROM:S:250 OKC:RCPT TO:S:250 OKC:DATAS:354 Start mail input;end with.C:Date:Thu,10 July 2008 13:10:25+0800C:To:C:Subject:SMTP MailC:Test SMTP mail message.C: S:250 OKC:QUITS:221 Service closing transmission channel 由此可以看出,郵件服務器端返回的信息都會加上三位數(shù)字的響應碼,來定義各信息處理
12、情況。SMTP響應碼如表8.2所示。第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 10108.2 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 響 應 碼含 義211響應系統(tǒng)狀態(tài)214輔助信息220服務器的郵件服務已準備運作221已結束與郵件服務器的連接250系統(tǒng)指令正確發(fā)送(OK)251無此收件人354開始郵件內(nèi)容發(fā)送,并以.表示結束421服務器無此郵件服務450郵件信箱不存在451系統(tǒng)指令處理錯誤452系統(tǒng)容量不足500未定義的系統(tǒng)指令501系統(tǒng)指令的參數(shù)錯誤502系統(tǒng)指令未被執(zhí)行503系統(tǒng)指令順序錯誤504系統(tǒng)指令的參數(shù)未被執(zhí)行550郵件信箱不存在551無此收件人552系統(tǒng)容量不足553
13、郵件信箱收件人名稱不存在554郵件發(fā)送處理失敗第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 11118.2 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 其中,第一個及第二個數(shù)字均有其特別含義,而第三個數(shù)字為信息的序號,下面具體說明第一、二個數(shù)字的含義,分別如表8.3、表8.4所示。表8.3 SMTP響應碼第一個數(shù)字的含義編 號含 義1信息已被郵件服務器正確接受,但尚未被處理2信息已被郵件服務器正確處理完畢3信息已被郵件服務器正確接受,并正在處理中4信息處理錯誤(暫時)5信息處理錯誤(永久)表8.4 SMTP響應碼第二個數(shù)字的含義編 號含 義0語法1系統(tǒng)狀態(tài)與信息2與郵件服務器系統(tǒng)連接狀態(tài)3未
14、定義4未定義5與郵件服務器有關的信息第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 12128.2 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 8.2.3 SMTP指令 SMTP指令也是由RFC821定義的,SMTP指令采用命令行形式,用ASCII碼表示,它們之間由空格間隔。命令行以結束,命令一般是四個字母,每個參數(shù)卻可長達40個字符。在帶參數(shù)的情況下,命令本身由和參數(shù)隔開;如果未帶參數(shù)可以直接和連接。郵件服務器接收到命令后會執(zhí)行命令,并把執(zhí)行結果返回給客戶端。SMTP指令如表8.5所示。命 令語 法 定 義描 述HELOHELO 該命令用于向服務器標識用戶身份。如果操作成功,服務器會返回代碼
15、250HELPHELP該命令用于向命令的發(fā)送者發(fā)出幫助信息MAILMAIL FROM: 該命令用于初始化郵件傳輸。如果操作成功,服務器會返回代碼250RCPTRCPT TO :該命令用于標識單個郵件接收人,如果有多個接收人,將由多個該命令指定。如果操作成功,服務器會返回代碼250DATADATA該命令是一個復雜的命令,用于設置郵件的主題、接收人、抄送列表和郵件的正文。DATA命令會初始化數(shù)據(jù)傳輸,一般在一個或多個RCPT命令后執(zhí)行DATA命令RSETRSET中止郵件發(fā)送處理NOOPNOOP 令郵件服務器發(fā)送250OK的信息SENDSEND 處理郵件發(fā)送SAMLSAML Send和Mail命令要
16、求郵件內(nèi)容直接發(fā)送到用戶終端上(SAML:Send And Mail)SOMLSOML Send或Mail命令要求郵件內(nèi)容直接發(fā)送到用戶終端上(SOML:Send Or Mail)ARFYARFY 確認收件人E-mail地址是否正確(VRFY:Verify)EXPNEXPN 確認收件組是否正確(EXPN:Expand)QUITQUIT該命令用于結束會話,退出SMTP服務器并中斷連接。如果執(zhí)行成功,會返回221,表示服務器關閉第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 13138.2 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 8.2.4 SMTP流程SMTP流程也是由RFC821定義的,如
17、圖8.2所示。第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 14148.2 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 8.2.4 SMTP流程(1)首先,客戶端嘗試與郵件服務器建立連接,并且等候郵件服務器返回220 Ready的信息,當客戶端收到此信息時,會發(fā)出HELO信息,以響應郵件服務器,而同時郵件服務器也會返回250 OK信息,表示雙方已建立起連接,隨后就可以開始發(fā)送郵件。(2)郵件發(fā)送是以MAIL FROM:指令開始。首先,客戶端發(fā)出MAIL FROM:的信息,其主要作用在于一旦有任何錯誤發(fā)生或郵件響應產(chǎn)生時,會發(fā)往此E-mail地址,若發(fā)件人的E-mail地址正確,郵件服務器會返
18、回250 OK信息,否則會返回550 No such user信息。(3)隨后客戶端會發(fā)出RCPT TO:指令,以代表收件人的E-mail地址,若收件人E-mail地址正確,郵件服務器會返回250 OK信息,否則會返回550 No such user信息。(4)隨后開始處理郵件標題及內(nèi)容,客戶端會先發(fā)送出DATA指令,以告知郵件服務器將要開始發(fā)送郵件標題及內(nèi)容。若正確,則郵件服務器會響應354 Start mail input的信息,隨后就可以開始發(fā)送郵件標題及內(nèi)容,每行必須以結尾。(5)依次發(fā)送郵件標題及內(nèi)容后,必須發(fā)送一個特殊的字符串,以代表郵件內(nèi)容發(fā)送結束,此字符由回車、換行、句點、回車
19、、換行組成,即.。同樣,郵件服務器會返回250 OK信息,代表成功發(fā)送。第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 15158.2 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 8.2.4 SMTP流程(6)最后,客戶端發(fā)出QUIT指令,要求結束連接,同時郵件服務器端會響應221信息,表示同意結束,則完成郵件的正常發(fā)送。 郵件客戶端最重要的兩個功能就是發(fā)送郵件和接收郵件,其中發(fā)送郵件的流程如圖8.3所示。發(fā)送郵件時,首先檢查“發(fā)件箱”目錄中的待發(fā)郵件,如果沒有待發(fā)郵件就退出執(zhí)行,反之,則逐個發(fā)送郵件。發(fā)送郵件時,先創(chuàng)建一個TCP連接到POP3服務器,如果連接不成功也退出執(zhí)行;反之,判斷SMT
20、P服務器是否需要進行身份驗證,如果不需要身份驗證,或身份驗證失敗后都退出執(zhí)行,一旦身份驗證成功,則直接發(fā)送郵件,然后檢查郵件發(fā)送是否成功,如果發(fā)送不成功就退出執(zhí)行,否則關閉連接,更新數(shù)據(jù)庫和界面,獲取下一個要發(fā)送的郵件。循環(huán)執(zhí)行上面的步驟,直到所有郵件都發(fā)送完后退出。 接收郵件時首先要創(chuàng)建一個TCP連接到POP3服務器。如果連接不成功就退出執(zhí)行,連接成功后再發(fā)送USER和PASS命令進行身份驗證,身份驗證通過后再通過STAT命令獲得要接收的郵件數(shù),當郵件數(shù)大于0時,通過RETR命令逐個接收郵件。接收郵件完畢后,檢查賬號中是否保留服務器上郵件的設置,如果是,就不作任何操作,否則從服務器上刪除已經(jīng)
21、接收的郵件。最后關閉連接,更新UI界面和數(shù)據(jù)庫,完成郵件接收,如圖8.4所示。 第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 16168.2 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 8.2.4 SMTP流程 第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 17178.2 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 8.2.5 SMTP協(xié)議編程方法 SMTP協(xié)議編程方法有兩種,分別是由客戶端Socket類和客戶端TcpClient類實現(xiàn)SMTP協(xié)議編程。下面分別作簡要說明,具體實例詳見ESMTP協(xié)議編程實例。1客戶端Socket類實現(xiàn)SMTP協(xié)議編程以Socket類通過SMTP協(xié)議發(fā)送郵件
22、,需要根據(jù)圖8.2所示的SMTP流程,建立與郵件服務器的連接,并按順序發(fā)送下列格式的內(nèi)容至服務器,就可完成SMTP郵件發(fā)送。HELOrnMALL FROM:rnRCPT TO:rnDATArnrnrn. rnQUITrn注意:每一行需要以CRLF( rn )結尾;SMTP發(fā)送郵件服務器的默認端口是25。第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 18188.2 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 8.2.5 SMTP協(xié)議編程方法 2客戶端TcpClient類實現(xiàn)SMTP協(xié)議編程圖8.5 客戶端實現(xiàn)SMTP協(xié)議編程流程圖使用TcpClient類編寫SMTP客戶端應用程序的流程如圖8.
23、5所示。圖8.5 客戶端實現(xiàn)SMTP協(xié)議編程流程圖第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 19198.2 SMTP8.2 SMTP協(xié)議編程協(xié)議編程 8.2.5 SMTP協(xié)議編程方法 (1)首先客戶端以TcpClient類與SMTP郵件服務器建立Socket連接,可使用TcpClient類的Connect方法建立客戶端與服務器端的連接,其方法如下。 public void Connect ( IPEndPoint remoteEP); public void Connect (IPAddress address,int port); public void Connect (strin
24、g hostname,int port);(2)建立客戶端與服務器端數(shù)據(jù)發(fā)送接收的輸入/輸出數(shù)據(jù)流:所建立的TcpClient對象代表客戶端與服務器端的連接,可通過TcpClient類的GetStream方法取得客戶端的輸入、輸出數(shù)據(jù)流,此函數(shù)原型如下:Public NetWorkStream GetStream ( );(3)然后以NetworkStream類的Write方法依序從客戶端發(fā)送下列信息到郵件服務器端,同時以NetworkStream類的Read方法處理服務器端所返回的信息,以判斷是否正確。HELOrnMALL FROM:rnRCPT TO:rnDATArnrnrn. rnQUI
25、Trn(4)當郵件發(fā)送完畢,需要用TcpClient類的Close方法關閉客戶端與SMTP郵件服務器端的Socket連接。第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 20208.3 ESMTP8.3 ESMTP協(xié)議編程協(xié)議編程 8.3.1 ESMTP介紹 ESMTP(Extended SMTP,擴展SMTP)是對標準SMTP的擴展。它們的區(qū)別僅僅是:使用SMTP發(fā)信不需要驗證用戶賬戶,而用ESMTP發(fā)信時,服務器會要求用戶提供用戶名和密碼以便驗證身份。驗證之后的郵件發(fā)送過程與SMTP一樣。 為了更有效地抑制垃圾郵件的泛濫,許多E-Mail服務商和ISP(包括本站)升級了他們的SMTP系統(tǒng)
26、,即使用ESMTP的方式來提供E-mail發(fā)送服務。與從POP3服務器上收信一樣,在ESMTP服務器上發(fā)送郵件時,必須出示用戶的賬號和密碼。如果賬號和密碼不正確,ESMTP服務器會拒絕發(fā)送該郵件。這樣,在該E-Mail系統(tǒng)中沒有賬號的用戶就無法利用該ESMTP服務器亂發(fā)郵件了。8.3.2 ESMTP協(xié)議編程實例 本小節(jié)介紹基于ESMTP協(xié)議編寫一個有用戶認證、可以發(fā)送附件、功能比較全面的郵件發(fā)送程序。ESMTP是增強的SMTP協(xié)議,協(xié)議的工作流程與SMTP協(xié)議大致相同,只需要在SMTP的基礎上增加用戶認證功能即可。第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 21218.4 POP38.4
27、 POP3協(xié)議編程協(xié)議編程 8.4.1 POP3概述 POP3是用來接收郵件的協(xié)議,該協(xié)議的默認端口是110。POP3是根據(jù)RFC 1081 Post Office Protocol-version 3所制定,其中定義了POP3接收郵件的流程、指令等相關內(nèi)容。 POP3的流程處理與SMTP協(xié)議的不同在于,SMTP發(fā)送郵件時,不需要用戶認證過程。即,SMTP協(xié)議發(fā)送郵件,不需要用戶提供賬號或密碼,通過具有SMTP服務的服務器即可發(fā)送郵件。但POP3不同,客戶端通過POP3到郵件服務器讀取郵件時,必須通過認證才能讀取郵件。 POP3流程分為如下3個階段。(1)認證。(2)郵件接收。(3)根據(jù)Tra
28、nsaction流程的定義,更新郵件信箱。 POP3接收郵件的流程圖如圖8.7所示。與SMTP相比,POP3的指令內(nèi)容較為簡單,因為在每個階段,RFC均定義了客戶端所發(fā)送指令的格式以及服務器端響應的內(nèi)容。(1)客戶端所發(fā)送的指令必須以CRLF結尾,含義如表8.1所示。(2)服務器端響應的信息,只有兩種情況。 +OK:表示指令執(zhí)行正確。 ERR:表示指令執(zhí)行錯誤。此外,在POP3的每個階段,均有相應的指令應用。(1)認證階段。在認證階段中,所有客戶端指令如表8.7所示。 第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 22228.4 POP38.4 POP3協(xié)議編程協(xié)議編程 8.4.1 POP
29、3概述圖8.7 POP3接收郵件流程圖第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 23238.4 POP38.4 POP3協(xié)議編程協(xié)議編程 8.4.1 POP3概述表8.7認證階段指令指 令語 法USERUSERPASSPASSQUITQUIT(2)郵件發(fā)送。在郵件發(fā)送階段中,所有客戶端指令如下表所示。指 令語 法STATSTATLISTLIST(mail #)RETRRETRDELEDELENOOPNOOPRSETRSET(3)更新郵件郵箱當客戶端執(zhí)行QUIT指令與服務器端結束連接時,則進入POP3的最后階段:更新,主要是將郵件發(fā)送階段中被DELE指令刪除的郵件從郵件信箱中永久刪除。此
30、階段沒有任何指令。第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 24248.4 POP38.4 POP3協(xié)議編程協(xié)議編程 8.4.2 POP3客戶端程序Socket類實現(xiàn) 本小節(jié)主要介紹POP3客戶端程序的Socket實現(xiàn)。接收郵件流程如圖8.7所示。下面分別說明客戶端接收郵件和處理服務器端返回信息的方法。如代碼實例8.2所示。代碼實例8.2 POP3客戶端程序的Socket實現(xiàn)說明IPAddress IPAdd; IPEndPoint IPEndAdd; IPHostEntry IPHost; /與郵件服務器建立連接 try IPHost = Dns.Resolve(strHost);
31、IPAdd = IpHost.AddressList0; IPEndAdd = new IPEndPoint(IPAdd.Address),Int32.Parse(strPort); POP3Socket.Connect (IPEndAdd); if (!pop3Socket.Connected) / 用戶認證 strMsg =USER+strUser; if (!POP3Request(strMsg) return (false); if (!POP3Response( ) return(false); / PASS strMsg=PASS+strPass; if (!POP3Request
32、(strMsg) return (false); if (!POP3Response( ) return(false);第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 25258.4 POP38.4 POP3協(xié)議編程協(xié)議編程 8.4.2 POP3客戶端程序Socket類實現(xiàn) /STAT strMsg =STAT; if (!POP3Request(strMsg) return (false); bytes = pop3Socket.Receive(ReceBytes,RecvBytes.Length,0); strResponse = Encoding.ASCII.GetString (Re
33、cvBytes,0,bytes); if (!strResponse.StartsWith (+OK) return (false); /+OK String strTemp=strResponse.Split(.ToCharArray( ); totalMail=Int31.Parse(strTemp1.Trim( ).ToString( ); mailSize=Int 32.Parse(strTemp2.Trim( ).ToString( ); /認證成功后,便可發(fā)送郵件。由客戶端發(fā)送RETR指令至服務器端, /待服務器端返回信息,便讀取郵件標題及內(nèi)容, /其中,通過“.”判斷郵件內(nèi)容結束
34、。 try strMsg = RETR+mailNo; if (!POP3Request (strMsg) return (false); do bytes = pop3Socket.Receive(RecvBytes,RecvBytes.Length,0); if (bytes 0 ) strResponse = Encoding.ASCII.GetString (RecvBytes,0,bytes); if (blnFlag) if(!strResponse.StartsWith(+OK) 第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 26268.4 POP38.4 POP3協(xié)議編程協(xié)
35、議編程 8.4.2 POP3客戶端程序Socket類實現(xiàn) return (false); blnFlag=false; strContent = strContent strResponse; if(strContent.Trim ( ).EndWith (.) break; else break; While (true); texMessage.Text = strContent; return (true); Catch (Exception ex) return (false); /定義POP3Request函數(shù)private bool POP3Request (String strM
36、sg) byte byteMsg; strMsg = strMsg +r n; try byteMsg = Encoding.ASCII.GetBytes (strMsg.ToCharArray ( ); pop3Socket.Send (byteMsg,byteMsg.Length,SocketFlag.None); return (true); 第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 27278.4 POP38.4 POP3協(xié)議編程協(xié)議編程 8.4.2 POP3客戶端程序Socket類實現(xiàn)/定義POP3Response函數(shù)Private bool POP3Response ( )
37、 Byte RecvBytes = new byte256; string strResponse= ; int bytes; try bytes = pop3Socket.Receive (RecvBytes, RecvBytes.Length,0); strResponse = Encoding.ASCII.GetString (RecvBytes,0,bytes); if (!strResponse.StartsWith (+OK) pop3Socket.Shutdowm(SocketShutdown.Both); pop3Socket.Close ( ); return (false)
38、; else return (true); catch (Exception ex) pop3Socket.Shutdown(SocketShutdown.Both); pop3Socket.Close ( ); return (false); 第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 28288.4 POP38.4 POP3協(xié)議編程協(xié)議編程 8.4.3 POP3客戶端程序TCP客戶端類實現(xiàn) 編寫POP3客戶端應用程序,除了使用System.Net.Sockets的Socket類之外,也可使用TCP客戶端類實現(xiàn),其流程圖如圖8.8所示。(1)首先客戶端用Tcp客戶端類與POP3郵件服務
39、器建立Socket連接,可使用Tcp客戶端類的Connect方法建立客戶端與服務器端的連接。圖8.8 利用Tcp客戶端類編寫應用程序流程圖程序示例如下:/指定服務器DNS主機名稱與端口號try Tcp客戶端 pop3Socket = new Tcp客戶端 ( );pop3Socket.Connect (strHost,Int32.Parse(str Port); Catch (Exception ex) 圖8.8 利用Tcp客戶端類編寫應用程序流程圖第第8 8章章 電子郵件協(xié)議編程電子郵件協(xié)議編程 29298.4 POP38.4 POP3協(xié)議編程協(xié)議編程 8.4.3 POP3客戶端程序TCP客戶端類實現(xiàn)(2)建立客戶端與服務器端數(shù)據(jù)發(fā)送接收的輸入輸出數(shù)據(jù)流,所建立的Tcp客戶端對象代表客戶端與服務器端的連接,可通過Tcp客戶端類的GetStream方法取得客戶端的輸入/輸出數(shù)據(jù)流。GetStream方法的原型為:public NetworkStream GetStream ( );程序示例如:NetworkStream networkStream = pop3Socket.GetStream ( );(3)然后用NetworkStream類的Write方法由客戶端發(fā)送下列信息至郵件服務器
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 衡陽縣鄉(xiāng)鎮(zhèn)干部管理辦法
- 西南水泥智能化管理辦法
- 西工大教師考核管理辦法
- 許可證管理辦法學習報告
- 證監(jiān)會股權收益管理辦法
- 財務分配及管理暫行辦法
- 質(zhì)量管理辦法及獎罰辦法
- 貴溪市文明餐桌管理辦法
- 資產(chǎn)管理暫行辦法財政部
- 越南俱樂部槍支管理辦法
- 售樓處物業(yè)經(jīng)理年終總結
- 物業(yè)員工夏季防暑培訓
- 水廠反恐培訓教材
- 品管圈PDCA改善案例-降低住院患者跌倒發(fā)生率
- 煤化工產(chǎn)業(yè)鏈詳解文檔課件
- 大學英語4綜合教程課件教學課件教學
- Module 1 語法Grammar 一般現(xiàn)在時,一般過去時,一般將來時與現(xiàn)在進行時八年級英語上冊模塊語法精講精練(外研版)
- 2024年秋新人教版七年級上冊英語全冊課件(新版教材)
- 癌癥患者生活質(zhì)量量表EORTC-QLQ-C30
- 一般工商貿(mào)(輕工)管理人員安全生產(chǎn)考試題庫(含答案)
- 2023年山東省藝術本科(美術類)第一次投檔分數(shù)線
評論
0/150
提交評論