電子郵件系統(tǒng)的設(shè)計與實現(xiàn)_第1頁
電子郵件系統(tǒng)的設(shè)計與實現(xiàn)_第2頁
電子郵件系統(tǒng)的設(shè)計與實現(xiàn)_第3頁
電子郵件系統(tǒng)的設(shè)計與實現(xiàn)_第4頁
電子郵件系統(tǒng)的設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第一章 前言 1.1課題來源 當前流行的各大郵件客戶端軟件除了最主要的收發(fā)信件之外,功能越來越復雜,但是人們平常真正用到的功能很少,很多功能尤其對于那些計算機知識相對缺乏的人來說,更加顯得太過于華麗而不太實用。有鑒于此,在了解RFC底層協(xié)議的基礎(chǔ)上,本人開發(fā)了這個各種功能相對簡單實用的郵件客戶端程序,簡化了很多不必要的功能。1.2電子郵件介紹 電子郵件(簡稱E-mail)又稱電子信箱、電子郵政,它是一種用電子手段提供信息交換的通信方式。它是全球多種網(wǎng)絡(luò)上使用最普遍的一項服務。這種非交互式的通信,加速了信息的交流及數(shù)據(jù)傳送,它是一個簡易、快速的方法。通過連接全世界的Internet,實現(xiàn)各類信號

2、的傳送、接收、存儲等處理,將郵件送到世界的各個角落。到目前為止,可以說電子郵件是Internet資源使用最多的一種服務,E-mail不只局限于信件的傳遞,還可用來傳遞文件、聲音及圖形、圖像等不同類型的信息。 電子郵件不是一種“終端到終端”的服務,是被稱為“存儲轉(zhuǎn)發(fā)式”服務。這正是電子信箱系統(tǒng)的核心,利用存儲轉(zhuǎn)發(fā)可進行非實用時通信,屬異步通信方式。即信件發(fā)送者可隨時隨地發(fā)送郵件,不要求接收者同時在場,即使對方現(xiàn)在不在,仍可將郵件讀取信件,不受時空限制。在這里,“發(fā)送”郵件意味著將郵件放到收件人的信箱中,而“接收”郵件則意味著從自己的信箱中讀取信件,信箱實際上是由文件管理系統(tǒng)支持是一個實體。因為電

3、子郵件是通過郵件服務器(mailserver)來傳遞的。通常mailserver是執(zhí)行多任務操作系統(tǒng)UNIX的計算機,它提供24小時的電子郵件服務,用戶只要向mailserver管理人員申請一個信箱賬號,就可使用這項快遞的郵件服務。1.3電子郵件的工作原理: 電子郵件的發(fā)送是通過電子郵件簡單傳速協(xié)議(SimpleMailTransferProtocol,簡稱SMTP)來完成的,電子郵件的接受是通過POP3協(xié)議來實現(xiàn)。它是Internet下的一種電子郵件通信協(xié)議。電子郵件的基本原理,是在通信網(wǎng)上設(shè)立“電子信箱系統(tǒng)”,它實際上是一個計算機系統(tǒng)。系統(tǒng)的硬件是一個高性能、大容量的計算機。硬盤作為信箱的

4、存儲介質(zhì),在硬盤上為用戶分一定的存儲空間作為用戶的“信箱”,每位用戶都有屬于自己的一個電子信箱。并確定一個用戶和用戶可以隨意修改的口令。存儲空間包含存放所收信件、編輯信件以及信件存盤三部分空間,用戶使用口令開啟自己的信箱,并進行發(fā)信、讀信、編輯、轉(zhuǎn)發(fā)、存檔等各種操作。系統(tǒng)功能主要由軟件實現(xiàn)。1.4開發(fā)環(huán)境及運行環(huán)境開發(fā)環(huán)境AMDAthlom(TM),512內(nèi)存,80G硬盤Microsoft()WindowsXPProfessionalMicosoftVisualStudio2003(CSharp)MicosoftDeveloperNetworkforVisualStudio.NET20031.

