用Visual C#实现POP3邮件接收程序

2016-02-19 16:58 41 1 收藏

下面图老师小编要跟大家分享用Visual C#实现POP3邮件接收程序,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!

【 tulaoshi.com - 编程语言 】

  本文通过运用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框架流机制,它支持对网络数据流的同步和异步访问,是实现网络通讯的重要组成部分。在这里我先给出程序最终的运行效果,图示如下:

  图1

  具体的过程步骤如下:

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

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

  在设置完图1的各个控件属性后,对主窗体进行合理的布局,则可得到最终的界面示意图如下所示:

  图2

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  第三步:代码编写。首先因为程序中运用到网络编程的一些重要的类,如: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 = "rn";

  最后,便是三个按钮的消息响应函数,这三个函数是程序的主体部分。其中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());}}

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

本文示例代码或素材下载

  而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邮件接收的实现一无所知,我想在看完这篇文章后,你对它至少会有了个大概的了解。不过,还要指出的是这只是一个很简单的实例,如果要在实际中应用,则还需大大的改进,有兴趣的读者不妨一试。

本文示例代码或素材下载

来源:https://www.tulaoshi.com/n/20160219/1613731.html

延伸阅读
一.概述: 本文通过一个实例向大家介绍用Visual C#进行Internet通讯编程的一些基本知识。我们知道.Net类包含了请求/响应层、应用协议层、传输层等层次。在本程序中,我们运用了位于请求/响应层的WebRequest类以及WebClient类等来实现高抽象程度的Internet通讯服务。本程序的功能是完成网络文件的下载。 二.实现原理: 程...
Visual C#是微软公司推出的下一代程序开发语言。他不仅具有Visual C++功能强大的特点,又具有Visual Basic的简洁,易上手的特点。所以一经推出,就收到了广大程序开发人员的欢迎。Visual C#和Visual C++的一个明显的区别在于,Visual C#本身是没有类库的,而Visual C++却是自身就带有类库。Visual C#虽然没有类库,但作为.Net框架中的一个...
本文向大家介绍Windows Sockets的一些关于用C#实现的原始套接字(Raw Socket)的编程,以及在此基础上实现的网络封包监视技术。同Winsock1相比,Winsock2最明显的就是支持了Raw Socket套接字类型,使用Raw Socket,可把网卡设置成混杂模式,在这种模式下,我们可以收到网络上的IP包,当然包括目的不是本机的IP包,通过原始套接字,我们也可以...
木马的介绍 因为本文是探讨木马程序,所以在介绍之前有一些木马构成的基本知识事先说明。一个完整的木马系统由硬件部分,软件部分和具体连接部分组成。这里主要对软件部分介绍,它主要有控制端程序、木马程序(后台服务程序)、木马配制程序组成。控制端用以远程控制服务端的程序;木马程序是潜入服务端内部,获取其操作权限的程序;...
标签: 电脑入门
一直以来,QQ邮箱的所有用户都可免费享受POP3和SMTP服务。有使用邮件客户端习惯的网友,或者当您在受到网络限制不能登录WEB的情况下,同样可以通过POP3/SMTP功能来使用QQ邮箱。 有些网友可能还对QQ邮箱的POP3/SMTP相关设置不熟悉,今天我们就一起来了解一下。 用POP3/SMTP服务收发QQ邮件 请进入邮箱“设置”,在“帐...

经验教程

691

收藏

95
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部