运用C#实现POP3邮件接收程序(2)

Author: 王凯明  From:Internet


具体的过程步骤如下:
 
  第一步:打开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邮件接收的实现一无所知,我想在看完这篇文章后,你对它至少会有了个大概的了解。不过,还要指出的是这只是一个很简单的实例,如果要在实际中应用,则还需大大的改进,有兴趣的读者不妨一试。
 
  MailReceiver.rar  (2005-6-15:10:42)

 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 您可能对 [C#] 的这些文章也感兴趣:

C#特性聚焦:动态类型化对象、Duck类型和多重分配
C#进阶(七)
VsiaulC#如何读取注册信息
使用C#开发一个简单的P2P应用
访问Amazon S3的C#类库已发布于CodePlex
编写自己的PING工具
C# 获取当前进程HASH的方法
.NET的事务控制.
Images到xps,pdf的转换
用VisualC#实现文件下载功能(1)