5、4.2運行環(huán)境 Internetpentium2及以上處理器,32M以上內(nèi)存,4G以上硬盤 Micosoftwindows9X/NT操作系統(tǒng) 800*600或以上的屏幕分辨率 確保機器上安裝有.NetFrameWork1.0或者以上版本第二章 系統(tǒng)需求分析2.1系統(tǒng)功能需求分析 電子郵件系統(tǒng)需求實現(xiàn)的功能包括新建用戶的帳號,接受簡單郵件或帶附件的郵件,發(fā)送簡單郵件或發(fā)送帶附件的郵件,電子郵件編號,電子郵件分類管理,通信薄管理。為了使用通信薄,于是添加了對用戶資料的增加,修改,取消操作。軟件的總體架構(gòu)發(fā)送郵件接收主要功能選擇主界面用戶 圖 1 軟件構(gòu)架圖 系統(tǒng)功能通訊薄管理客戶端軟件電子郵件接收

6、系統(tǒng)電子郵件接收系統(tǒng)附加功能各種錯誤的提示簡單郵件接收帶有附件的郵件接收簡單郵件發(fā)送帶有附件的郵件發(fā)送電子郵件編寫電子郵件的分類管理 圖2 系統(tǒng)功能圖系統(tǒng)總體用例圖用戶新建帳號發(fā)送郵件純文本郵件帶附件郵件接收郵件 圖3 系統(tǒng)總體用例圖2.2 數(shù)據(jù)庫需求分析在對系統(tǒng)進行系統(tǒng)需求分析的基礎(chǔ)上,可以得到系統(tǒng)在處理數(shù)據(jù)時會用到下面所示的數(shù)據(jù)項和數(shù)據(jù)結(jié)構(gòu):1)用戶信息:帳號名稱,用戶名,密碼,電子郵箱地址,SMTP服務器,SMTP端口號,POP3服務器,POP3端口號。2)通信薄信息:姓名,郵箱地址,電話號碼,QQ號,手機號碼,通信地址。第三章 系統(tǒng)設(shè)計3.1系統(tǒng)的流程設(shè)計郵件客戶端最重要的兩個功能就是

7、接收郵件和發(fā)送郵件,其中接收郵件的流程圖如圖4所示。從流程圖中可以看出,接收郵件時首先要創(chuàng)建一個TCP連接到POP3服務器。如果連接不成功就退出執(zhí)行,連接成功后再發(fā)送USER和PASS命令進行身份驗證,身份驗證通過后再通過STAT命令獲得要接收的郵件數(shù),當郵件數(shù)大于0時,通過RETR命令逐個接收郵件。接收郵件完畢后,檢查帳號中是否保留服務器上的郵件設(shè)置,如果是就不作任何操作,否則從服務器上刪除已經(jīng)接受的郵件。最后關(guān)閉連接。完成郵件接收。開始連接服務器連接成功?登錄服務器登陸成功獲得郵件數(shù)目郵件數(shù)0接受全部的郵件保留服務器上的郵件?刪除郵件關(guān)閉連接退出 圖4 接收郵件流程圖 發(fā)送郵件的流程圖,先

8、檢查“發(fā)信箱”目錄中是否有待發(fā)郵件,如果有就逐個發(fā)送這些郵件,流程圖如圖5所示。其發(fā)送過程,首先需要創(chuàng)建一個TCP連接,連接到SMTP服務器,如果連接不成功就退出程序。連接成功后發(fā)送USER和PASS命令進行身份驗證。身份驗證通過后發(fā)送郵件,如果發(fā)送成功就關(guān)閉連接,更新數(shù)據(jù)庫,完成郵件發(fā)送任務。開始檢查發(fā)信箱中的待發(fā)郵件待發(fā)郵件?連接服務器連接成功SMTP服務器需要身份驗證?身份驗證身份驗證成功?發(fā)送待發(fā)郵件發(fā)送成功關(guān)閉連接更新數(shù)據(jù)庫獲得下一個郵件退出 圖5 發(fā)送郵件流程圖3.2 SMTP協(xié)議的研究由于要開發(fā)的是郵件客服端程序,就不得不用到SMTP協(xié)議和POP協(xié)議。而我個人負責的是郵件發(fā)送功能

9、的實現(xiàn),因此就必然會涉及到SMTP(SimpleMailTransferProtocol)協(xié)議。SMTP被用來在因特網(wǎng)上發(fā)送郵件,該協(xié)議規(guī)定了一些基本的命令和方法使客服端與服務器進行交互,以達到發(fā)送郵件的目的。SMTP介紹簡單郵件傳輸協(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)不是一對一的是很重要的。進程可能直接和其它進程通過已知的IPCE通信。郵件是一個應

10、用程序或進程間通信。郵件可以通過連接在不同IPCE上的進程跨網(wǎng)絡(luò)進行郵件傳送。更特別是,郵件可以通過不同網(wǎng)絡(luò)上的主機接力式傳送。SMTP模型SMTP設(shè)計基于以上通信模型:針對用戶的郵件請求,發(fā)送SMTP建立于接收SMTP之間建立一個雙向傳送通道。接收SMTP可以是最終接收者也可以是中間傳送者。SMTP命令由發(fā)送SMTP發(fā)出,由接收SMTP接收,而應答則反方面?zhèn)魉?。一旦傳送通道建立,SMTP發(fā)送者發(fā)送MAIL 命令指明郵件發(fā)送者。如果SMTP接收者可以接收郵件則返回OK應答。SMTP發(fā)送者再發(fā)出RCRT命令確認郵件是否接收到。如果SMTP接收者接收,則返回OK應答;如果不能接收到,則發(fā)出拒絕接收

11、應答(但不中止整個郵件操作),雙方將如此重復多次。當接收者到全部郵件后會接收到特別的序列,如果接收者成功處理了郵件,則返回OK應答。SMTP提供傳送郵件的機制,如果接收方與發(fā)送方連接在同一個傳送服務下時,郵件可以直接由發(fā)送方主機傳送到接收方主機;或者,當兩者在不同一個傳送服務下時,通過中繼SMTP服務器傳送。為了能夠?qū)MTP服務器提供中繼能力,它必須擁有最終目的主機地址和郵箱名稱。MAIL命令參數(shù)是回復路徑,它指定郵件從何處來;而RCPT命令的參數(shù)是轉(zhuǎn)發(fā)路徑的,它指定郵件向何處去。向前路徑是源路徑,而回復路徑是返回路徑(它用于發(fā)生錯誤時返回郵件)。當同一個消息要發(fā)往不同的接收者時,SMTP遇

12、到了向不同接收者發(fā)送同一份數(shù)據(jù)的復制品的問題,郵件命令和應答有一個比較奇怪的語法,應答也有一個數(shù)字代碼。在下面,例子中可以看到哪些使用實際的命令和應答。完整的命令和應答在第四節(jié)。命令與應答對大小寫不敏感,也就是說,命令和應答可以是大寫,小寫或兩者的混合,但這一點對用戶郵件名稱卻不一定是對的,因為有的主機對用戶名大小寫是敏感的。這樣SMTP實現(xiàn)中就將用戶郵箱名稱保留成初始時的樣子,主機名稱對大小寫不敏感。命令與應答由ASCII字母表組成,當傳送服務提供8位子節(jié)傳送通道,每7位字符正確傳送,而最高位被填充為0。當指定一般的命令或應答格式后,參數(shù)會由一些類似于語言的字符串表示出來,如“”或“”,這里

13、尖括號表示這是一種類似于語言的變量。3.3 SMTP協(xié)議的命令和應答SMTP協(xié)議的命令SMTP命令定義了郵件傳輸或用戶定義的系統(tǒng)功能。它的命令是由結(jié)束的字符串。而在帶有參數(shù)的情況下,命令本身由和參數(shù)分開,如果未帶參數(shù)可以直接和連接。郵箱的語法格式必須和接收站點的格式一致。SMTP的應答碼對SMTP命令的響應是多樣的,它確定了在郵件傳輸過程中請求和處理的同步,也保證了發(fā)送SMTP知道接收SMTP的狀態(tài)。每個命令必須有且只有一個響應。SMTP響應由三位數(shù)字組成,其后跟一些文本。數(shù)字幫助決定下一個應該進入的狀態(tài),而文本對人是有意義的。三位的響應已經(jīng)包括了足夠的信息,不用再閱讀文本,文本可以直接拋棄或

