zoukankan      html  css  js  c++  java
  • C#编写实现POP3的程序

    1.打开VS
      2.新建一个WinForm Application.

      3.添加命名空间

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.IO;

      4.主要代码

      为了防止界面在连接服务器时死锁,我另开了一个线程

    private void button1_Click(object sender, System.EventArgs e)
    {
     Thread myThread=new Thread(new ThreadStart(TreadGet));
     myThread.Start();
    }

    private void TreadGet()
    {
     ConnectToServer();
     LogonServer();
     GetEmailList();
    }

    //连接服务器
    private void ConnectToServer()
    {
     this.myClient=new TcpClient();
     try
     {
      this.myClient.Connect(this.serverNameTextBox.Text,110);
      this.messageListBox.Items.Add("连接服务器成功");
      //初始化网络流,数据就是通过这个对象读出来的
      ns=this.myClient.GetStream();
      sr=new StreamReader(ns);
      sw=new StreamWriter(ns);
     }
     catch(Exception ex)
     {
      this.messageListBox.Items.Add(ex.Message);
     }
    }
    //验证用户名,密码
    private void LogonServer()
    {
     result=sr.ReadLine();
     this.messageListBox.Items.Add(result);
     sw.WriteLine("USER "+this.nameTextBox.Text);
     sw.Flush();

     result=sr.ReadLine();
     if(result.Substring(0,3)=="-ER")
     {
      this.messageListBox.Items.Add("没有这个用户名");
      return;
     }

     sw.WriteLine("PASS "+this.passTextBox.Text);
     sw.Flush();

     try
     {
      result=sr.ReadLine();
     }
     catch(IOException ioex)
     {
      this.messageListBox.Items.Add(ioex.Message);
      return;
     }

     if(result.Substring(0,4)=="-ERR")
     {
      this.messageListBox.Items.Add("无法登录,可能使用户名密码错误!");
      return;
     }

     this.messageListBox.Items.Add("登录成功");
     
    }

    //获取邮件列表
    private void GetEmailList()
    {
     string from=null;
     string subject=null;
     sw.WriteLine("stat");
     sw.Flush();

     result=sr.ReadLine();
     // MessageBox.Show(result);
     string[] nummessage=result.Split(' ');
     int totalnum=Convert.ToInt32(nummessage[1]);
     if(totalnum>0)
      this.messageListBox.Items.Add("你有"+totalnum.ToString()+"邮件");
     else
      this.messageListBox.Items.Add("邮箱里没有邮件");

     for(int i=1;i<=totalnum;i++)
     {
      sw.WriteLine("top "+i.ToString()+" 0");
      sw.Flush();
      result=sr.ReadLine();

      while(true)
      {
       result=sr.ReadLine();
       if(result==".")
        break;
       if(result.Length>4)
       {
        if(result.Substring(0,5)=="From:")
         from=result ;
        if(result.Substring(0,8)=="Subject:")
         subject=result ;

       }
      }
      this.listBox1 .Items.Add(i.ToString()+" "+from+ " "+ subject);
     }
    }

    private void button2_Click(object sender, System.EventArgs e)
    {
     this.listBox1.Items.Clear();
    }

      参考资料

      网络邮件收取使用的是Pop3协议,了解Pop3协议有助于我们加深对邮件系统的理解。而且使用Pop3协议你还可以直接telnet 到邮件服务器上去收信。

      一般telnet Pop3 Server 110后就可以用这些命令了,大小写不敏感, 不包括口令本身,注意不要让口令回显,等验证通过后再允许回显好了。

      user username 用户认可

      pass password 认可 执行成功则状态转换

      apop name,digest 认可一种安全传输口令的办法,执行成功导致状态转换,请参见RFC 1321 。

      stat 处理请求server回送邮箱统计资料,如邮件数、 邮件总字节数

      uidl n 处理 server返回用于该指定邮件的唯一标识, 如果没有指定,返回所有的。

      list n 处理 server返回指定邮件的大小等

      retr n 处理 server返回邮件的全部文本

      dele n 处理 server标记删除,quit命令执行时才真正删除

      rset 处理撤消所有的dele命令

      top n,m 处理 返回n号邮件的前m行内容,m必须是自然数

      noop 处理 server返回一个肯定的响应

      quit client 希望结束会话。如果server处于"处理" 状态,则现在进入"更新"状态,删除那些标记成删除的邮件。如果server处于"认可"状态, 则结束会话时server不进入"更新"状态 。

      使用telnet 的一个完整的收信例子如下:

      telnet pop3Server 110
      user username
      pass ****
      stat
      list
      retr 1
      retr 2
      ...
      dele 1
      dele 2
      ...
      quit
  • 相关阅读:
    WPF中Datagrid其中一列使用图片显示
    已加载dcrf32.dll,但没有找到DllRegisterServer输入点。无法注册这个文件
    WPF——实现超链接功能
    AJAX overrideMimeType作用
    解决 remote: The project you were looking for could not be found.
    子div有内容,父div高度为0的解决方法
    《快速构建Windows 8风格应用》系列文章汇总
    全新的Windows Phone 8开发资源汇总
    Windows 8.1:Windows 8续集演绎[翻译]
    A星寻路算法
  • 原文地址:https://www.cnblogs.com/zjx/p/1247071.html
Copyright © 2011-2022 走看看