用C#.NET實現電子郵件客戶程式

來源:互聯網
上載者:User

標籤:使用   os   資料   io   for   re   c   代碼   

用C#.NET實現電子郵件客戶程式

周華清 戴晟輝(東華理工學院電腦與通訊系 江西 撫州 344000)

【摘要】通過C#這種VisualSTudio.NET中新引入的物件導向且型別安全的程式設計語言,在.NET平台上開發電子郵件客戶程式。通過通訊端編程實現網路通訊串連,闡述SMTP(簡易郵件傳輸通訊協定)和POP3(郵局協議)的工作原理,然後具體講解了根據SMTP協議開發電子郵件用戶端的郵件發送程式,根據POP3協議開發電子郵件用戶端的郵件接收程式。

【關鍵詞】通訊端  簡易郵件傳輸通訊協定  郵局協議

1 C#中通訊端的編程

通訊端是通訊的基石,是支援TCP/IP協議網路通訊的基本操作單元。可以將通訊端看做不同主機間的進程進行雙向通訊的端點,它構成了單個主機內及整個網路間的編程介面。通訊端存在於通訊域中。通訊域是為了處理一般的線程通過通訊端通訊而引進的一種抽象概念。通訊端通常和同一個域中的通訊端交換資料(資料交換也可能穿越域的界限,但這時一定要執行某種解釋程式)。各種進程使用這個相同的域互相之間用Internet協議簇來進行通訊。

針對C#中Socket編程用Socket類來進行,.NET 架構的Socket類是包含在System.Net.Sockets名字空間中的一個非常重要的類,其中為實現網路編程提供了大量的方法。使用Socket類開發windows網路應用程式原來有規可尋,它們在大多數情況下遵循大致相同的步驟。

在使用之前,你需要首先建立Socket對象的執行個體,這可以通過Socket類的構造方法來實現:

public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType);

其中,addressFamily參數指定Socket使用的定址方案;socketType參數,指定Socket的類型;protocolType參數,指定Socket使用的協議。

下面的樣本語句建立一個Socket,它可用於在基於TCP/IP的網路(如Internet)上通訊。

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

若要使用UDP而不是TCP,需要更改協議類型,如下面的樣本所示:

Socket s=newSocket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

一旦建立Socket,在用戶端,將可以通過Connect方法串連到指定的伺服器,並通過Send/SendTo方法向遠程伺服器發送資料,而後可以通過Receive/ReceiveFrom方法從服務端接收資料;而在伺服器端,你需要使用Bind方法綁定所指定的介面使Socket與一個本地終結點相聯,並通過Listen方法偵聽該介面上的請求,當偵聽到使用者端的串連時,調用Accept完成串連的操作,建立新的Socket以處理傳入的串連請求。使用完Socket後,記住使用Shutdown方法禁用Socket,並使用Close方法關閉Socket。

 2 SMTP和POP3協議的工作過程

在Internet上發送/接收電子郵件,要用到二個協議:SMTP(簡易郵件傳輸通訊協定)和POP3(郵局協議)。下面從SMTP和POP3協議入手,說明如何發送和接收電子郵件。

1,描述了從寄件者使用主機(Client1)發送一封郵件從郵箱[email protected]發往郵箱[email protected](其中網域名稱為server1.com的郵件系統安裝在Server1上,網域名稱為server2.com的郵件系統安裝在Server2上),收件者通過主機(Client2)接收到這封郵件的過程。在郵件傳送的各個階段要採用不同的網路通訊協定。   

(1)寄件者採用Mail Client端軟體在Client 1處撰寫一封郵件發給收件者,首先是將該郵件從Client1發送到他本人的郵箱[email protected]所在的伺服器Server1上。這一步由Client1發往Server的過程採用的是SMTP協議。

 

                          圖1 電子郵件傳送過程

(2)郵件可以從寄件者的郵件伺服器Server1直接傳送到收件者郵箱[email protected]所在的伺服器Server2上,也可能需要經過第三方的郵件伺服器Server3做中轉後再送達接收方,這個過程稱為Relay。這一步在Mail Server之間進行郵件傳送的過程採用的是SMTP協議。郵件發送到接收方的伺服器Server2上後,由Server2負責將該郵件投遞到收件者的郵箱[email protected]中,儲存在Server2的磁碟陣列中。此時,郵件傳送過程結束。

(3)收件者訪問他在Server2上的郵箱[email protected]時,採用Mail Client端軟體Client2將Server2郵箱中的郵件下載到本地硬碟上閱讀。這一步將郵件從Server下載到Client的過程採用的是POP3協議。

開發電子郵件用戶端實際上也就是利用通訊端(Socket)編程進行對話通訊,按照SMTP協議和POP3協議的規範完成郵件傳輸。

3 郵件發送模組的實現

 SMTP協議是TCP/IP協議棧中的一個廣為使用的上層協議。SMTP定義了如何在兩個使用者間傳輸郵件,使用了spooling的概念,允許將郵件從一個本地應用發送到一個SMTP應用。SMTP應用把郵件儲存到一個裝置或記憶體中,一旦郵件到達SMTP應用,該郵件被放入到一個隊列中,一個伺服器檢查是否有郵件到達,然後試圖投遞到達的郵件。如果郵件的收方不存在,伺服器然後還會再進行嘗試。最終,如果郵件不能被投遞,則將該郵件丟棄或返回給郵件的寄件者。這一概念被稱為端到端的投遞,並且它將郵件儲存在隊列中,直到郵件被投遞出去。我們可以從兩個RFC中找到有關SMTP的討論。RFC822描述了報文的結構,其中還包括了信封。RFC821規定了在兩台機器間控制郵件交換的協議。

