程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#基礎知識 >> 用Visual C#完成POP3郵件接收程序

用Visual C#完成POP3郵件接收程序

編輯: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控件。

  第三步:代碼編寫。首先因為程序中運用到網絡編程的一些重要的類,如: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 = " ";


  最後,便是三個按鈕的消息響應函數,這三個函數是程序的主體部分。其中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郵件接收的實現一無所知,我想在看完這篇文章後,你對它至少會有了個大概的了解。不過,還要指出的是這只是一個很簡單的實例,如果要在實際中應用,則還需大大的改進,有興趣的讀者不妨一試。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved