




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第 PAGE * ROMAN II 頁 共 SECTIONPAGES * ROMAN II 頁目 錄 TOC h z t 章標題,1,三級標題,1,二級標題,1 HYPERLINK l _Toc137975884 1 引言 PAGEREF _Toc137975884 h 1 HYPERLINK l _Toc137975885 11 電子郵件介紹 PAGEREF _Toc137975885 h 1 HYPERLINK l _Toc137975886 12 開發背景 PAGEREF _Toc137975886 h 2 HYPERLINK l _Toc137975887 13 開發環境及運行環境 P
2、AGEREF _Toc137975887 h 2 HYPERLINK l _Toc137975888 2 軟件架構及系統用例圖 PAGEREF _Toc137975888 h 3 HYPERLINK l _Toc137975889 21 系統架構 PAGEREF _Toc137975889 h 3 HYPERLINK l _Toc137975890 22 系統總體用例 PAGEREF _Toc137975890 h 3 HYPERLINK l _Toc137975891 24 發送郵件類 PAGEREF _Toc137975891 h 4 HYPERLINK l _Toc137975892 2
3、5 附加小功能類 PAGEREF _Toc137975892 h 4 HYPERLINK l _Toc137975893 3 SMTP協議的研究 PAGEREF _Toc137975893 h 4 HYPERLINK l _Toc137975894 31 SMTP協議簡介及工作原理 PAGEREF _Toc137975894 h 5 HYPERLINK l _Toc137975895 32 SMTP協議的命令和應答 PAGEREF _Toc137975895 h 6 HYPERLINK l _Toc137975896 321 SMTP協議的命令 PAGEREF _Toc137975896 h
4、6 HYPERLINK l _Toc137975932 4 RFC822 PAGEREF _Toc137975932 h 14 HYPERLINK l _Toc137975933 41 RFC822簡單介紹 PAGEREF _Toc137975933 h 14 HYPERLINK l _Toc137975934 42 信件的頭部 PAGEREF _Toc137975934 h 14 HYPERLINK l _Toc137975935 5 命名控件MailSend PAGEREF _Toc137975935 h 20 HYPERLINK l _Toc137975936 51 發送郵件類SmtpM
5、ail PAGEREF _Toc137975936 h 20 HYPERLINK l _Toc137975937 52 AddExtra類 PAGEREF _Toc137975937 h 27 HYPERLINK l _Toc137975938 521 調用Windows API 所需的命名空間 PAGEREF _Toc137975938 h 28 HYPERLINK l _Toc137975939 523 在程序中具體的使用 PAGEREF _Toc137975939 h 28 HYPERLINK l _Toc137975940 6 軟件運行時的界面 PAGEREF _Toc13797594
6、0 h 29 HYPERLINK l _Toc137975941 61 新建郵件帳號 PAGEREF _Toc137975941 h 29 HYPERLINK l _Toc137975942 7 系統測試 PAGEREF _Toc137975942 h 32 HYPERLINK l _Toc137975943 71 同一SMTP服務器發送郵件的測試 PAGEREF _Toc137975943 h 32 HYPERLINK l _Toc137975944 72 利用不同的SMTP服務器發送郵件的測試 PAGEREF _Toc137975944 h 32 HYPERLINK l _Toc13797
7、5945 8 結論 PAGEREF _Toc137975945 h 34 HYPERLINK l _Toc137975946 參考文獻 PAGEREF _Toc137975946 h 35 HYPERLINK l _Toc137975947 致 謝 PAGEREF _Toc137975947 h 36 HYPERLINK l _Toc137975948 外文文獻原文 HYPERLINK l _Toc137975950 譯文第 PAGE * Arabic 45 頁 共 SECTIONPAGES * Arabic 45 頁1 引言11 電子郵件介紹電子郵件(簡稱E-mai1)又稱電子信箱、電子郵政
8、,它是種用電子手段提供信息交換的通信方式。它是全球多種網絡上使用最普遍的一項服務。這種非交互式的通信,加速了信息的交流及數據傳送,它是個簡易、快速的方法。通過連接全世界的Internet,實現各類信號的傳送、接收、存貯等處理,將郵件送到世界的各個角落。到目前為止,可以說電子郵件是Internet資源使用最多的一種服務,E-mai1不只局限于信件的傳遞,還可用來傳遞文件、聲音及圖形、圖像等不同類型的信息。電子郵件不是一種“終端到終端”的服務,是被稱為“存貯轉發式”服務。這正是電子信箱系統的核心,利用存貯轉發可進行非實時通信,屬異步通信方式。即信件發送者可隨時隨地發送郵件,不要求接收者同時在場,即
9、使對方現在不在,仍可將郵件立刻送到對方的信箱內,且存儲在對方的電子郵箱中。接收者可在他認為方便的時候讀取信件,不受時空限制。在這里,“發送”郵件意味著將郵件放到收件人的信箱中,而“接收”郵件則意味著從自己的信箱中讀取信件,信箱實際上是由文件管理系統支持的個實體。因為電子郵件是通過郵件服務器(mai1 server)來傳遞檔的。通常mail server是執行多任務操作系統UNIX的計算機,它提供24小時的電子郵件服務,用戶只要向 mail server管理人員申請個信箱賬號,就可使用這項快速的郵件服務。電子郵件的工作原理:1) 電子郵件系統是一種新型的信息系統,是通信技術和計算機技術結合的產物
10、。 電子郵件的傳輸是通過電子郵件簡單傳輸協議(Simple Mail Transfer Protocol,簡稱SMTP)這一系統軟件來完成的,它是Internet下的一種電子郵件通信協議。 2) 電子郵件的基本原理,是在通信網上設立“電子信箱系統”,它實際上是一個計算機系統。系統的硬件是一個高性能、大容量的計算機。硬盤作為信箱的存儲介質,在硬盤上為用戶分一定的存儲空間作為用戶的“信箱”,每位用戶都有屬于自己的個電子信箱。并確定個用戶名和用戶可以自己隨意修改的口令。存儲空間包含存放所收信件、編輯信件以及信件存盤三部分空間,用戶使用口令開啟自己的信箱,并進行發信、讀信、編輯、轉發、存檔等各種操作。
11、系統功能主要由軟件實現。3) 電子郵件的通信是在信箱之間進行的。用戶首先開啟自己的信箱,然后通過鍵入命令的方式將需要發送的郵件發到對方的信箱中。郵件在信箱之間進行傳遞和交換,也可以與另個郵件系統進行傳遞和交換。收方在取信時,使用特定賬號從信箱提取。12 開發背景當前流行的各大郵件客戶端軟件的除了最主要的收發信件之外,功能越來越復雜,但是人們平常真正用到的功能很少,很多功能尤其對于那些計算機知識相對缺乏的人來說,更加顯得太過于華麗而不太實用。有鑒于此,在了解RFC底層協議的基礎上,我們開發了這個各種功能相對簡單實用的郵件客戶端程序,簡化了很多不必要的功能。13 開發環境及運行環境131 開發環境
12、AMD Athlon(TM),512M內存,80G硬盤Microsoft Windows XP ProfessionalMicrosoft Visual Studio 2003(C Sharp)Microsoft Developer Network for Visual Studio.NET 2003132 運行環境Intel Pentium 2及以上處理器,32M以上內存,4G以上硬盤Microsoft Windows 9X/NT操作系統800*600或以上的屏幕分辨率確保機器上安裝有.Net FrameWork 1.0或者以上版本2 軟件架構及系統用例圖21 系統架構軟件的總體架構如圖2.
13、1:主要功能選擇用戶主界面接收郵件類發送郵件類圖2.1 軟件架構圖22 系統總體用例用戶新建賬號發送郵件接收郵件純文本郵件帶附件郵件圖2.2 系統總體用例圖3 程序功能框圖客戶端軟件電子郵件接收系統電子郵件接收系統附加功能各種錯誤的提示簡單郵件接收帶有附件的郵件接收簡單郵件發送帶有附件的郵件發送電子郵件編寫電子郵件的分類管理通訊簿管理圖2.3 程序功能圖24 發送郵件類是發送郵件的核心,類名為SmtpMail,隸屬于命名空間MailSend。封裝了發送郵件的具體實現方法,也是具體的RFC用代碼實現的過程。而用戶通過具體的操作接口,接口與SmtpMail類通過交互操作來實現用戶發送信件的操作。2
14、5 附加小功能類是獲取一些諸如系統時間,當前用戶名,以及本機IP之類的類,類名為AddExtra,隸屬于命名空間MailSend。3 SMTP協議的研究由于要開發的是郵件客戶端程序,就不得不用到SMTP協議和POP協議。而我個人負責的是郵件發送功能的實現,因此就必然會涉及到SMTP(Simple Mail Transfer Protocol)協議。SMTP被用來在因特網上發送郵件,該協議規定了一些基本的命令和方法使客戶端與服務器進行交互,以達到發送郵件的目的。31 SMTP協議簡介及工作原理311 介紹簡單郵件傳輸協議(SMTP)的目標是可靠高效地傳送郵件,它獨立于傳送子系統而且僅要求一條可以
15、保證傳送數據單元順序的通道。SMTP的一個重要特點是它能夠在傳送中接力傳送郵件,傳送服務提供了進程間通信環境(IPCE),此環境可以包括一個網絡,幾個網絡或一個網絡的子網。理解到傳送系統(或IPCE)不是一對一的是很重要的。進程可能直接和其它進程通過已知的IPCE通信。郵件是一個應用程序或進程間通信。郵件可以通過連接在不同IPCE上的進程跨網絡進行郵件傳送。更特別的是,郵件可以通過不同網絡上的主機接力式傳送。312 SMTP模型 SMTP設計基于以下通信模型:針對用戶的郵件請求,發送SMTP建立與接收SMTP之間建立一個雙向傳送通道。接收SMTP可以是最終接收者也可以是中間傳送者。SMTP命令
16、由發送SMTP發出,由接收SMTP接收,而應答則反方面傳送。一旦傳送通道建立,SMTP發送者發送MAIL命令指明郵件發送者。如果SMTP接收者可以接收郵件則返回OK應答。SMTP發送者再發出RCPT命令確認郵件是否接收到。如果SMTP接收者接收,則返回OK應答;如果不能接收到,則發出拒絕接收應答(但不中止整個郵件操作),雙方將如此重復多次。當接收者收到全部郵件后會接收到特別的序列,如果接收者成功處理了郵件,則返回OK應答。SMTP提供傳送郵件的機制,如果接收方與發送方連接在同一個傳送服務下時,郵件可以直接由發送方主機傳送到接收方主機;或者,當兩者不在同一個傳送服務下時,通過中繼SMTP服務器傳
17、送。為了能夠對SMTP服務器提供中繼能力,它必須擁有最終目的主機地址和郵箱名稱。MAIL命令參數是回復路徑,它指定郵件從何處來;而RCPT命令的參數是轉發路徑的,它指定郵件向何處去。向前路徑是源路徑,而回復路徑是返回路徑(它用于發生錯誤時返回郵件)。當同一個消息要發往不同的接收者時,SMTP遇到了向不同接收者發送同一份數據的復制品的問題,郵件命令和應答有一個比較奇怪的語法,應答也有一個數字代碼。在下面,例子中可以看到哪些使用實際的命令和應答。完整的命令和應答在第四節。命令與應答對大小寫不敏感,也就是說,命令和應答可以是大寫,小寫或兩者的混合,但這一點對用戶郵件名稱卻不一定是對的,因為有的主機對
18、用戶名大小寫是敏感的。這樣SMTP實現中就將用戶郵箱名稱保留成初始時的樣子,主機名稱對大小寫不敏感。命令與應答由ASCII字母表組成,當傳送服務提供8位字節傳送通道,每7位字符正確傳送,而最高位被填充為0。當指定一般的命令或應答格式后,參數會由一些類似于語言的字符串表示出來,如或,這里尖括號表示這是一種類似于語言的變量。32 SMTP協議的命令和應答321 SMTP協議的命令SMTP命令定義了郵件傳輸或由用戶定義的系統功能。它的命令是由結束的字符串。而在帶有參數的情況下,命令本身由和參數分開,如果未帶參數可以直接和連接。郵箱的語法格式必須和接收站點的格式一致。下面討論SMTP命令和應答。發送郵
19、件操作涉及到不同的數據對象,它們由不同的參數相互連接。回復路徑就是MAIL命令的參數,而轉發路徑則是RCPT命令的參數,郵件日期是DATA命令的參數。這些參數或者數據對象必須跟在命令后。這種模式也就要求有不同的緩沖區來存儲這些對象,也就是說,有一個回復路徑緩沖區,一個轉發路徑緩沖區,一個郵件內容緩沖區。特定的命令產生自己的緩沖區,或使一個或多個緩沖的內容被清除。HELLO (HELO)此命令用于向接收SMTP確認發送SMTP。參數域包括發送SMTP的主機名。接收SMTP通過連接確認命令來向發送SMTP確認接收SMTP。引命令和OK響應確認發送和接收SMTP進入了初始狀態,也就是說,沒有操作正在
20、執行,所有狀態表和緩沖區已經被子清除。MAIL (MAIL) 此命令用于開始將郵件發送到一個多個郵箱中。參數域包括回復路徑。返回路徑中包括了可選的主機和發送者郵箱列表。當有主機列表時,它是一個回復路徑源,它說明此郵箱是由在表中的主機一一傳遞發送(第一個主機是最后一個接收到此郵件的主機)過來的。此表也有作向發送者返回非傳遞信號的源路徑。因為每個傳遞主機地址都被加在此表起始處,它就必須使用發送IPCE而不是接收IPCE(如果它們不是一個IPCE的話)清楚的名稱。一些出錯信息的回復路徑可能就是空的。此命令清除回復路徑緩沖區,轉發路徑緩沖區和郵件內容緩沖區,并且將此命令的回復路徑信息插入到回復路徑緩沖
21、區中。RECIPIENT (RCPT)此命令用于確定郵件內容的唯一接收者;多個接收者將由多個此命令指定。轉發路徑中包括一個可選的主機和一個必須的目的郵箱。當出現主機列表時,這就是一個源路徑,它指明郵件必須向列表中的上一個主機發送。如果接收SMTP未實現郵件的傳遞發送,就會返回如未知本地用戶(550)的信息給用戶。當郵件被傳遞發送時,傳遞主機必須將自己的名稱由轉發路徑的開始處移至回復路徑的結束處。當郵件最終到達目的地時,接收SMTP將以它的主機郵件格式自己的名稱插入目標郵件中。例如,由傳遞主機A接收的帶有如下參數的郵件時,FROM:TO:將會變成如下形式:FROM:TO:.此命令導致它的轉發路徑
22、參數加入轉發路徑緩沖區中。DATA (DATA)接收者將跟在命令后的行作為郵件內容。此命令導致此命令后的郵件內容加入郵件內容緩沖區。郵件內容可以包括所有128個ASCII碼字符。郵件內容由只包括一個句號的行結束,也就是如下的字符序列:.,它指示了郵件的結束。郵件內容的結束指示要求接收者現在就處理保存的郵件內容。此過程將回復路徑緩沖區,轉發路徑緩沖區和郵件內容緩沖區的內容全部清空。如果操作成功,接收者必須返回OK應答;如果失敗也必須返回失敗應答。當接收SMTP收到一條信息時,無論是用作轉發還是此郵件已經到達目的地,它都必須在郵件內容的開始處加上時間戳這一行,這一行指示了接收到郵件主機和發出此郵件
23、主機的標識,以及接收到郵件內容的時間和日期。轉發的信件將有多行這樣的時間戳。當接收SMTP作最后一站的傳送時,它將返回路徑信息行插入郵件中。此行包括了發送命令中的的信息。在這里,最后一站的傳送的意思是郵件將被送到目的用戶手中,但在一些情況下,郵件可能需要更進一步的加工并由另外的郵件系統傳送。可能在返回路徑中的郵箱與實際發送的郵件不一致,這個情況可能發生在需要傳送一個特定的錯誤處理信箱而不是信件發送者那里。上面所述說明了,最后的郵件內容由一個返回路徑行,和在其后的一個或多個時間戳行構成。這些行后面是郵件內容的頭和體信息。當處理后面的郵件數據指示部分成功時就需要特定的說明。這種情況可能發生在發送S
24、MTP發現當郵件需要傳送給多個用戶時,只能夠成功地向其中的一部分發送信息這種情況下。在這種情況下,必須對DATA命令發送OK應答,而接收SMTP組織并發送一個不可傳遞郵件信息到信息的發送者。在此信息中或者發送一個不成功接收者的列表,或者每次發送一個不成接收者,而發送多次。所有不可傳遞郵件信息由MAIL命令發送。返回路徑和接收時間戳例子Return-Path: 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 PS
25、TReceived: 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 inform you that . SEND (SEND)此命令用于開始一個發送命令,將郵件發送到一個或多個終端上。參數域包括了一個回復路徑,此命令如果成功就將郵件發送到終端上了。 回復路徑包括一個可選的主機列表和發送者郵箱。當出現主機列表時,
26、表示這是一個傳送路徑,郵件就是經過這個路徑上的每個主機發送到這里的(列表上第一個主機是最后經手的主機)。此表用于返回非傳遞信號到發送者。因為每個傳遞主機地址都被加在此表起始處,它就必須使用發送IPCE而不是接收IPCE(如果它們不是一個IPCE的話)清楚的名稱。一些出錯信息的回復路徑可能就是空的。此命令清除回復路徑緩沖區,轉發路徑緩沖區和郵件內容緩沖區,并且將此命令的回復路徑信息插入到回復路徑緩沖區中。SEND OR MAIL (SOML)此命令用于開始一個郵件操作將郵件內容傳送到一個或多個終端上,或者傳送到郵箱中。對于每個接收者,如果接收者終端打開,郵件內容將被傳送到接收者的終端上,否則就送
27、到接收者的郵箱中。參數域包括回復路徑,如果成功地將信息送到終端或郵箱中此命令成功。回復路徑包括一個可選的主機列表和發送者郵箱。當出現主機列表時,表示這是一個傳送路徑,郵件就是經過這個路徑上的每個主機發送到這里的(列表上第一個主機是最后經手的主機)。此表用于返回非傳遞信號到發送者。因為每個傳遞主機地址都被加在此表起始處,它就必須使用發送IPCE而不是接收IPCE(如果它們不是一個IPCE的話)清楚的名稱。一些出錯信息的回復路徑可能就是空的。此命令清除回復路徑緩沖區,轉發路徑緩沖區和郵件內容緩沖區,并且將此命令的回復路徑信息插入到回復路徑緩沖區中。SEND AND MAIL (SAML)此命令用于
28、開始一個郵件操作將郵件內容傳送到一個或多個終端上,并傳送到郵箱中。如果接收者終端打開,郵件內容將被傳送到接收者的終端上和接收者的郵箱中。參數域包括回復路徑,如果成功地將信息送到郵箱中此命令成功。回復路徑包括一個可選的主機列表和發送者郵箱。當出現主機列表時,表示這是一個傳送路徑,郵件就是經過這個路徑上的每個主機發送到這里的(列表上第一個主機是最后經手的主機)。此表用于返回非傳遞信號到發送者。因為每個傳遞主機地址都被加在此表起始處,它就必須使用發送IPCE而不是接收IPCE(如果它們不是一個IPCE的話)清楚的名稱。一些出錯信息的回復路徑可能就是空的。此命令清除回復路徑緩沖區,轉發路徑緩沖區和郵件
29、內容緩沖區,并且將此命令的回復路徑信息插入到回復路徑緩沖區中。RESET (RSET)此命令指示當送郵件操作將被放棄。任何保存的發送者,接收者和郵件內容應該被拋棄,所有緩沖區和狀態表應該被清除,接收方必須返回OK應答。VERIFY (VRFY)此命令要求接收者確認參數是一個用戶。如果這是(已經知道的)用戶名,返回用戶的全名和指定的郵箱。此命令對回復路徑緩沖區,轉發路徑緩沖區和郵件內容緩沖區沒有影響。EXPAND (EXPN)此命令要求接收者確認參數指定了一個郵件發送列表,如果是一個郵件發送列表,就返回表中的成員。如果這是(已經知道的)用戶名,返回用戶的全名和指定的郵箱。此命令對回復路徑緩沖區,
30、轉發路徑緩沖區和郵件內容緩沖區沒有影響。HELP (HELP)此命令導致接收者向HELP命令的發送者發出幫助信息。此命令可以帶參數,并返回特定的信息作為應答。此命令對回復路徑緩沖區,轉發路徑緩沖區和郵件內容緩沖區沒有影響。NOOP (NOOP) 此命令不影響任何參數和已經發出的命令。它只是說明沒有任何操作而不是說明接收者發送了一個OK應答。此命令對回復路徑緩沖區,轉發路徑緩沖區和郵件內容緩沖區沒有影響。QUIT (QUIT)此命令指示接收方必須發送OK應答然后關閉傳送信道。接收方在接到QUIT命令并做出響應之前不應該關閉通信信道。發送方在發送QUIT命令和接收到響應之前也不應該關閉信道。即使出
31、錯,也不應該關閉信道。如果連接被提前關閉,接收方應該象接收到RSET命令一樣,取消所有等待的操作,但不恢復原先已經做過的操作。而發送方應該象接收到暫時錯誤(4XX)一樣假定命令和操作仍在支持之中。TURN (TURN)此命令指定接收方要么發送OK應答并改變角色為發送SMTP,要么發送拒絕信息并保持自己的角色。如果程序A現在是發送SMTP,它發出TURN命令后接收到OK(250)應答,它就變成了接收SMTP。程序A就進入初始狀態,好象通信信道剛打開一樣,這時它發送220準備好服務信號。如果程序B現在是接收SMTP,它發出TURN命令后接收到OK(250)應答,它就變成了發送SMTP。程序A就進入
32、初始狀態,好象通信信道剛打開一樣,這時它準備接收220準備好服務信號。若要拒絕改變角色,接收方可以發送502應答。對于這些命令的順序有一定的限制。對話的第一個命令必須是HELLO命令,此命令在此后的會話中也可以使用。如果HELLO命令的參數不可接受,必須由返回一個501失敗應答,同時接收到的SMTP必須保持在與剛才一致的狀態下。 NOOP,HELP,EXPN和VRFY命令可以在會話的任何時候使用。MAIL,SEND,SOML或SAML命令開始一個郵件操作。一旦開始了以后就要發送RCPT和DATA命令。郵件操作可以由RSET命令終止。在一個會話中可以有一個或多個操作。如果在操作開始參數不可接受,
33、必須返回501失敗應答,同時接收到的SMTP必須保持在與剛才一致的狀態下。如果操作中的命令順序出錯,必須返回503失敗應答,同時接收到的SMTP必須保持在與剛才一致的狀態下。會話的最后一個命令必須是QUIT命令。此命令在會話的其它時間不能使用。COMMAND語法格式命令是由命令碼和其后的參數域組成的。命令碼是四個字母組成的,不區別大小寫。因為下面的命令的作用是相同的:MAIL Mail mail MaIl mAIl這對于引導任何參數值的標記也是適用的,如TO和to就是一樣的。命令碼和參數由一個或多個空格分開。然而在回復路徑和轉發路徑中的參數是區別大小寫的。特別是在一些主機上,smith和Smi
34、th就根本不是一個用戶。參數域由不定長的字符串組成,它由結束,接收方在完全接收到此序列前不會采取任何行動。方括號代表可選的參數域。如果不選擇的話,系統選擇默認的設置。下面是SMTP命令: HELO MAIL FROM: RCPT TO: DATA RSET SEND FROM: SOML FROM: SAML FROM: VRFY EXPN HELP NOOP QUIT TURN 322 SMTP的應答碼對SMTP命令的響應是多樣的,它確定了在郵件傳輸過程中請求和處理的同步,也保證了發送SMTP知道接收SMTP的狀態。每個命令必須有且只有一個響應。SMTP響應由三位數字組成,其后跟一些文本。數
35、字幫助決定下一個應該進入的狀態,而文本對人是有意義的。三位的響應已經包括了足夠的信息,不用再閱讀文本,文本可以直接拋棄或者傳遞給用戶。特別的是,文本是與接收和環境相關的,所以每次接收到的文本可能不同。在附錄E中可以看到全部的響應碼。正規的情況下,響應由下面序列構成:三位的數字,一行文本和一個,或者也可以是一個多行響應。只有EXPN和HELP命令可以導致多行應答,然而,對所有命令,多行響應都是允許的。REPLY CODES BY FUNCTION GROUPS 500 格式錯誤,命令不可識別(此錯誤也包括命令行過長)501 參數格式錯誤502 命令不可實現503 錯誤的命令序列504 命令參數不
36、可實現211 系統狀態或系統幫助響應214 幫助信息220 服務就緒221 服務關閉傳輸信道 421 服務未就緒,關閉傳輸信道(當必須關閉時,此應答可以作為對任何命令的響應)250 要求的郵件操作完成251 用戶非本地,將轉發向450 要求的郵件操作未完成,郵箱不可用(例如,郵箱忙)550 要求的郵件操作未完成,郵箱不可用(例如,郵箱未找到,或不可訪問)451 放棄要求的操作;處理過程中出錯551 用戶非本地,請嘗試452 系統存儲不足,要求的操作未執行552 過量的存儲分配,要求的操作未執行553 郵箱名不可用,要求的操作未執行(例如郵箱格式錯誤)354 開始郵件輸入,以.結束554 操作失
37、敗4 RFC822說道發送和接受郵件,我們就必須不得不提RFC822了。RFC822的全稱是“ARPA因特網文本信件格式的標準”(Standard for the Format of ARPA Internet Text Messages)。該標準提供了郵件內容的格式和相關語義。41 RFC822簡單介紹RFC822規定的電子郵件內容全部由ASCII字符組成,就是通常所說的文本文件,因而標準將它稱為Internet文本信件(Internet Text Messages)。從直觀上看,信件非常簡單,就是一系列由ASCII字符組成的文本行,每一行以回車換行符(“CRLF“,就是ASCII碼的13和
38、10)結束。從組織上看,信件內容結構分為兩大部分,中間用一個空白行(只有CRLF符的行)來分隔。第一部分稱為信件的頭部(the header of the message),包括有關發送方、接收方、發送日期等信息。第二部分稱為信件的體部(Body of the message),包括信件內容的正文文本。信頭是必需的,信體是可選的,即信體可有可無。如果不存在信體,用作分隔的空白行也就不需要。在信體中,也可以有用作分隔的空白行。這樣設計的信件便于進行語法分析,提取信件的基本信息。在RFC822中規定,信件體就是一系列的向收信人表達信息的文本行,比較簡單,可以包含任意文本,并沒有附加的結構。信件頭則
39、具有比較復雜的結構,在下一小節中詳述。42 信件的頭部421 信頭的一般格式信頭的結構比較復雜,信頭由若干信頭字段(header field)組成,這些字段為用戶和程序提供了關于信件的信息。要了解信頭的結構就要弄清楚各種信頭字段。所有的信頭字段都具有相同的語法結構,從邏輯上說,包括四部分,字段名(field name),緊跟冒號: (colon),后跟字段體(field body),最后以回車換行符(CRLF)終止。即信頭字段 = 字段名:字段體 CRLF字段名必須由除了冒號和空格以外的可打印USASCII字符(其值在33和126之間)組成,大多數字段的字段名稱由一系列字母,數字組成,中間經常
40、插入橫線符。字段名告訴電子郵件軟件如何翻譯該行中剩下的內容。字段體可以包括除了CR和LF之外的任何ASCII字符。但是其中的空格,加括號的注釋,引號和多行字段都比較復雜,另外,字段體的語法和語義依賴于字段名,每個類型的字段有特定的格式。RFC822為信件定義了一些標準字段,并提供了用戶自行定義非標準字段的方422 結構化字段和非結構化字段每個字段所包含的信息不同,字段大體可以分為結構化字段和非結構化字段。結構化字段有特定的格式,由語法分析程序檢測。Sender 字段就是一個很好的例子,它的字段內容是信箱, 有一個離散的結構。非結構化的字段含有任意的數據,沒有固定格式。例如,Subject字段可
41、以含有任意的文字,并且沒有固定格式。非結構化的字段數量較少,只有Subject、 Comments、擴展字段,非標準字段、INReply和References等。所有其它字段都是結構化的。423 信頭字段的元素盡管Email信件的總體結構非常簡單,但一些信頭字段的結構是很復雜的。下面介紹一些大多數字段共有的元素。(1)空白符像其它文本文件一樣,空白符包括空格符(ASCII碼32)和制表符Tab(ASCII碼19)。此外,行末的回車換行符CRLF也應算是空白符。使用空白符可以對字段進行格式化,增加它的可讀性。例如,每個字段間用CRLF來分離,在字段內用空格來分隔字段名和字段內容。在Subject
42、后面的冒號和內容之間插入空格字符,會使字段結構更加清晰。在Email中,空白符的使用并沒有固定的規則,但應當正確地使用,僅在需要時才使用空白符,以便接收軟件進行語法分析。(2)注解注解是由括號括起來的一系列字符,例如,(這份禮物)。注解一般用在非結構化的信頭字段中,沒有語法語義,僅為人提供了一些附加的信息。如果在加引號的字符串中有包括在括號中的字符,那是字符串的一部分,不是注解。在解釋信件的時候,會將注解忽略,可以用一個空格字符代替它們,這樣就什么也不會破壞。(3)字段折疊每個信頭字段從邏輯上說應當是一個由字段名、冒號、字段體和CRLF組成的單一的行,但為了書寫與顯示的方便,增加可讀性,也為了
43、符合1000/80的行字符數的限制,可以將超過80個字符的信頭字段分為多行,即對于比較長的字段,可以分割成幾行,形成折疊。在結構化和非結構化字段中都允許折疊。通過在字段中某些點插入CRLF符和至少一個或多個空白字符來實現字段的折疊,第一行后面的行稱為信頭字段的續行。續行都以一個空白符開始,這種方法稱為折疊(folding),例如標題字段Subject: This is a test可以表示為: Subject: This is a test反之,將一個被折疊成多行的信頭字段恢復到它的單行表示的過程叫做去折疊,只要簡單地移除后面跟著空格的CRLF,將折疊空白符CRLF轉換成空格字符,就可以完成去
44、折疊(unfolding)。在分析被折疊的字段的語法時,要把一個多行的折疊字段展開為一行,根據它的非折疊的形式來分析它的語法與語義。(4)字段大小寫字段名稱是不區分大小寫的,所以Subject、subject或SUBJECT都一樣。不過字段名稱大小寫有習慣的常用形式,如主題字段的大小寫形式通常為Subject。字段體的大小寫稍微復雜點,要視情況而定。比如Subject后面的字段體,其中的大寫可能就是縮寫的專用名詞,不能改動。標準的信頭字段 下面介紹RFC822中定義的常用的標準信頭字段。表4.1 RFC822常用的標準信頭字段與發信方有關的信頭字段格式:From:mailbox舉例:From:
45、寫信人字段。說明信件的原始創建者,給出他的電子信箱地址。創建者對信件的原始內容負責。格式:Sender:mailbox舉例:From:Sender:li發送者字段。說明實際提交發送這個信件的人,給出他的電子信箱地址。當發信人與寫信人不一樣時使用。比如,秘書替經理發信。發送者對發送負責。格式:Reply-TO:mailbox舉例:From: From:zhao回復字段。指定應當把回信發到哪里。如果有此字段,回信將會發給它指定的郵箱,而不會發給From字段指定的郵箱。比如,發送的是經理的信,但回信應交辦公室處理。與收信方有關的信頭字段格式:TO:mailbox list舉例:TO:收信人字段。指定
46、主要收信人的郵箱地址,可以是多個郵箱地址的列表,地址中間用逗號隔開。格式:Cc:mailbox list舉例:Cc:抄送字段。指定此信件要同時發給哪些人,也稱為抄送。也可以使用郵箱地址列表,抄送給多個人。格式:Bcc:mailbox list密抄字段。指定此信件要同時秘密發給哪些人,也稱為密件抄送。也可以使用郵箱地址列表,密抄給多個人。其它的信頭字段格式:Date:date-time舉例:Date:Tue,04 Dec 2004 16:18:08 +800日期字段:Date字段含有電子郵件創建的日期和時間。格式:Subject:*text舉例:Subject:Hello! Subject:Re
47、:Hello!信件主題字段。描述信件的主題。當回復信件時,通常在主題前面增加“Re:”前綴,標記為該信件為回復信件:當信件被轉發時,通常在主題文字前面加上“Fw:”,“Fwd:”這樣的前綴。格式:Received:from domain ;發送主機by domain ;接收主機via atom ;物理路徑id msg-id ;接收者msg id接受字段。是投遞信件的特定郵件服務器所作的記錄。處理郵件投遞的每個服務器必須給它處理的每個信頭的前面加一個Received字段,用以描述信件到達目的地所經過的路徑以及相關信息。當跟蹤各個電子郵件問題時,這個信息很有幫助。舉例:Received:from
48、wang by li Tue dec 2003 12:18:02 +800格式:Comments:*text注釋字段。用于把一個注解添加到信件中。格式:Resent-*舉例:Resent-FromResent-SenderResent-dateResent-Reply-To重發字段。當需要把收到的信件重發給另一組收信人的時候,可以保持整個原始信件不變,并簡單地產生重發信件所要求的新信頭字段。為避免與以前的字段相混。新添加的信頭字段都加上Resent-前綴字符串,它們的語法與未加前綴的同名字段相同。格式:Message-ID:msg-id信件標識字段。用于表示一個信件唯一標識,該字段通常有Smt
49、p服務器生成,這個值通常是唯一的。形式根據使用的軟件而定。通常左邊是標識符,右邊指定電腦名圖2 7 - 2表中的關鍵字表明了電子郵件借用了辦公室備忘錄中的概念和術語:電子郵件的頭部能夠包含一行說明應當接收到該備忘錄的接收方。象傳統的辦公室備忘錄一樣,電子郵件使用關鍵字Cc指明一個復寫副本(carbon copy).電子郵件軟件必須向Cc:后面的電子郵件地址表中的每個地址發送一份消息的副本。傳統的辦公室過程要求備忘錄的發送方通知接收方副本是否傳給其它人。有時發送方希望將備忘錄的一個副本給別人而不顯示出有一個副本被發送出去。一些電子郵件系統提供這樣的選項,遵循傳統的辦公室術語,用盲復寫副本(bli
50、nd carbon copy)來表示。創建消息的用戶在關鍵字Bcc后給出一個電子郵件地址表,指定一個或多個盲復寫副本。雖然Bcc在發送方出現,但當信息發送時,郵件系統將它從消息中除去。每個接收方必須檢查頭部的To和Cc行以決定信息是直接發送還是作為盲副本發送的(有些郵件系統在正文部分附加信息來告訴接收者它是一個盲副本)。其它接收者不知道有哪些用戶接收到盲副本。電子郵件使用與傳統的辦公室備忘錄相同的格式和術語:頭部包括與消息有關的信息,正文包括消息文本。電子郵件頭部的行說明發送方、接收方、日期、主題、應當收到副本的人的列表。(5)擴展字段如果想在信頭中加入RFC822中沒有規定的字段,就需要創建
51、非標準字段。方法非常簡單,只要在自定義的信頭字段名的前面使用X-前綴。RFC822將這種方法稱為擴展字段。 事實上已經有許多擴展字段被廣泛應用,但沒有標準定義。例如:X-LOOP字段X-LOOP字段用來防止郵件的循環傳送。過濾或郵件列表處理程序,可以給它處理的每個信件增加一個X-LOOP字段,以后就可以根據這個字段中含有的特別值,判斷一個信件是否被循環傳送。如果確認郵件發生了循環,過濾或郵件列表處理程序就可以用不同的方式處理該信件。X-Mailer字段X-Mailer字段用于指示什么樣的程序產生了這個信件,它是使用最廣泛的擴展字段。產生郵件的軟件可以為所有發送的信件增加合適的X-Mailer字
52、段,該字段不僅含有軟件的名稱,還包含軟件的版本號。例如軟件名為Littlefox Mailer,版本為V1.0, 可以將“X-Mailer:Littlefox Mailer V1.0”加到郵件信頭中去。圖2 7 - 2列出了一些在因特網電子郵件中可以找到的普通關鍵字,以及使用它們的目的。關鍵字 含義From 發送方地址To 接收方地址Cc 復制副本地址Date 信息創建日期Subject 信息主題Reply-To 回復地址X-Charset 使用的字符集(通常為ASCII)X-Mailer 發送信息所使用的軟件X-Sender 發送方地址的副本X-Face 經編碼的發送方面孔的圖象整個系統的核
53、心是收發信件的操作,因此為了方便維護,以后的升級,故將這兩個最主要的操作寫成類庫(.dll)的形式,以組件的形式加載到主程序中,而且其它的功能如果需要的話,也可以通過這樣的組件的形式增加到主程序中。這也體現了C Sharp這一新的微軟主推語言的方便和高校。而且這樣做也方便了我們小組的程序的順利結合。5 命名控件MailSend由于在C Sharp語言中,都是以命名控件來組織程序的。而所有的類都歸屬于一個特定的命名空間下。需要的命名空間系統本身自帶了一部分,而且如果系統沒有你需要的命名空間的話,就可以自己編寫,本節中的這個命名空間就是由于需要而編寫的。而調用某一個類中的某個變量成員的方法就是通過
54、 命名空間名.類名.變量成員 來訪問的,當然在C Sharp 中如果在程序開始通過Using 命名空間名,就可以直接的象C+那樣來訪問成員變量,可以說相當的方便,這些都會在程序中體現出來,再次不再做過多的敘述。51 發送郵件類SmtpMail511 主要成員變量說明1)網絡連接類及實例TcpClient tc為 TCP 網絡服務提供客戶端連接類TcpClient實例對象tc。TcpClient 類提供了一些簡單的方法,用于在同步阻塞模式下通過網絡來連接、發送和接收流數據。而實例化的過程也是連接SMTP服務器的過程。它的重載方法之一的兩個參數一個為服務器名稱字符串,另一個為服務器的埠。2)提供用
55、于網絡訪問的基礎數據流及其實例 NetworkStream ns此類提供訪問網絡的基礎數據流的方法。其中最基本也是最重要的兩個方法就是Write()和Read()方法,至于參數不再次贅述。3)一維字符串數組變量FilePath此字符串數組主要用來存放用戶選擇的附件的絕對路徑名,并在發送帶附件的郵件時用到。4)發送郵件所需的基本參數比如用于ESMTP等錄檢驗用的用戶名、密碼,發送郵件需要的收信人,發信人地址以及主題等等在此不再贅述。512 主要成員函數說明1)重載的構造函數 SmtpMail()此函數主要用于在初始化過程中,把用戶選擇的附件的路徑以參數的形式傳給FilePath。2)添加附件的函
56、數AddAttachment傳給FilePath的路徑,通過這樣一個函數就可以循環的動態的添加到IList接口的一個對象中了,方便以后在具體的實現的過程中的使用。3)得到上傳的附件的文件流GetStream由于在網絡中的操作都是以網絡流的形式來實現的,因此先將上傳的附件轉換成文件流,然后再用Write的方法把這些附件的文件流寫入到網絡中,來完成發送附件的操作。具體實現代碼如下所示:private string GetStream(string FilePath) /建立文件流對象 System.IO.FileStreamFileStr=new System.IO.FileStream(File
57、Path,System.IO.FileMode.Open); byte by=new byteSystem.Convert.ToInt32(FileStr.Length); FileStr.Read(by,0,by.Length); FileStr.Close(); return(System.Convert.ToBase64String(by); 4)將字符串編碼為Base64字符串的函數Base64Encode由于ESMTP的LOGIN認證機制是采用Base64編碼,當用戶發出AUTHLOGIN的命令后,服務器返回334的應答碼等待用戶輸入。如果身份確認后服務器返回235的應答碼,否則返回
58、失敗信息。所以要將用戶名和密碼轉換成Base64編碼然后再發給服務器。此函數的作用就是把給定的字符串轉換成相應的Base64編碼的字符串。5)發送SMTP命令的函數SendCommand這個函數的作用是把SMTP命令的字符串轉換成對應的字節型值(C中規定的Write方法只能寫入字節型的數據)然后寫入網絡中,如果操作成功就返回一個標志為真的布爾型變量,如果操作失敗或者發生異常就返回標志為假的布爾型變量。具體代碼如下所示:private bool SendCommand(string str) /定義一個數組byte WriteBuffer; /設定一個布爾類型的變量bool state=fals
59、e; WriteBuffer = Encoding.Default.GetBytes(str);/加入防錯機制,可以有效提高程序運行的效率和捕獲出錯信息try/向網絡中寫入數據ns.Write(WriteBuffer,0,WriteBuffer.Length); state=true;catch(Exception ex)/返回出錯信息MessageBox.Show (ex.ToString ();state=false;/返回標志位return state; 6)接受服務器應答的函數RecvResponse它的作用就是從網絡流中讀取服務器返回的字節型的信息,將其轉換成字符串型的變量,然后將其
60、返回,可以通過其返回值來判斷操作是否成功。具體實現代碼如下所示:private string RecvResponse() int StreamSize=0; string ReturnValue =; /定義一個字節型的數組byte ReadBuffer = new byte1024 ; try /從網絡流中讀取數據,并返回讀取的個數StreamSize=ns.Read(ReadBuffer,0,ReadBuffer.Length); catch (Exception ex) /返回異常信息MessageBox.Show(ex.ToString (); if (StreamSize!=0)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 健身教練勞務合同二零二五年
- 入駐天貓合同范例二零二五年
- 心電圖異常診斷新技術應用-全面剖析
- 碳納米管復合材料-第1篇-全面剖析
- 面向對象編程中的抽象與接口設計研究-全面剖析
- 風險管理在電子制造服務中的應用研究-全面剖析
- 公共政策與公眾參與-全面剖析
- 美容儀器市場2025年:技術創新與推廣策略深度解析報告
- 2025年資源型城市綠色轉型發展中的綠色產業園區規劃與建設報告
- 遠程醫療技術2025年在偏遠地區醫療服務中的成本效益分析報告
- 新北師大版八年級下冊數學教案+教學計劃大全
- 量子通信平臺下的宇宙觀測-全面剖析
- 2025-2030中國生物質能發電行業市場現狀供需分析及投資評估規劃分析研究報告
- 固體廢物運輸合同協議
- 2025年全國防災減災日班會 課件
- 普法宣講楊立新-民法典-人格權 編【高清】
- 2023中國電子科技集團有限公司在招企業校招+社招筆試參考題庫附帶答案詳解
- 2025年上半年浙江省杭州市交通運輸局所屬事業單位統一招聘20人易考易錯模擬試題(共500題)試卷后附參考答案
- 10.2 保護人身權(課件)-2024-2025學年七年級道德與法治下冊
- SL631水利水電工程單元工程施工質量驗收標準第1部分:土石方工程
- 日常采購基礎知識培訓
評論
0/150
提交評論