版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、摘 要電子郵件在當今社會中扮演了一個很重要的角色。越來越多的人在使用它。而且用它的人數(shù)勢必會繼續(xù)增加。雖然,現(xiàn)在已經(jīng)有很多的郵件收發(fā)軟件例如著名的foxmail 但是對于大多數(shù)的非專業(yè)的人來說它還是有點難度稍嫌負責。因此,我們就利用smtp和pop協(xié)議從底層開發(fā)了這個軟件。smtp全稱是簡單郵件傳輸協(xié)議,它專門用來發(fā)送郵件用的。pop全稱是郵局協(xié)議,是專門用于接收郵件的。我主要是負責如何實現(xiàn)發(fā)送郵件功能的。mailsend命名空間是我整個程序的核心。它包括兩個類。在smtpmail的類中包含了一個sendmail的方法,它從底層詳細地實現(xiàn)了和服務(wù)器的交互操作。你既可以用它發(fā)送一個純文本郵件,也
2、可以發(fā)送一個帶有附件的郵件,理所當然地,你也可以使用不同的smtp服務(wù)器。經(jīng)過測試,證實此軟件是一個支持多收信人,多附件的群發(fā)軟件。雖然它沒有foxmail那么強大的功能,但是它容易掌握和使用。關(guān)鍵字:smtp,命名空間,類,附件abstract e-mail play a very important role in modern times.more and more people are using it,and the number of it will larger and larger.though there are a lot of software for sending a
3、nd receiving letters such as foxmail which are also multifunctional,it is difficult and complicated to the most of people who are curbstone.for this reason,we do this software with the rock-bottom protocol of smtp and pop. the full name of smtp is simple mail transfer protocol.it is used to sending
4、letters.the full name of pop is post office protocol which is special to receive letters.i basically take charge to how to realize the function of sending letters. a namespace which is named mailsend is the soul of my programe.it includes two classes.a method named sendmial which realize the fuction
5、 step by step belongs to the class of smtpmail. it detailedly note the track of client exchange to the server. you can use the software to send either a text e mail or a texte-mail with attachments.you also can send a letter to many addressee. in the nature of things,you can use a different smtp ser
6、vice. the software i did support multiletters and multisender after i test.it is simplier than foxmail and other professional softwares,but it is easy to hold and use.key words: smtp,namespace,class,attachment目 錄摘 要1abstract2目 錄3一 引言511 電子郵件介紹512 開發(fā)背景613 開發(fā)環(huán)境及運行環(huán)境6131 開發(fā)環(huán)境6二 軟件架構(gòu)及系統(tǒng)用例圖721 系統(tǒng)架構(gòu)722 系統(tǒng)
7、總體用例72.3 程序功能框圖824 發(fā)送郵件類825 附加小功能類8三 smtp協(xié)議的研究931 smtp協(xié)議簡介及工作原理9311 介紹9312 smtp模型932 smtp協(xié)議的命令和應(yīng)答10321 smtp協(xié)議的命令10322 smtp的應(yīng)答碼14四 rfc8221641 rfc822簡單介紹1642 信件的頭部16421 信頭的一般格式16422 結(jié)構(gòu)化字段和非結(jié)構(gòu)化字段17423 信頭字段的元素174 . 2 . 4標準的信頭字段18五 命名控件mailsend2251 發(fā)送郵件類smtpmail22511 主要成員變量說明22512 主要成員函數(shù)說明22六 軟件運行時的界面246
8、1 新建郵件帳號2462 發(fā)送郵件界面24621 發(fā)送不帶附件的郵件24622 發(fā)送帶附件的郵件2563 驗證郵件發(fā)送是否成功25七 系統(tǒng)測試27711 同一服務(wù)器,發(fā)送一封純文本郵件的測試27712 同一服務(wù)器,發(fā)送一封帶附件的郵件的測試。27結(jié)論28參考文獻29致謝30一 引言11 電子郵件介紹電子郵件(簡稱e-mai1)又稱電子信箱、電子郵政,它是種用電子手段提供信息交換的通信方式。它是全球多種網(wǎng)絡(luò)上使用最普遍的一項服務(wù)。這種非交互式的通信,加速了信息的交流及數(shù)據(jù)傳送,它是個簡易、快速的方法。通過連接全世界的internet,實現(xiàn)各類信號的傳送、接收、存貯等處理,將郵件送到世界的各個角落
9、。到目前為止,可以說電子郵件是internet資源使用最多的一種服務(wù),e-mai1不只局限于信件的傳遞,還可用來傳遞文件、聲音及圖形、圖像等不同類型的信息。電子郵件不是一種“終端到終端”的服務(wù),是被稱為“存貯轉(zhuǎn)發(fā)式”服務(wù)。這正是電子信箱系統(tǒng)的核心,利用存貯轉(zhuǎn)發(fā)可進行非實時通信,屬異步通信方式。即信件發(fā)送者可隨時隨地發(fā)送郵件,不要求接收者同時在場,即使對方現(xiàn)在不在,仍可將郵件立刻送到對方的信箱內(nèi),且存儲在對方的電子郵箱中。接收者可在他認為方便的時候讀取信件,不受時空限制。在這里,“發(fā)送”郵件意味著將郵件放到收件人的信箱中,而“接收”郵件則意味著從自己的信箱中讀取信件,信箱實際上是由文件管理系統(tǒng)支
10、持的個實體。因為電子郵件是通過郵件服務(wù)器(mai1 server)來傳遞檔的。通常mail server是執(zhí)行多任務(wù)操作系統(tǒng)unix的計算機,它提供24小時的電子郵件服務(wù),用戶只要向 mail server管理人員申請個信箱賬號,就可使用這項快速的郵件服務(wù)。電子郵件的工作原理:1) 電子郵件系統(tǒng)是一種新型的信息系統(tǒng),是通信技術(shù)和計算機技術(shù)結(jié)合的產(chǎn)物。 電子郵件的傳輸是通過電子郵件簡單傳輸協(xié)議(simple mail transfer protocol,簡稱smtp)這一系統(tǒng)軟件來完成的,它是internet下的一種電子郵件通信協(xié)議。 2) 電子郵件的基本原理,是在通信網(wǎng)上設(shè)立“電子信箱系統(tǒng)”,
11、它實際上是一個計算機系統(tǒng)。系統(tǒng)的硬件是一個高性能、大容量的計算機。硬盤作為信箱的存儲介質(zhì),在硬盤上為用戶分一定的存儲空間作為用戶的“信箱”,每位用戶都有屬于自己的個電子信箱。并確定個用戶名和用戶可以自己隨意修改的口令。存儲空間包含存放所收信件、編輯信件以及信件存盤三部分空間,用戶使用口令開啟自己的信箱,并進行發(fā)信、讀信、編輯、轉(zhuǎn)發(fā)、存檔等各種操作。系統(tǒng)功能主要由軟件實現(xiàn)。3) 電子郵件的通信是在信箱之間進行的。用戶首先開啟自己的信箱,然后通過鍵入命令的方式將需要發(fā)送的郵件發(fā)到對方的信箱中。郵件在信箱之間進行傳遞和交換,也可以與另個郵件系統(tǒng)進行傳遞和交換。收方在取信時,使用特定賬號從信箱提取。1
12、2 開發(fā)背景當前流行的各大郵件客戶端軟件的除了最主要的收發(fā)信件之外,功能越來越復(fù)雜,但是人們平常真正用到的功能很少,很多功能尤其對于那些計算機知識相對缺乏的人來說,更加顯得太過于華麗而不太實用。有鑒于此,在了解rfc底層協(xié)議的基礎(chǔ)上,我們開發(fā)了這個各種功能相對簡單實用的郵件客戶端程序,簡化了很多不必要的功能。13 開發(fā)環(huán)境及運行環(huán)境131 開發(fā)環(huán)境amd athlon(tm),512m內(nèi)存,80g硬盤microsoft windows xp professionalmicrosoft visual studio 2003(c sharp)microsoft developer network
13、for visual studio.net 2003132 運行環(huán)境intel pentium 2及以上處理器,32m以上內(nèi)存,4g以上硬盤microsoft windows 9x/nt操作系統(tǒng)800*600或以上的屏幕分辨率確保機器上安裝有.net framework 1.0或者以上版本二 軟件架構(gòu)及系統(tǒng)用例圖21 系統(tǒng)架構(gòu)軟件的總體架構(gòu)如圖2.1:22 系統(tǒng)總體用例圖2.2 系統(tǒng)總體用例圖2.3 程序功能框圖客戶端軟件電子郵件接收系統(tǒng)電子郵件接收系統(tǒng)附加功能各種錯誤的提示簡單郵件接收帶有附件的郵件接收簡單郵件發(fā)送帶有附件的郵件發(fā)送電子郵件編寫電子郵件的分類管理通訊簿管理圖2.3 程序功能圖
14、24 發(fā)送郵件類是發(fā)送郵件的核心,類名為smtpmail,隸屬于命名空間mailsend。封裝了發(fā)送郵件的具體實現(xiàn)方法,也是具體的rfc用代碼實現(xiàn)的過程。而用戶通過具體的操作接口,接口與smtpmail類通過交互操作來實現(xiàn)用戶發(fā)送信件的操作。25 附加小功能類是獲取一些諸如系統(tǒng)時間,當前用戶名,以及本機ip之類的類,類名為addextra,隸屬于命名空間mailsend。三 smtp協(xié)議的研究由于要開發(fā)的是郵件客戶端程序,就不得不用到smtp協(xié)議和pop協(xié)議。而我個人負責的是郵件發(fā)送功能的實現(xiàn),因此就必然會涉及到smtp(simple mail transfer protocol)協(xié)議。smt
15、p被用來在因特網(wǎng)上發(fā)送郵件,該協(xié)議規(guī)定了一些基本的命令和方法使客戶端與服務(wù)器進行交互,以達到發(fā)送郵件的目的。31 smtp協(xié)議簡介及工作原理311 介紹簡單郵件傳輸協(xié)議(smtp)的目標是可靠高效地傳送郵件,它獨立于傳送子系統(tǒng)而且僅要求一條可以保證傳送數(shù)據(jù)單元順序的通道。smtp的一個重要特點是它能夠在傳送中接力傳送郵件,傳送服務(wù)提供了進程間通信環(huán)境(ipce),此環(huán)境可以包括一個網(wǎng)絡(luò),幾個網(wǎng)絡(luò)或一個網(wǎng)絡(luò)的子網(wǎng)。理解到傳送系統(tǒng)(或ipce)不是一對一的是很重要的。進程可能直接和其它進程通過已知的ipce通信。郵件是一個應(yīng)用程序或進程間通信。郵件可以通過連接在不同ipce上的進程跨網(wǎng)絡(luò)進行郵件傳
16、送。更特別的是,郵件可以通過不同網(wǎng)絡(luò)上的主機接力式傳送。312 smtp模型 smtp設(shè)計基于以下通信模型:針對用戶的郵件請求,發(fā)送smtp建立與接收smtp之間建立一個雙向傳送通道。接收smtp可以是最終接收者也可以是中間傳送者。smtp命令由發(fā)送smtp發(fā)出,由接收smtp接收,而應(yīng)答則反方面?zhèn)魉?。一旦傳送通道建立,smtp發(fā)送者發(fā)送mail命令指明郵件發(fā)送者。如果smtp接收者可以接收郵件則返回ok應(yīng)答。smtp發(fā)送者再發(fā)出rcpt命令確認郵件是否接收到。如果smtp接收者接收,則返回ok應(yīng)答;如果不能接收到,則發(fā)出拒絕接收應(yīng)答(但不中止整個郵件操作),雙方將如此重復(fù)多次。當接收者收到全
17、部郵件后會接收到特別的序列,如果接收者成功處理了郵件,則返回ok應(yīng)答。smtp提供傳送郵件的機制,如果接收方與發(fā)送方連接在同一個傳送服務(wù)下時,郵件可以直接由發(fā)送方主機傳送到接收方主機;或者,當兩者不在同一個傳送服務(wù)下時,通過中繼smtp服務(wù)器傳送。為了能夠?qū)mtp服務(wù)器提供中繼能力,它必須擁有最終目的主機地址和郵箱名稱。mail命令參數(shù)是回復(fù)路徑,它指定郵件從何處來;而rcpt命令的參數(shù)是轉(zhuǎn)發(fā)路徑的,它指定郵件向何處去。向前路徑是源路徑,而回復(fù)路徑是返回路徑(它用于發(fā)生錯誤時返回郵件)。當同一個消息要發(fā)往不同的接收者時,smtp遇到了向不同接收者發(fā)送同一份數(shù)據(jù)的復(fù)制品的問題,郵件命令和應(yīng)答有
18、一個比較奇怪的語法,應(yīng)答也有一個數(shù)字代碼。在下面,例子中可以看到哪些使用實際的命令和應(yīng)答。完整的命令和應(yīng)答在第四節(jié)。命令與應(yīng)答對大小寫不敏感,也就是說,命令和應(yīng)答可以是大寫,小寫或兩者的混合,但這一點對用戶郵件名稱卻不一定是對的,因為有的主機對用戶名大小寫是敏感的。這樣smtp實現(xiàn)中就將用戶郵箱名稱保留成初始時的樣子,主機名稱對大小寫不敏感。命令與應(yīng)答由ascii字母表組成,當傳送服務(wù)提供8位字節(jié)傳送通道,每7位字符正確傳送,而最高位被填充為0。當指定一般的命令或應(yīng)答格式后,參數(shù)會由一些類似于語言的字符串表示出來,如或,這里尖括號表示這是一種類似于語言的變量。32 smtp協(xié)議的命令和應(yīng)答32
19、1 smtp協(xié)議的命令smtp命令定義了郵件傳輸或由用戶定義的系統(tǒng)功能。它的命令是由結(jié)束的字符串。而在帶有參數(shù)的情況下,命令本身由和參數(shù)分開,如果未帶參數(shù)可以直接和連接。郵箱的語法格式必須和接收站點的格式一致。下面討論smtp命令和應(yīng)答。發(fā)送郵件操作涉及到不同的數(shù)據(jù)對象,它們由不同的參數(shù)相互連接?;貜?fù)路徑就是mail命令的參數(shù),而轉(zhuǎn)發(fā)路徑則是rcpt命令的參數(shù),郵件日期是data命令的參數(shù)。這些參數(shù)或者數(shù)據(jù)對象必須跟在命令后。這種模式也就要求有不同的緩沖區(qū)來存儲這些對象,也就是說,有一個回復(fù)路徑緩沖區(qū),一個轉(zhuǎn)發(fā)路徑緩沖區(qū),一個郵件內(nèi)容緩沖區(qū)。特定的命令產(chǎn)生自己的緩沖區(qū),或使一個或多個緩沖的內(nèi)容
20、被清除。hello (helo)此命令用于向接收smtp確認發(fā)送smtp。參數(shù)域包括發(fā)送smtp的主機名。接收smtp通過連接確認命令來向發(fā)送smtp確認接收smtp。引命令和ok響應(yīng)確認發(fā)送和接收smtp進入了初始狀態(tài),也就是說,沒有操作正在執(zhí)行,所有狀態(tài)表和緩沖區(qū)已經(jīng)被子清除。mail (mail) 此命令用于開始將郵件發(fā)送到一個多個郵箱中。參數(shù)域包括回復(fù)路徑。返回路徑中包括了可選的主機和發(fā)送者郵箱列表。當有主機列表時,它是一個回復(fù)路徑源,它說明此郵箱是由在表中的主機一一傳遞發(fā)送(第一個主機是最后一個接收到此郵件的主機)過來的。此表也有作向發(fā)送者返回非傳遞信號的源路徑。因為每個傳遞主機地址
21、都被加在此表起始處,它就必須使用發(fā)送ipce而不是接收ipce(如果它們不是一個ipce的話)清楚的名稱。一些出錯信息的回復(fù)路徑可能就是空的。此命令清除回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū),并且將此命令的回復(fù)路徑信息插入到回復(fù)路徑緩沖區(qū)中。recipient (rcpt)此命令用于確定郵件內(nèi)容的唯一接收者;多個接收者將由多個此命令指定。轉(zhuǎn)發(fā)路徑中包括一個可選的主機和一個必須的目的郵箱。當出現(xiàn)主機列表時,這就是一個源路徑,它指明郵件必須向列表中的上一個主機發(fā)送。如果接收smtp未實現(xiàn)郵件的傳遞發(fā)送,就會返回如未知本地用戶(550)的信息給用戶。當郵件被傳遞發(fā)送時,傳遞主機必須將自己的名
22、稱由轉(zhuǎn)發(fā)路徑的開始處移至回復(fù)路徑的結(jié)束處。當郵件最終到達目的地時,接收smtp將以它的主機郵件格式自己的名稱插入目標郵件中。例如,由傳遞主機a接收的帶有如下參數(shù)的郵件時,from:to:將會變成如下形式:from:to:.此命令導(dǎo)致它的轉(zhuǎn)發(fā)路徑參數(shù)加入轉(zhuǎn)發(fā)路徑緩沖區(qū)中。data (data)接收者將跟在命令后的行作為郵件內(nèi)容。此命令導(dǎo)致此命令后的郵件內(nèi)容加入郵件內(nèi)容緩沖區(qū)。郵件內(nèi)容可以包括所有128個ascii碼字符。郵件內(nèi)容由只包括一個句號的行結(jié)束,也就是如下的字符序列:.,它指示了郵件的結(jié)束。郵件內(nèi)容的結(jié)束指示要求接收者現(xiàn)在就處理保存的郵件內(nèi)容。此過程將回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件
23、內(nèi)容緩沖區(qū)的內(nèi)容全部清空。如果操作成功,接收者必須返回ok應(yīng)答;如果失敗也必須返回失敗應(yīng)答。當接收smtp收到一條信息時,無論是用作轉(zhuǎn)發(fā)還是此郵件已經(jīng)到達目的地,它都必須在郵件內(nèi)容的開始處加上時間戳這一行,這一行指示了接收到郵件主機和發(fā)出此郵件主機的標識,以及接收到郵件內(nèi)容的時間和日期。轉(zhuǎn)發(fā)的信件將有多行這樣的時間戳。當接收smtp作最后一站的傳送時,它將返回路徑信息行插入郵件中。此行包括了發(fā)送命令中的的信息。在這里,最后一站的傳送的意思是郵件將被送到目的用戶手中,但在一些情況下,郵件可能需要更進一步的加工并由另外的郵件系統(tǒng)傳送??赡茉诜祷芈窂街械泥]箱與實際發(fā)送的郵件不一致,這個情況可能發(fā)生在
24、需要傳送一個特定的錯誤處理信箱而不是信件發(fā)送者那里。上面所述說明了,最后的郵件內(nèi)容由一個返回路徑行,和在其后的一個或多個時間戳行構(gòu)成。這些行后面是郵件內(nèi)容的頭和體信息。當處理后面的郵件數(shù)據(jù)指示部分成功時就需要特定的說明。這種情況可能發(fā)生在發(fā)送smtp發(fā)現(xiàn)當郵件需要傳送給多個用戶時,只能夠成功地向其中的一部分發(fā)送信息這種情況下。在這種情況下,必須對data命令發(fā)送ok應(yīng)答,而接收smtp組織并發(fā)送一個不可傳遞郵件信息到信息的發(fā)送者。在此信息中或者發(fā)送一個不成功接收者的列表,或者每次發(fā)送一個不成接收者,而發(fā)送多次。所有不可傳遞郵件信息由mail命令發(fā)送。返回路徑和接收時間戳例子return-pat
25、h: received: from ghi.arpa by jkl.arpa ; 27 oct 81 15:27:39 pstreceived: from def.arpa by ghi.arpa ; 27 oct 81 15:15:13 pstreceived: from abc.arpa by def.arpa ; 27 oct 81 15:01:59 pstdate: 27 oct 81 15:01:01 pst from: joeabc.arpa subject: improved mailing system installed to: samjkl.arpa this is to
26、inform you that . send (send)此命令用于開始一個發(fā)送命令,將郵件發(fā)送到一個或多個終端上。參數(shù)域包括了一個回復(fù)路徑,此命令如果成功就將郵件發(fā)送到終端上了。 回復(fù)路徑包括一個可選的主機列表和發(fā)送者郵箱。當出現(xiàn)主機列表時,表示這是一個傳送路徑,郵件就是經(jīng)過這個路徑上的每個主機發(fā)送到這里的(列表上第一個主機是最后經(jīng)手的主機)。此表用于返回非傳遞信號到發(fā)送者。因為每個傳遞主機地址都被加在此表起始處,它就必須使用發(fā)送ipce而不是接收ipce(如果它們不是一個ipce的話)清楚的名稱。一些出錯信息的回復(fù)路徑可能就是空的。此命令清除回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū),
27、并且將此命令的回復(fù)路徑信息插入到回復(fù)路徑緩沖區(qū)中。send or mail (soml)此命令用于開始一個郵件操作將郵件內(nèi)容傳送到一個或多個終端上,或者傳送到郵箱中。對于每個接收者,如果接收者終端打開,郵件內(nèi)容將被傳送到接收者的終端上,否則就送到接收者的郵箱中。參數(shù)域包括回復(fù)路徑,如果成功地將信息送到終端或郵箱中此命令成功?;貜?fù)路徑包括一個可選的主機列表和發(fā)送者郵箱。當出現(xiàn)主機列表時,表示這是一個傳送路徑,郵件就是經(jīng)過這個路徑上的每個主機發(fā)送到這里的(列表上第一個主機是最后經(jīng)手的主機)。此表用于返回非傳遞信號到發(fā)送者。因為每個傳遞主機地址都被加在此表起始處,它就必須使用發(fā)送ipce而不是接收i
28、pce(如果它們不是一個ipce的話)清楚的名稱。一些出錯信息的回復(fù)路徑可能就是空的。此命令清除回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū),并且將此命令的回復(fù)路徑信息插入到回復(fù)路徑緩沖區(qū)中。send and mail (saml)此命令用于開始一個郵件操作將郵件內(nèi)容傳送到一個或多個終端上,并傳送到郵箱中。如果接收者終端打開,郵件內(nèi)容將被傳送到接收者的終端上和接收者的郵箱中。參數(shù)域包括回復(fù)路徑,如果成功地將信息送到郵箱中此命令成功?;貜?fù)路徑包括一個可選的主機列表和發(fā)送者郵箱。當出現(xiàn)主機列表時,表示這是一個傳送路徑,郵件就是經(jīng)過這個路徑上的每個主機發(fā)送到這里的(列表上第一個主機是最后經(jīng)手的主機
29、)。此表用于返回非傳遞信號到發(fā)送者。因為每個傳遞主機地址都被加在此表起始處,它就必須使用發(fā)送ipce而不是接收ipce(如果它們不是一個ipce的話)清楚的名稱。一些出錯信息的回復(fù)路徑可能就是空的。此命令清除回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū),并且將此命令的回復(fù)路徑信息插入到回復(fù)路徑緩沖區(qū)中。reset (rset)此命令指示當送郵件操作將被放棄。任何保存的發(fā)送者,接收者和郵件內(nèi)容應(yīng)該被拋棄,所有緩沖區(qū)和狀態(tài)表應(yīng)該被清除,接收方必須返回ok應(yīng)答。verify (vrfy)此命令要求接收者確認參數(shù)是一個用戶。如果這是(已經(jīng)知道的)用戶名,返回用戶的全名和指定的郵箱。此命令對回復(fù)路徑緩
30、沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)沒有影響。expand (expn)此命令要求接收者確認參數(shù)指定了一個郵件發(fā)送列表,如果是一個郵件發(fā)送列表,就返回表中的成員。如果這是(已經(jīng)知道的)用戶名,返回用戶的全名和指定的郵箱。此命令對回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)沒有影響。help (help)此命令導(dǎo)致接收者向help命令的發(fā)送者發(fā)出幫助信息。此命令可以帶參數(shù),并返回特定的信息作為應(yīng)答。此命令對回復(fù)路徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)沒有影響。noop (noop) 此命令不影響任何參數(shù)和已經(jīng)發(fā)出的命令。它只是說明沒有任何操作而不是說明接收者發(fā)送了一個ok應(yīng)答。此命令對回復(fù)路
31、徑緩沖區(qū),轉(zhuǎn)發(fā)路徑緩沖區(qū)和郵件內(nèi)容緩沖區(qū)沒有影響。quit (quit)此命令指示接收方必須發(fā)送ok應(yīng)答然后關(guān)閉傳送信道。接收方在接到quit命令并做出響應(yīng)之前不應(yīng)該關(guān)閉通信信道。發(fā)送方在發(fā)送quit命令和接收到響應(yīng)之前也不應(yīng)該關(guān)閉信道。即使出錯,也不應(yīng)該關(guān)閉信道。如果連接被提前關(guān)閉,接收方應(yīng)該象接收到rset命令一樣,取消所有等待的操作,但不恢復(fù)原先已經(jīng)做過的操作。而發(fā)送方應(yīng)該象接收到暫時錯誤(4xx)一樣假定命令和操作仍在支持之中。turn (turn)此命令指定接收方要么發(fā)送ok應(yīng)答并改變角色為發(fā)送smtp,要么發(fā)送拒絕信息并保持自己的角色。如果程序a現(xiàn)在是發(fā)送smtp,它發(fā)出turn命
32、令后接收到ok(250)應(yīng)答,它就變成了接收smtp。程序a就進入初始狀態(tài),好象通信信道剛打開一樣,這時它發(fā)送220準備好服務(wù)信號。如果程序b現(xiàn)在是接收smtp,它發(fā)出turn命令后接收到ok(250)應(yīng)答,它就變成了發(fā)送smtp。程序a就進入初始狀態(tài),好象通信信道剛打開一樣,這時它準備接收220準備好服務(wù)信號。若要拒絕改變角色,接收方可以發(fā)送502應(yīng)答。對于這些命令的順序有一定的限制。對話的第一個命令必須是hello命令,此命令在此后的會話中也可以使用。如果hello命令的參數(shù)不可接受,必須由返回一個501失敗應(yīng)答,同時接收到的smtp必須保持在與剛才一致的狀態(tài)下。 noop,help,ex
33、pn和vrfy命令可以在會話的任何時候使用。mail,send,soml或saml命令開始一個郵件操作。一旦開始了以后就要發(fā)送rcpt和data命令。郵件操作可以由rset命令終止。在一個會話中可以有一個或多個操作。如果在操作開始參數(shù)不可接受,必須返回501失敗應(yīng)答,同時接收到的smtp必須保持在與剛才一致的狀態(tài)下。如果操作中的命令順序出錯,必須返回503失敗應(yīng)答,同時接收到的smtp必須保持在與剛才一致的狀態(tài)下。會話的最后一個命令必須是quit命令。此命令在會話的其它時間不能使用。command語法格式命令是由命令碼和其后的參數(shù)域組成的。命令碼是四個字母組成的,不區(qū)別大小寫。因為下面的命令的
34、作用是相同的:mail mail mail mail mail這對于引導(dǎo)任何參數(shù)值的標記也是適用的,如to和to就是一樣的。命令碼和參數(shù)由一個或多個空格分開。然而在回復(fù)路徑和轉(zhuǎn)發(fā)路徑中的參數(shù)是區(qū)別大小寫的。特別是在一些主機上,smith和smith就根本不是一個用戶。參數(shù)域由不定長的字符串組成,它由結(jié)束,接收方在完全接收到此序列前不會采取任何行動。方括號代表可選的參數(shù)域。如果不選擇的話,系統(tǒng)選擇默認的設(shè)置。322 smtp的應(yīng)答碼對smtp命令的響應(yīng)是多樣的,它確定了在郵件傳輸過程中請求和處理的同步,也保證了發(fā)送smtp知道接收smtp的狀態(tài)。每個命令必須有且只有一個響應(yīng)。smtp響應(yīng)由三位數(shù)
35、字組成,其后跟一些文本。數(shù)字幫助決定下一個應(yīng)該進入的狀態(tài),而文本對人是有意義的。三位的響應(yīng)已經(jīng)包括了足夠的信息,不用再閱讀文本,文本可以直接拋棄或者傳遞給用戶。特別的是,文本是與接收和環(huán)境相關(guān)的,所以每次接收到的文本可能不同。在附錄e中可以看到全部的響應(yīng)碼。正規(guī)的情況下,響應(yīng)由下面序列構(gòu)成:三位的數(shù)字,一行文本和一個,或者也可以是一個多行響應(yīng)。只有expn和help命令可以導(dǎo)致多行應(yīng)答,然而,對所有命令,多行響應(yīng)都是允許的。reply codes by function groups 500 格式錯誤,命令不可識別(此錯誤也包括命令行過長)501 參數(shù)格式錯誤502 命令不可實現(xiàn)503 錯誤的
36、命令序列504 命令參數(shù)不可實現(xiàn)211 系統(tǒng)狀態(tài)或系統(tǒng)幫助響應(yīng)214 幫助信息220 服務(wù)就緒221 服務(wù)關(guān)閉傳輸信道 421 服務(wù)未就緒,關(guān)閉傳輸信道(當必須關(guān)閉時,此應(yīng)答可以作為對任何命令的響應(yīng))250 要求的郵件操作完成251 用戶非本地,將轉(zhuǎn)發(fā)向450 要求的郵件操作未完成,郵箱不可用(例如,郵箱忙)550 要求的郵件操作未完成,郵箱不可用(例如,郵箱未找到,或不可訪問)451 放棄要求的操作;處理過程中出錯551 用戶非本地,請嘗試452 系統(tǒng)存儲不足,要求的操作未執(zhí)行552 過量的存儲分配,要求的操作未執(zhí)行553 郵箱名不可用,要求的操作未執(zhí)行(例如郵箱格式錯誤)354 開始郵件輸
37、入,以.結(jié)束554 操作失敗四 rfc822說道發(fā)送和接受郵件,我們就必須不得不提rfc822了。rfc822的全稱是“arpa因特網(wǎng)文本信件格式的標準”(standard for the format of arpa internet text messages)。該標準提供了郵件內(nèi)容的格式和相關(guān)語義。41 rfc822簡單介紹rfc822規(guī)定的電子郵件內(nèi)容全部由ascii字符組成,就是通常所說的文本文件,因而標準將它稱為internet文本信件(internet text messages)。從直觀上看,信件非常簡單,就是一系列由ascii字符組成的文本行,每一行以回車換行符(“crlf“
38、,就是ascii碼的13和10)結(jié)束。從組織上看,信件內(nèi)容結(jié)構(gòu)分為兩大部分,中間用一個空白行(只有crlf符的行)來分隔。第一部分稱為信件的頭部(the header of the message),包括有關(guān)發(fā)送方、接收方、發(fā)送日期等信息。第二部分稱為信件的體部(body of the message),包括信件內(nèi)容的正文文本。信頭是必需的,信體是可選的,即信體可有可無。如果不存在信體,用作分隔的空白行也就不需要。在信體中,也可以有用作分隔的空白行。這樣設(shè)計的信件便于進行語法分析,提取信件的基本信息。在rfc822中規(guī)定,信件體就是一系列的向收信人表達信息的文本行,比較簡單,可以包含任意文本,
39、并沒有附加的結(jié)構(gòu)。信件頭則具有比較復(fù)雜的結(jié)構(gòu),在下一小節(jié)中詳述。42 信件的頭部421 信頭的一般格式信頭的結(jié)構(gòu)比較復(fù)雜,信頭由若干信頭字段(header field)組成,這些字段為用戶和程序提供了關(guān)于信件的信息。要了解信頭的結(jié)構(gòu)就要弄清楚各種信頭字段。所有的信頭字段都具有相同的語法結(jié)構(gòu),從邏輯上說,包括四部分,字段名(field name),緊跟冒號: (colon),后跟字段體(field body),最后以回車換行符(crlf)終止。即信頭字段 = 字段名:字段體 crlf字段名必須由除了冒號和空格以外的可打印usascii字符(其值在33和126之間)組成,大多數(shù)字段的字段名稱由一系
40、列字母,數(shù)字組成,中間經(jīng)常插入橫線符。字段名告訴電子郵件軟件如何翻譯該行中剩下的內(nèi)容。字段體可以包括除了cr和lf之外的任何ascii字符。但是其中的空格,加括號的注釋,引號和多行字段都比較復(fù)雜,另外,字段體的語法和語義依賴于字段名,每個類型的字段有特定的格式。rfc822為信件定義了一些標準字段,并提供了用戶自行定義非標準字段的方法。422 結(jié)構(gòu)化字段和非結(jié)構(gòu)化字段每個字段所包含的信息不同,字段大體可以分為結(jié)構(gòu)化字段和非結(jié)構(gòu)化字段。結(jié)構(gòu)化字段有特定的格式,由語法分析程序檢測。sender 字段就是一個很好的例子,它的字段內(nèi)容是信箱, 有一個離散的結(jié)構(gòu)。非結(jié)構(gòu)化的字段含有任意的數(shù)據(jù),沒有固定格
41、式。例如,subject字段可以含有任意的文字,并且沒有固定格式。非結(jié)構(gòu)化的字段數(shù)量較少,只有subject、 comments、擴展字段,非標準字段、inreply和references等。所有其它字段都是結(jié)構(gòu)化的。423 信頭字段的元素盡管email信件的總體結(jié)構(gòu)非常簡單,但一些信頭字段的結(jié)構(gòu)是很復(fù)雜的。下面介紹一些大多數(shù)字段共有的元素。(1)空白符像其它文本文件一樣,空白符包括空格符(ascii碼32)和制表符tab(ascii碼19)。此外,行末的回車換行符crlf也應(yīng)算是空白符。使用空白符可以對字段進行格式化,增加它的可讀性。例如,每個字段間用crlf來分離,在字段內(nèi)用空格來分隔字段
42、名和字段內(nèi)容。在subject后面的冒號和內(nèi)容之間插入空格字符,會使字段結(jié)構(gòu)更加清晰。在email中,空白符的使用并沒有固定的規(guī)則,但應(yīng)當正確地使用,僅在需要時才使用空白符,以便接收軟件進行語法分析。(2)注解注解是由括號括起來的一系列字符,例如,(這份禮物)。注解一般用在非結(jié)構(gòu)化的信頭字段中,沒有語法語義,僅為人提供了一些附加的信息。如果在加引號的字符串中有包括在括號中的字符,那是字符串的一部分,不是注解。在解釋信件的時候,會將注解忽略,可以用一個空格字符代替它們,這樣就什么也不會破壞。(3)字段折疊每個信頭字段從邏輯上說應(yīng)當是一個由字段名、冒號、字段體和crlf組成的單一的行,但為了書寫與
43、顯示的方便,增加可讀性,也為了符合1000/80的行字符數(shù)的限制,可以將超過80個字符的信頭字段分為多行,即對于比較長的字段,可以分割成幾行,形成折疊。在結(jié)構(gòu)化和非結(jié)構(gòu)化字段中都允許折疊。通過在字段中某些點插入crlf符和至少一個或多個空白字符來實現(xiàn)字段的折疊,第一行后面的行稱為信頭字段的續(xù)行。續(xù)行都以一個空白符開始,這種方法稱為折疊(folding),例如標題字段subject: this is a test可以表示為: subject: this is a test反之,將一個被折疊成多行的信頭字段恢復(fù)到它的單行表示的過程叫做去折疊,只要簡單地移除后面跟著空格的crlf,將折疊空白符crl
44、f轉(zhuǎn)換成空格字符,就可以完成去折疊(unfolding)。在分析被折疊的字段的語法時,要把一個多行的折疊字段展開為一行,根據(jù)它的非折疊的形式來分析它的語法與語義。(4)字段大小寫字段名稱是不區(qū)分大小寫的,所以subject、subject或subject都一樣。不過字段名稱大小寫有習慣的常用形式,如主題字段的大小寫形式通常為subject。字段體的大小寫稍微復(fù)雜點,要視情況而定。比如subject后面的字段體,其中的大寫可能就是縮寫的專用名詞,不能改動。4 . 2 . 4標準的信頭字段下面介紹rfc822中定義的常用的標準信頭字段。表4.1 rfc822常用的標準信頭字段與發(fā)信方有關(guān)的信頭字段
45、格式:from:mailbox舉例:from:wang寫信人字段。說明信件的原始創(chuàng)建者,給出他的電子信箱地址。創(chuàng)建者對信件的原始內(nèi)容負責。格式:sender:mailbox舉例:from:wangsender:li發(fā)送者字段。說明實際提交發(fā)送這個信件的人,給出他的電子信箱地址。當發(fā)信人與寫信人不一樣時使用。比如,秘書替經(jīng)理發(fā)信。發(fā)送者對發(fā)送負責。格式:reply-to:mailbox舉例:from:wang from:zhao回復(fù)字段。指定應(yīng)當把回信發(fā)到哪里。如果有此字段,回信將會發(fā)給它指定的郵箱,而不會發(fā)給from字段指定的郵箱。比如,發(fā)送的是經(jīng)理的信,但回信應(yīng)交辦公室處理。與收信方有關(guān)的信
46、頭字段格式:to:mailbox list舉例:to:zhang收信人字段。指定主要收信人的郵箱地址,可以是多個郵箱地址的列表,地址中間用逗號隔開。格式:cc:mailbox list舉例:cc:zhang抄送字段。指定此信件要同時發(fā)給哪些人,也稱為抄送。也可以使用郵箱地址列表,抄送給多個人。格式:bcc:mailbox list密抄字段。指定此信件要同時秘密發(fā)給哪些人,也稱為密件抄送。也可以使用郵箱地址列表,密抄給多個人。其它的信頭字段格式:date:date-time舉例:date:tue,04 dec 2004 16:18:08 +800日期字段:date字段含有電子郵件創(chuàng)建的日期和時間
47、。格式:subject:*text舉例:subject:hello! subject:re:hello!信件主題字段。描述信件的主題。當回復(fù)信件時,通常在主題前面增加“re:”前綴,標記為該信件為回復(fù)信件:當信件被轉(zhuǎn)發(fā)時,通常在主題文字前面加上“fw:”,“fwd:”這樣的前綴。格式:received:from domain ;發(fā)送主機by domain ;接收主機via atom ;物理路徑id msg-id ;接收者msg id接受字段。是投遞信件的特定郵件服務(wù)器所作的記錄。處理郵件投遞的每個服務(wù)器必須給它處理的每個信頭的前面加一個received字段,用以描述信件到達目的地所經(jīng)過的路徑以
48、及相關(guān)信息。當跟蹤各個電子郵件問題時,這個信息很有幫助。舉例:received:from wang by li tue dec 2003 12:18:02 +800格式:comments:*text注釋字段。用于把一個注解添加到信件中。格式:resent-*舉例:resent-fromresent-senderresent-dateresent-reply-to重發(fā)字段。當需要把收到的信件重發(fā)給另一組收信人的時候,可以保持整個原始信件不變,并簡單地產(chǎn)生重發(fā)信件所要求的新信頭字段。為避免與以前的字段相混。新添加的信頭字段都加上resent-前綴字符串,它們的語
49、法與未加前綴的同名字段相同。格式:message-id:msg-id信件標識字段。用于表示一個信件唯一標識,該字段通常有smtp服務(wù)器生成,這個值通常是唯一的。形式根據(jù)使用的軟件而定。通常左邊是標識符,右邊指定電腦名圖中的關(guān)鍵字表明了電子郵件借用了辦公室備忘錄中的概念和術(shù)語:電子郵件的頭部能夠包含一行說明應(yīng)當接收到該備忘錄的接收方。象傳統(tǒng)的辦公室備忘錄一樣,電子郵件使用關(guān)鍵字cc指明一個復(fù)寫副本(carbon copy).電子郵件軟件必須向cc:后面的電子郵件地址表中的每個地址發(fā)送一份消息的副本。傳統(tǒng)的辦公室過程要求備忘錄的發(fā)送方通知接收方副本是否傳給其它人。有時發(fā)送方希望將備忘錄的一個副本給
50、別人而不顯示出有一個副本被發(fā)送出去。一些電子郵件系統(tǒng)提供這樣的選項,遵循傳統(tǒng)的辦公室術(shù)語,用盲復(fù)寫副本(blind carbon copy)來表示。創(chuàng)建消息的用戶在關(guān)鍵字bcc后給出一個電子郵件地址表,指定一個或多個盲復(fù)寫副本。雖然bcc在發(fā)送方出現(xiàn),但當信息發(fā)送時,郵件系統(tǒng)將它從消息中除去。每個接收方必須檢查頭部的to和cc行以決定信息是直接發(fā)送還是作為盲副本發(fā)送的(有些郵件系統(tǒng)在正文部分附加信息來告訴接收者它是一個盲副本)。其它接收者不知道有哪些用戶接收到盲副本。電子郵件使用與傳統(tǒng)的辦公室備忘錄相同的格式和術(shù)語:頭部包括與消息有關(guān)的信息,正文包括消息文本。電子郵件頭部的行說明發(fā)送方、接收方
51、、日期、主題、應(yīng)當收到副本的人的列表。(5)擴展字段如果想在信頭中加入rfc822中沒有規(guī)定的字段,就需要創(chuàng)建非標準字段。方法非常簡單,只要在自定義的信頭字段名的前面使用x-前綴。rfc822將這種方法稱為擴展字段。 事實上已經(jīng)有許多擴展字段被廣泛應(yīng)用,但沒有標準定義。例如:x-loop字段x-loop字段用來防止郵件的循環(huán)傳送。過濾或郵件列表處理程序,可以給它處理的每個信件增加一個x-loop字段,以后就可以根據(jù)這個字段中含有的特別值,判斷一個信件是否被循環(huán)傳送。如果確認郵件發(fā)生了循環(huán),過濾或郵件列表處理程序就可以用不同的方式處理該信件。x-mailer字段x-mailer字段用于指示什么樣
52、的程序產(chǎn)生了這個信件,它是使用最廣泛的擴展字段。產(chǎn)生郵件的軟件可以為所有發(fā)送的信件增加合適的x-mailer字段,該字段不僅含有軟件的名稱,還包含軟件的版本號。例如軟件名為littlefox mailer,版本為v1.0, 可以將“x-mailer:littlefox mailer v1.0”加到郵件信頭中去。圖中列出了一些在因特網(wǎng)電子郵件中可以找到的普通關(guān)鍵字,以及使用它們的目的。關(guān)鍵字 含義from 發(fā)送方地址to 接收方地址cc 復(fù)制副本地址date 信息創(chuàng)建日期subject 信息主題reply-to 回復(fù)地址x-charset 使用的字符集(通常為ascii)x-mailer 發(fā)送信
53、息所使用的軟件x-sender 發(fā)送方地址的副本x-face 經(jīng)編碼的發(fā)送方面孔的圖象整個系統(tǒng)的核心是收發(fā)信件的操作,因此為了方便維護,以后的升級,故將這兩個最主要的操作寫成類庫(.dll)的形式,以組件的形式加載到主程序中,而且其它的功能如果需要的話,也可以通過這樣的組件的形式增加到主程序中。這也體現(xiàn)了c sharp這一新的微軟主推語言的方便和高校。而且這樣做也方便了我們小組的程序的順利結(jié)合。五 命名控件mailsend由于在c sharp語言中,都是以命名控件來組織程序的。而所有的類都歸屬于一個特定的命名空間下。需要的命名空間系統(tǒng)本身自帶了一部分,而且如果系統(tǒng)沒有你需要的命名空間的話,就可
54、以自己編寫,本節(jié)中的這個命名空間就是由于需要而編寫的。而調(diào)用某一個類中的某個變量成員的方法就是通過 命名空間名.類名.變量成員 來訪問的,當然在c sharp 中如果在程序開始通過using 命名空間名,就可以直接的象c+那樣來訪問成員變量,可以說相當?shù)姆奖悖@些都會在程序中體現(xiàn)出來,再次不再做過多的敘述。51 發(fā)送郵件類smtpmail511 主要成員變量說明1)網(wǎng)絡(luò)連接類及實例tcpclient tc為 tcp 網(wǎng)絡(luò)服務(wù)提供客戶端連接類tcpclient實例對象tc。tcpclient 類提供了一些簡單的方法,用于在同步阻塞模式下通過網(wǎng)絡(luò)來連接、發(fā)送和接收流數(shù)據(jù)。而實例化的過程也是連接smtp服務(wù)器的過程。它的重載方法之一的兩個參數(shù)一個為服務(wù)器名稱字符串,另一個為服務(wù)器的埠。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等錄檢驗用的用戶名、密碼,發(fā)送郵件需要的收信人,發(fā)信人地址以及主題
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年眼健康市場分析
- 2023年聯(lián)通移動網(wǎng)諾基亞bt6s設(shè)備維護操作手冊v
- 2020年大學《信息技術(shù)基礎(chǔ)》期末考核復(fù)習題庫(含答案)
- 2024年春季《青玉案元夕》教案編寫:從傳統(tǒng)到現(xiàn)代的跨越
- 在線安全教育培訓記錄表2024年版本
- 第47屆世界技能大賽制造團隊挑戰(zhàn)賽項目江蘇省選拔賽樣題(產(chǎn)品設(shè)計專業(yè)方向)
- 2023年棗莊市“魯班傳人”職業(yè)技能大賽-棗莊市電力行業(yè)職業(yè)技能競賽(無人機駕駛員)技術(shù)文件
- 《曾子殺豬》與新春教育新趨勢
- 檢查電路的一般方法
- 2020年K12在線教育行業(yè)報告
- 心肺復(fù)蘇術(shù)課件2024新版
- 北師大版數(shù)學一年級上冊期中考試試題
- 行政復(fù)議法-形考作業(yè)2-國開(ZJ)-參考資料
- 起重機械安全技術(shù)規(guī)程(TSG-51-2023)宣貫解讀課件
- 職業(yè)倦怠量表MBIGS (MBIGeneral Survey)
- 會議·宴會預(yù)訂單
- 個人醫(yī)德醫(yī)風檔案
- 局組會議議題提報單模板
- 世界氣溫和降水的分布
- 申請一年或多年多次往返申根簽證信
- 實踐與認識的關(guān)系PPT課件
評論
0/150
提交評論