14、者傳遞給用戶。特別的是,文本是與接收和環(huán)境相關(guān)的,所以每次接收到的文本可能不同。正規(guī)的情況下,響應由下面序列構(gòu)成:三位的數(shù)字,,一行文本和一個,或者也可以是一個多行響應。只有EXPN和HELP,命令可以導致多行應答,然而,對所有命令,多行響應都是允許的。REPLY CODES BY FUNCTION GROUPS 500格式錯誤,命令不可識別(此錯誤也包括命令行過長)第四章RFC822說到發(fā)送和接收郵件,就不得不提RFC822了。RFC822的全稱是“ARPA因特網(wǎng)文信件格式的標準”(Standard for the Format of ARPA Internet Text Messages)

15、。該標準提供了郵件內(nèi)容的格式和相關(guān)語義。4.1 RFC822簡單介紹RFC822規(guī)定的電子郵件內(nèi)容全部由ASCII字符組成,就是通常所說的文本文件,因而標準將它稱為Internet文本信件(Internet Text Messages)。從直觀上看,信件非常簡單,就是一系列由ASCII字符組成的文本行,每一行以回車換形符結(jié)束。從組織上看,信件內(nèi)容結(jié)構(gòu)分為兩大部分,中間用一個空白行(只有CRLF符的行)來分隔。第一部分稱為信件的頭部,包括有關(guān)發(fā)送方、接收方、發(fā)送日期等信息。第二部分稱為信件的體部,包括信件內(nèi)容的正文文體。信頭是必需的,信體是可選的,即信體可有可無。如果不存在信體,用作分隔的空白行

16、也就不需要。在信體中,也可以有用作分隔的空白行。這樣設(shè)計的信件便于進行語法分析,提取信件的基本信息。在RFC822中規(guī)定,信件體就是一系列的向收信人表達信息的文本行,比較簡單,可以包括任意文本。并沒有附加的結(jié)構(gòu)。信件頭則具有比較復雜的結(jié)構(gòu),在下一小節(jié)中詳述。4.2信件的頭部信頭一般格式信頭的結(jié)構(gòu)比較復雜,信頭由若干信頭字段(header field)組成,這些字段為用戶和程序提供了關(guān)于信件的信息。要了解信頭的結(jié)構(gòu)就要弄清楚各種信頭字段。所有的信頭字段都具有相同的語法結(jié)構(gòu),從邏輯上說,包括四部分,字段名(field name)緊跟冒號“:”(colon),后跟字段體(field body),最后

17、以回車換形符(CRLF)終止。即信頭字段=字段名:字段體CRLF字段名必須由除了冒號和空格以外的可打印USASCII字符(其值在33和126之間)組成,大多數(shù)字段的字段名稱由一系列字母,數(shù)字組成,中間經(jīng)常插入橫線符。字段名告訴電子郵件軟件如何翻譯該行中剩下的內(nèi)容。字段體可以包括除了CR和LF之外的任何ASCII字符。但是其中的格式的空格,加括號的注釋,引號和多行都比較復雜,另外,字段體的語法和語義依賴于字段名,每個類型的字段有特定的格式。結(jié)構(gòu)化字段和非結(jié)構(gòu)化字段每個字段包含的信息不同,字段大體可以分為結(jié)構(gòu)化字段和非結(jié)構(gòu)化字段。結(jié)構(gòu)化字段有特定的格式,由語法分析程序檢測。Sender字段就是一個

18、很好的例子,它的字段內(nèi)容是信箱,有一個離散的結(jié)構(gòu)。非結(jié)構(gòu)化的字段含有任意的數(shù)據(jù),沒有固定格式。例如,Subject字段可以含有任意的文字,并且沒有固定格式。非結(jié)構(gòu)化的字段數(shù)量較少,只有Subject、Comments、擴展字段、非標準字段、INReply和References等。所有其它字段都是結(jié)構(gòu)化的。4.2.3信頭字段的元素盡管Email信件的總體結(jié)構(gòu)非常簡單,但一些信頭字段的結(jié)構(gòu)是很復雜的。下面介紹一些大多數(shù)字段共有的元素。(1)空白符像其它文本文件一樣,空白符包括空格符(ASCII碼32)和制表符TAB(ASCII碼19)此外,行末的回車換形符CRLF也應算是空白符。使用空白符可以對字

