技術之路

數字創造未來

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
具体的过程步骤如下:

第一步:打开VS.Net,新建一个工程,在项目类型里选择“Visual C#项目”,在模板里选择“Windows 应用程序”,工程名不妨为“MailReceiver”,最后点击“确定”按钮。

第二步:布置主界面。先往窗体上添加如下控件:六个Label控件、四个TextBox控件、一个RichTextBox控件、一个CheckBox控件、一个ListBox控件以及三个Button控件。各个控件的属性设置如下表所示:

Form1(主窗体)
Text属性
POP3邮件接收程序

MaximizeBox属性
False

Label1
Text属性
POP3 服务器地址:

TextAlign属性
MiddleRight

Label2
Text属性
用户名:

TextAlign属性
MiddleRight

Label3
Text属性
密码:

TextAlign属性
MiddleRight

Label4
Text属性
信息:

TextAlign属性
MiddleLeft

Label5
Text属性
邮件编号:

TextAlign属性
MiddleLeft

Label6
Text属性
状态:

TextAlign属性
MiddleLeft

PopServer、Username、Password、MailNum(TextBox控件)
Text属性
(均为空)

Password的PasswordChar属性
*

Message(RichTextBox控件)
Text属性
(为空)

BackupChBox(CheckBox控件)
Text属性
在邮件服务器上保留备份

Status(ListBox控件)
ItemHeight属性
12

Connect(Button控件)
Text属性
连接

FlatStyle属性
Flat

Disconnect (Button控件)
Text属性
断开连接

FlatStyle属性
Flat

Enabled属性
False

Retrieve(Button控件)
Text属性
收取邮件

FlatStyle属性
Flat

Enabled属性
False


其他属性均可为默认值。在设置完以上的各个控件属性后,对主窗体进行合理的布局,则可得到最终的界面示意图如下所示:



第三步:代码编写。首先因为程序中运用到网络编程的一些重要的类,如:TcpClient、NetworkStream,所以在程序的开头处需添加以下名字空间(Namespace):

using System.Net;

using System.Net.Sockets;

using System.IO;

接着,为我们的类添加以下一些公有的数据成员:

public TcpClient Server;

public NetworkStream NetStrm;

public StreamReader RdStrm;

publicstring Data;

publicbyte[] szData;

publicstring CRLF = "\r\n";

最后,便是三个按钮的消息响应函数,这三个函数是程序的主体部分。其中Connect按钮的消息响应函数完成了到POP3服务器的连接工作,并根据用户名和密码进行登录。如果一切顺利,则再向服务器发送STAT命令从而获得邮箱中邮件的相关信息:邮件数量和大小,最终完成连接。其函数实现如下:
privatevoid 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命令来终止和邮件服务器的连接,实现比较简单,具体函数如下:
privatevoid 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命令来进行相应的删除。函数实现如下:privatevoid 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邮件接收的实现一无所知,我想在看完这篇文章后,你对它至少会有了个大概的了解。不过,还要指出的是这只是一个很简单的实例,如果要在实际中应用,则还需大大的改进,有兴趣的读者不妨一试。
posted on 2006-05-27 17:46  nathan  阅读(1184)  评论(6)    收藏  举报