以下模組利用TcpClient類開發一個SMTP用戶端,以發送郵件。

3.1 發送SMTP命令

SMTP伺服器一般都識別UTF8碼,所有發送命令都使用UTF8編碼,每個命令均以斷行符號分行符號結束。下列代碼實現命令的發送功能。

private void WriteToNetStream(ref NetworkStream NetStream.string Command)

{  string stringToSend = Command + "\r\n";

 Byte[] arrayToSend = System.Text.Encoding.UTF8.GetBytes

        (stringToSend.ToCharArray());

   NetStream.Write(arrayToSend,0,arrayToSend.Length);}

3.2 答應碼的接收

SMTP伺服器對每一個都發出響應。下列代碼實現接受答應碼的功能。

private string ReadFromNetStream(ref NetworkStream NetStream)

{ byte[] bb=new byte[512];

  NetStream.Read(bb,0,bb.Length);

  string read=System.Text.Encoding.UTF8.GetString(bb);}

 3.3 應答碼檢查

發送郵件用戶端必須要檢查應答碼,以判斷伺服器是否已經執行了命令。如果伺服器沒有執行,則重新發送命令或採用其他措施。下列代碼可以檢查伺服器是否正確地執行了命令。

private string checkForError(string strMessage,string check)

{  if (strMessage.Indexof(check) == -1)

      { return "err";}

else{return "correct";}}

上述方法的第一個參數是伺服器返回資訊,第二個參數是要檢查的答應碼。如果伺服器返回的資訊中不存在第二個參數的字串,則返回“err”,表明伺服器沒正確執行命令。

 3.4 發送郵件

用戶端發出DATA命令,在伺服器作出354應答後,即可開始郵件內容的發送。郵件以<CRLF>.<CRLF>結束。下列代碼實現了郵件發送功能。

private void sendMail(ref NetworkStream NetStream, string message)

{   Byte[] attayToSend = System.Text.Encoding.UTF8.GetBytes

(message.ToCharArray());

   NetStream.Write(arrayToSend,0,arrayToSend.Length);}

4 郵件接收模組的實現

POP允許本地郵件UA(User Agent,使用者代理程式)串連SERVER並將郵件取回到使用者本地系統,使用者也在本地機上閱讀和響應訊息。POP3UA通過TCP/IP與伺服器串連(通常使用連接埠110)。輸入使用者名稱和口令經過認證後,UA可通過POP3命令取回或刪除郵件。POP3僅僅是接收協議。POP3UA使用SMTP向伺服器發送郵件。

利用POP3協議開發一個郵件接收程式,使用USER、PASS、STAT、LIST、RETR、DELE、QUIT命令。下面開始開發過程。

 4.1 發送命令碼

 在此發送命令碼也使用的是ASCII碼。下列方法用於向伺服器發送命令碼:

private void WriteToNetStream(ref NetworkStream NetStream.string Command)

{   string stringToSend = Command + "\r\n";

    Byte[]arrayToSend= System.Text.Encoding.ASCII.GetBytes

            (stringToSend.ToCharArray());

    NetStream.Write(arrayToSend,0,arrayToSend.Length);}

4.2 接收伺服器應答

一般而言,接收伺服器應答,既可使用ASCII碼,也可以使用UTF8碼,這裡使用的是ASCII碼。下列方法用於接受伺服器的應答。

private string ReadFromNetStream(ref NetworkStream NetStream)

{  byte[] bb=new byte[1024];

   NetStream.Read(bb,0,bb.Length);

   string read=System.Text.Encoding.ASCII.GetString(bb);

   return read;}

4.3 接受郵件

在此內送郵件用UTF8碼,當遇到<CRKF>.<CRLF>,則結束讀取資料。下列代碼用於內送郵件:

private void ReadMail(ref NetworkStream NetStream,int number)

{  int k=0;

   bool check=false;

   byte[] bb=new byte[6400];

   while(!check)

     { k=NetStream.Read(bb,0,bb.Length);

   string read=System.Text.Encoding.UTF8.GetString(bb,0,k);

       int x= read.IndexOf("\r\n.\r\n");

       if(x!=-1)

          { check=true;}

          richTextBox2.AppendText(read);

          WriteToNetStream(ref

 NetStream,"DELE "+number.ToString());

          string back=ReadFromNetStream(ref NetStream );

        richTextBox1.AppendText("DELE "+number.ToString()

+"命令應答:"+back+"\r\n"); }}

5 結束語

把郵件發送模組和郵件接收模組合起來,就成為一個電子郵件的用戶端程式。在實際應用中,在上面基礎上加以改進,如果再進一步結合資料庫技術,這可以開發出易用、可靠的電子郵件的用戶端程式。

(收稿日期:2004-02-25;電子郵件:[email protected])

 

Programming e-mail client with c#.net

Abstract: Develop a program for e-mail client on the flat of .net with C#. C# is a new language of visual studio .net , is modern, object-oriented and is safe in type. Realize the network correspondence depending Socket programming. Expatiate the principle of SMTP(Simple Mail Transfer Protocol) and POP3(Post office Protocol), then explain developing a program to send e-mail according to the SMTP agreement development E-mail mail customer and carry to receive the procedure developing a program to receive e-mail according to the POP3 in detail.

Key Words: Socket; Simple Mail Transfer Protocol; Post Office Protocol

參 考 文 獻

[1]謝希仁. 電腦網路. 第2版. 北京:清華大學出版社,1999

[2]Charles Petzold. Windows程式設計. 第5版. 北京:北京大學出版社,1999

[3]Anthony Jones 和 Jim Ohlund.  Windows網路編程. 第2版. 北京:清華大學出版社,2002 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.