標籤:
用visual c#實現郵件接收程式_郵件伺服器
本文通過運用C#來實現一個基於POP3協議的郵件接收程式來向大家展示C#網路編程的功能強大,同時也向大家介紹一下基於POP3協議的電子郵件接收原理。
首先我向大家介紹郵件接收的基本原理:
一開始便是用戶端與伺服器的串連。不過,在用戶端串連到伺服器之前,注意把連接埠設為POP3協議預設的110號。
用戶端串連伺服器成功後,伺服器會返回以下資訊:
+OK……
字元+OK是POP3協議的返回資訊。它的回應資訊不像SMTP協議那樣用豐富多變的數字表示,只有兩個:+OK或者-ERR。其中,+OK表示串連成功,而-ERR則表示串連失敗。
接下來,用戶端輸入USER <使用者名稱>
該命令告訴伺服器你的使用者名稱。注意,有些伺服器會區分大小寫字母的。
伺服器返回+OK後,用戶端輸入PASS <口令>
伺服器返回+OK後,還返回一些郵箱的統計資訊,比如:+OK 1 message(s) [1304 byte(s)]
不同的伺服器返回的資訊格式不太一樣,所以我們可以用STAT命令來查看郵箱的情況。STAT命令的回應中有兩個數字,分別表示郵件的數量和郵件的大小。
如果信箱裡有信,就可以用RETR命令來擷取郵件的本文。RETR命令的格式為:
RETR <郵件編號>
如果返回結果第一行是+OK資訊,則表示成功。第二行起便是郵件的本文。最後一行和SMTP協議一樣,是一個單獨的英文句號,表示郵件的結尾部分。
把郵件儲存起來後要用DELE命令刪除郵箱中的郵件,否則原有的郵件會繼續保留在伺服器上,一旦郵件一多,你的郵箱就爆了。DELE命令的格式為:
DELE <郵件編號>
如果刪錯了,可以用RSET命令來恢複所有已被刪除的郵件。條件是你還沒有退出,一旦退出,那就一切Bye Bye了。全部完成以後,輸入QUIT命令就可以退出POP3伺服器了。
以上,我簡要地向大家介紹了POP3郵件接收的基本過程和原理,下面就是一個運用上面的原理實現的簡易的郵件接收程式。在本程式中,我主要用到了兩個類:TcpClient類和NetworkStream類。TcpClient類是運用C#進行網路編程的一個非常重要的類,它提供了通過網路連接、發送和接收資料的簡單方法,從而實現了網路編程的大大簡化。NetworkStream類實現通過網路通訊端發送和接收資料的標準.Net架構流機制,它支援對網路資料流的同步和非同步訪問,是實現網路通訊的重要組成部分。在這裡我先給出程式最終的運行效果,圖示如下:
具體的過程步驟如下:
第一步:開啟VS.Net,建立一個工程,在項目類型裡選擇"Visual C#項目",在模板裡選擇"Windows 應用程式",工程名不妨為"MailReceiver",最後點擊"確定"按鈕。
第二步:布置主介面。先往表單上添加如下控制項:六個Label控制項、四個TextBox控制項、一個RichTextBox控制項、一個CheckBox控制項、一個ListBox控制項以及三個Button控制項。各個控制項的屬性設定1所示。
在設定完圖1的各個控制項屬性後,對主表單進行合理的布局,則可得到最終的介面如下所示:
第三步:代碼編寫。首先因為程式中運用到網路編程的一些重要的類,如:TcpClient、NetworkStream,所以在程式的開頭處需添加以下名字空間(Namespace):
using System.Net; using System.Net.Sockets; using System.IO; |
接著,為我們的類添加以下一些公有的資料成員:
public TcpClient Server; public NetworkStream NetStrm; public StreamReader RdStrm; public string Data; public byte[] szData; public string CRLF = "\r\n"; |
最後,便是三個按鈕的訊息響應函數,這三個函數是程式的主體部分。其中Connect按鈕的訊息響應函數完成了到POP3伺服器的串連工作,並根據使用者名稱和密碼進行登入。如果一切順利,則再向伺服器發送STAT命令從而獲得郵箱中郵件的相關資訊:郵件數量和大小,最終完成串連。其函數實現如下:
private void Connect_Click(object sender, System.EventArgs e) { //將游標置為等待狀態 Cursor cr = Cursor.Current; Cursor.Current = Cursors.WaitCursor;
//用110連接埠建立POP3伺服器串連 Server = new TcpClient(PopServer.Text,110); Status.Items.Clear();
try { //初始化 NetStrm = Server.GetStream(); RdStrm= new StreamReader(Server.GetStream()); Status.Items.Add(RdStrm.ReadLine());
//登入伺服器過程 Data = "USER "+ Username.Text+CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()); NetStrm.Write(szData,0,szData.Length); Status.Items.Add(RdStrm.ReadLine());
Data = "PASS "+ Password.Text+CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()); NetStrm.Write(szData,0,szData.Length); Status.Items.Add(RdStrm.ReadLine());
//向伺服器發送STAT命令,從而取得郵箱的相關資訊:郵件數量和大小 Data = "STAT"+CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()); NetStrm.Write(szData,0,szData.Length); Status.Items.Add(RdStrm.ReadLine());
//改變按鈕的狀態 Connect.Enabled = false; Disconnect.Enabled = true; Retrieve.Enabled = true;
//將游標置回原來的狀態 Cursor.Current = cr;
} catch(InvalidOperationException err) { Status.Items.Add("Error: "+err.ToString()); } } |
而Disconnect按鈕的訊息響應函數則通過向伺服器發送QUIT命令來終止和郵件伺服器的串連,實現比較簡單,具體函數如下:
private void Disconnect_Click(object sender, System.EventArgs e) { //將游標置為等待狀態 Cursor cr = Cursor.Current; Cursor.Current = Cursors.WaitCursor;
//向伺服器發送QUIT命令從而結束和POP3伺服器的會話 Data = "QUIT"+CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()); NetStrm.Write(szData,0,szData.Length); Status.Items.Add(RdStrm.ReadLine());
//中斷連線 NetStrm.Close(); RdStrm.Close();
//改變按鈕的狀態 Connect.Enabled = true; Disconnect.Enabled = false; Retrieve.Enabled = false;
//將游標置回原來的狀態 Cursor.Current = cr; } |
最後,Retrieve按鈕的訊息響應函數則根據使用者在郵件編號文字框中的輸入來取得相應的郵件,它向伺服器發送的命令為RETR,並根據返回的資訊判斷郵件的有無。若返回資訊的第一個字元為"+",則表示+OK,也即成功;若為"-",則表示-ERR,也即為失敗。在成功的情況下,若使用者選擇了"在郵件伺服器上保留備份",則收取郵件後不刪除伺服器上的備份,否則用DELE命令來進行相應的刪除。函數實現如下:
private void Retrieve_Click(object sender, System.EventArgs e) { //將游標置為等待狀態 Cursor cr = Cursor.Current; Cursor.Current = Cursors.WaitCursor; string szTemp; Message.Clear();
try { //根據郵件編號從伺服器獲得相應郵件 Data = "RETR "+ MailNum.Text+CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()); NetStrm.Write(szData,0,szData.Length); szTemp = RdStrm.ReadLine();
if(szTemp[0]!=-) { //不斷地讀取郵件內容,只到結束標誌:英文句號 while(szTemp!=".") { Message.Text += szTemp; szTemp = RdStrm.ReadLine(); }
//若BackupChBox未選中,則收取郵件後,刪除保留在伺服器上的郵件 if(BackupChBox.Checked == false) { Data = "DELE" + MailNum.Text + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(Data.ToCharArray()); NetStrm.Write(szData,0,szData.Length); Status.Items.Add(RdStrm.ReadLine()); } } else { Status.Items.Add(szTemp); }
//將游標置回原來的狀態 Cursor.Current = cr; }
catch(InvalidOperationException err) { Status.Items.Add("Error: "+err.ToString()); } } |
最後一步便是儲存你的勞動成果,再進行編譯、建立並運行了,最終的圖示我已經在文章的開頭處給出了,還行吧。
到處為止,我們已經完成了POP3郵件接收程式的全部工作了。從中,我們不難發現運用C#完成一些網路實用編程是非常容易的。只要我們掌握了其中的原理,具體的編程工作就變得非常的輕鬆而且有條理。即使以前你對POP3郵件接收的實現一無所知,我想在看完這篇文章後,你對它至少會有了個大概的瞭解。不過,還要指出的是這隻是一個很簡單的執行個體,如果要在實際中應用,則還需大大的改進,有興趣的讀者不妨一試。,
文章整理:西部數位--專業提供網域名稱註冊、虛擬機器主機服務
C#_收郵件