19、段進行格式化,增加它的可續(xù)性。例如,每個字段間用CRLF來分離,在字段內(nèi)用空格來分隔字段名和字段內(nèi)容。在Subject后面的冒號和內(nèi)容之間插入空格字符,會使字段結(jié)構(gòu)更加清晰。在Email中??瞻追氖褂貌]有固定的規(guī)則,但應當正確地使用,僅在需要時才使用空白符,以便接收軟件進行語法分析。(2)注解注解是由括號括起來的一系列字符,例如,(這份禮物)。注解一般用在非結(jié)構(gòu)化的信頭字段中,沒有語法語義,僅為人提供了一些附加的信息。如果在加引號的字符串中包括在括號中的字符,那是字符串的一部分,不是注解。在解釋信件的時候,會將注解忽略,可以用一個空格字符代替它們,這樣就什么也不會破壞。(3)字段折疊每個信

20、頭字段從邏輯上說應當是一個由字段名、冒號、字段體和CRLF組成的單一的行,但為了書寫與顯示的方便,增加可續(xù)行,也為了符號1000/80的行字符數(shù)的限制,可以將超過80個字符的信頭字段分為多行,即對于比較長的字段,可以分割成幾行,形成折疊。在結(jié)果化和非結(jié)構(gòu)化字段中都允許折疊,第一行后面的行稱為信頭字段的續(xù)行。續(xù)行都以一個空白符開始,這種方法稱為折疊(folding),例如標題字段Subject:This is a test可以表示為: Subject:This is a test反之,將一個被折疊成多行的信頭字段恢復到它的單行表示的過程叫做去折疊,只要簡單地移除后面跟著空格的CRLF,將折疊空白

21、符CRLF轉(zhuǎn)換成空格字符,就可以完成折疊。在分析被折疊的字段的語法時,要把一個多行的折疊字段展開為一行,根據(jù)它的非折疊的形式來分析它的語法與語義。(4)字段大小寫字段名稱是不區(qū)分大小寫的,所以Subject、subject或SUBJECT都一樣。不過字段名稱大小寫有習慣的常用形式,如主題字段的大小寫形式通常為Subject。字段體的大小寫稍微復雜點,要視情況而定。比如Subject后面的字段體,其中的大寫可能就是縮寫的專用名詞,不能改動。(5)擴展字段如果想在信頭中加入RFC822中沒有規(guī)定的字段,就需要創(chuàng)建非標準字段。方法非常簡單,只要在自定義的信頭字段名的前面使用X-前綴。RFC822將這

22、種方法稱為擴展字段。事實上已經(jīng)有許多擴展字段被廣泛應用,但沒有標準定義。例如:XLOOP字段XLOOP字段用來防止郵件的循環(huán)傳送。過濾或郵件列表處理程序,可以給它處理的每個信件增加一個XLOOP字段,以后就可以根據(jù)這個字段中含有的特別值,判斷一個信件是否被循環(huán)傳送。如果確認郵件發(fā)生了循環(huán),過濾或郵件列表處理程序就可以用不同的方式處理該信件。XMailer字段XMailer字段用于指示什么樣的程序產(chǎn)生了這個信件,它是使用最廣泛的擴展字段。產(chǎn)生郵件的軟件可以為所有發(fā)送的信件增加合適的XMailer字段,該字段不僅含有軟件的名稱,還包含軟件的版本號。例如軟件名為Littlefox Mailer,版本

23、為V1.0,可以將“XMailer:Littlefox Mailer V1.0”加到郵件信頭中去。圖6列出了一些在因特網(wǎng)電子郵件可以找到的普通關(guān)鍵字,以及使用它們的目的。 關(guān)鍵字 含義 From 發(fā)送方地址 TO 接收方地址 Cc 復制副本地址 Date 信息創(chuàng)建日期 Subject 信息主題 ReplyTo 回復地址 XCharset 使用的字符集(通常為ASCII) XMailer 發(fā)送信息所使用的軟件 XSender 發(fā)送方地址的副本 XFace 經(jīng)編碼的發(fā)送方面孔的圖像整個系統(tǒng)的核心是收發(fā)信件的操作,因此為了方便維護,以后的升級,故將這兩個最主要的操作寫成類庫(.dll)的形式,以組件

24、的形式加載到主程序中,而且其它的功能如果需要的話,也可以通過這樣的組件的形式增加到主程序中。這也體現(xiàn)了C Sharp這一新的微軟主推語言的方便和高效。而且這樣做也方便了我們小組的程序的順利結(jié)合。第五章 系統(tǒng)實現(xiàn)5.1發(fā)送郵件類SmtpMail是發(fā)送郵件的核心,類名為SmtpMail,隸屬于命名空間MailSend。封裝了發(fā)送郵件的具體實現(xiàn)方法,也是具體的RFC用代碼實現(xiàn)的過程。而用戶通過具體的操作接口,接收與SmtpMail類通過交互操作來實現(xiàn)用戶發(fā)送信件的操作。5.1.1主要成員變量說明1)網(wǎng)絡(luò)連接類及實例TcpClient tc為TCP網(wǎng)絡(luò)服務提供客戶端連接類TcpClient 實例對象t

25、c。TcpClient 類提供了一些簡單的方法,用于在同步阻塞模式下通過網(wǎng)絡(luò)來連接、發(fā)送和接收流數(shù)據(jù)。而實例化的過程也是連接SMTP服務器的過程。它的重載方法之一的兩個參數(shù)一個為服務器名稱字符串,另一個為服務器的埠。2)提供用于網(wǎng)絡(luò)訪問的基礎(chǔ)數(shù)據(jù)流及其實例NetworkStream ns此類提供訪問網(wǎng)絡(luò)的基礎(chǔ)數(shù)據(jù)流的方法。其中最基本也是最重要的兩個方法就是Write()和Read()方法,至于參數(shù)不再次描述。3)一維字符串數(shù)組變量FilePath此字符串數(shù)組主要用來存放用戶選擇的附件的絕對路徑名,并在發(fā)送帶附件的郵件時用到。4)發(fā)送郵件所需的基本參數(shù)比如用于ESMTP登錄檢驗用的用戶名、密碼,

26、發(fā)送郵件需要的收信人,發(fā)信人地址以及主題等等在此不再陳述。5.1.2主要成員函數(shù)說明 1)重載的構(gòu)造函數(shù)SmtpMail () 此函數(shù)主要用于在初始化過程中,把用戶選擇的附件的路徑以參數(shù)的形式傳給FilePath。 2)添加附件的函數(shù) AddAttachment 傳給FilePath的路徑,通過這樣一個函數(shù)就可以循環(huán)的動態(tài)的添加到LIST接口的一個對象中了,方便以后在具體的實現(xiàn)過程中使用。 3)得到上傳的附件的文件流 GetStream 由于在網(wǎng)絡(luò)中的操作都是以網(wǎng)絡(luò)流的形式來實現(xiàn)的,因此先將上傳的附件轉(zhuǎn)換成文件流,然后再用Write的方法把這些附件的文件流寫入到網(wǎng)絡(luò)中,來完成發(fā)送附件的操作。具

27、體實現(xiàn)代碼如下所示:/ / 得到上傳附件的文件流 / /附件的絕對路徑 Private string GetStream(string FilePath) Try /新建文件流對象 System.IO.FileStream FileStr =new System.IO.FileStream(FilePath,System.IO.FileMode.Open); Byteby=new byteSystem.Convert.ToInt32(FileStr.Length); FileStr.Read(by, 0, by.Length); FileStr.Close(); Return(System.C

28、onvert.ToBase64String(by); Catch MessageBox.Show(“可能你要打開的文件的屬性是只讀的!”,“請檢查權(quán)限”); Return null; 4)將字符串編碼為Base64字符串的函數(shù)Base64Encode 由于 ESMTP的LOGIN認證機制是采用Base64編碼,當用戶發(fā)出AUTHLOGIN的命令后,服務器返回334的應答碼等待用戶輸入。如果身份確認后服務器返回235的應答碼,否則返回失敗信息。所以要將用戶名和密碼轉(zhuǎn)換Base64編碼然后再發(fā)給服務器。此函數(shù)的作用就是把給定的字符串轉(zhuǎn)換成相應的Base64編碼的字符串。5)發(fā)送SMTP命令的函數(shù)S

29、endCommand的函數(shù)作用是把SMTP命令的字符串轉(zhuǎn)換成對應的字節(jié)型值(C#中規(guī)定的Write方法只能寫入字節(jié)型的數(shù)據(jù))然后寫入網(wǎng)絡(luò)中,如果操作成功就返回一個標志為真的布爾型變量,如果操作失敗或者發(fā)生異常就返回標志為假的布爾型變量。具體代碼如下所示:/ / 發(fā)送SMTP命令 / private bool SendCommand(string str) ByteWriteBuffer; If(str=null |str.Trim=String.Empty) return true; WriteBuffer=Encoding.Default.GetBytes(str); try ns.Writ

30、e(WriteBuffer,0, WriteBuffer.Length); Catch Errmsg=”網(wǎng)絡(luò)鏈接錯誤”; Return false; return true; 6)接受服務器應答的函數(shù)RecvResponse 它的作用就是從網(wǎng)絡(luò)流中讀取服務器返回的字節(jié)型的信息,將其轉(zhuǎn)換成字符串型的變量,然后將其返回,可以通過其返回值來判斷操作是否成功。具體實現(xiàn)代碼如下所示:/ / 接受SMTP服務器回應 / private string RecvResponse() int StreamSize; string ReturnValue=string.Empty; byte ReadBuffer

31、=new byte1024; try StreamSize = ns.Read(ReadBuffer,0, ReadBuffer.Length); catch (Exception ex) MessageBox.Show(ex.ToString(); return “false”; if (StreamSize =0) return ReturnValue; else ReturnValue = Encoding.Default.GetString(ReadBuffer).Substring(0, StreamSize); return ReturnValue; 7)重載的函數(shù)Dialog它們

32、的作用是與服務器交互,發(fā)送命令并接收回應。不同的是參數(shù)是字符串類型的那個函數(shù),每個發(fā)送一條命令,并接受服務器的響應,根據(jù)響應的信息來判斷交互的結(jié)果是否成功。而參數(shù)是字符串數(shù)組的函數(shù)每次發(fā)送的是一組命令,用于和服務器的交互,這個函數(shù)主要是用于ESMTP服務器的驗證的功能,因為驗證的過程是一個等待然后又輸入的過程,因此將它們放在一個數(shù)組中有利于理解和操作。而它們的實現(xiàn)主要是通過調(diào)用上面的發(fā)送SMTP命令函數(shù)SendCommand以及接受SMTP服務器響應的函數(shù)RecvResponse來實現(xiàn)的。具體的代碼如下所示: / / 與服務器交互,發(fā)送一條命令并接收回應。 / /一個要發(fā)送的命令 /如果錯誤,

33、要反饋的信息 private bool Dialog(string str ,string errstr) if (str =null | str.Trim() =”) return true; if (SendCommand(str) string RR = RecvResponse(); if(RR =false”) return false; try string RRCode = RR.Substring(0, 3); if (RightCodeHTRRCode!=null) return true; else if (ErrCodeHTRRCode!=null) errmsg+=(R

34、RCode+ErrCodeHTRRCode.ToString(); errmsg+=enter; else errmsg+=RR; errmsg+=errstr; return false; catch MessageBox.Show(“請檢查附件的大小”); ruturn false; else return false; 發(fā)送一組命令主要用于服務器驗證的重載函數(shù)為:/ / 與服務器交互,發(fā)送一條命令并接收回應。 / private bool Dialog(string str ,string errstr) for (int I = 0;istr.Length;i+) /如果在身份驗證階段

35、有一個不成功,就返回錯誤標志位 if(!dialog(stri,”) errmsg +=enter; errmsg +=enter; return false; /身份驗證全部正確的話,則返回正確標志位 return true; 8)郵件發(fā)送程序 SendMail 這是整個程序的核心部分。具體的實現(xiàn)SMTP協(xié)議的程序正是通過它一步一步實現(xiàn)并最終實現(xiàn)發(fā)送簡單郵件甚至帶附件的郵件的功能,而它的實現(xiàn)是調(diào)用以上給出的各個函數(shù)的結(jié)果。以下就是簡單的通過幾個SMTP命令的格式來實現(xiàn): private bool SendEmail() /連接網(wǎng)絡(luò) try /建立一個TCP連接 tc=new TcpClien

36、t(mailserver,mailserverport); catch MessageBox.Show(“連接失敗”,”請確認”); return false; /獲取當前流的資料 ns = tc.Getream(); SMTPCodeADD(); /驗證網(wǎng)絡(luò)連接是否正確 if(RightCodeHTRecvResponse().Substring(0,3)=null) return false; string SendBuffer; string SendBuffer; /進行SMTP驗證 /具體的SMTP命令與代碼的結(jié)合 if(Esmtp) SendBuffernewString4; Se

37、ndBuffer0=”EHLO”+mailserver+enter SendBuffer1=”AUTHLOGIN”+ enter SendBuffer2=Base64Encode(username)+ enter SendBuffer3=Base64Encode(password)+ enterif(!Dialog(SendBuffer,”SMTP服務器驗證失敗,請核對用戶和,密碼。”) return false; else sendBufferstr=”HELO”+mailserver+enter; if(!Dialog(SendBufferstr,”) return false; Send

38、Bufferstr=”MAIL FROM:”+enter; if(!Dialog(SendBufferstr,”發(fā)件人地址錯誤,或不能為空“) return false; /把傳過來的收件人的地址分割然后提交給服務器 string split=”,”; string address=Regex.Split(Recipient,split); SendBuffer=new stringaddress.Length; for(int i=0;iSendBuffer.Length;i+) SendBufferi=”RCPTTO:”+enter; if(!Dialog(SendBuffer,”收件人地

39、址有誤”) return false; SendBufferstr=”DATA”+enter; if(!Dialog(SendBuffer,”) return false; SendBufferstr=”From:”+FromName+”+enter; SendBufferstr+=enter+”,”+enter; if(!Dialog(SendBuffer,”錯誤信件信息”) return false; SendBufferstr=”QUIT”+ENTER; if(!Dialog(SendBuffer,”斷開連接時錯誤”) return false; /關(guān)閉流對象 ns.Close(); /

40、關(guān)閉連接 tc.Close(); FilePath=null; return true; 以上即為發(fā)送不帶附件的郵件SMTP命令用代碼實現(xiàn)的過程。5.2接收郵件類5.2.1主要成員變量說明 1)網(wǎng)絡(luò)連接類的實例popClient,該實例用于連接POP3服務器。 2)int變量count是用來記錄接收郵件的數(shù)目。 3)定義字符串string POPServer,port,login,password 分別代表服務器名,服務器端口號,用戶帳號,用戶密碼。5.2.2主要成員函數(shù)說明 1)連接服務器函數(shù)connect 在接收郵件前,首先要調(diào)用connect()方法連接POP3服務器,并調(diào)用GetMes

41、sageCount()方法獲得需要接收郵件的數(shù)目。返回值為要接收的郵件數(shù)目,如果為0表示郵件沒有接收。其實現(xiàn)的代碼如下所示: public int connect() /連接POP3服務器 OpenPOP.POP3.Utility.Log=true; popClient.Disconnect(); popClient.Connect(POPServer,int,Parse(port); popClient.Authenticate(login,password); /得到郵件總數(shù) count = popClient. GetMessageCount(); msgs.Clear(); return count; 2)接收郵件函數(shù)receiveMail 當讀取出郵件總數(shù)時,就進行接收郵件操作,同時也進行接收附件。代碼如下所示為: public void receivMail(int beginIndex,int endIndex) /收取郵件 for(int i=beginIndex;icount) index=cou

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論