首页 > 编程 > .NET > 正文

.NET下的POP3编程

2024-07-10 13:00:18
字体:
来源:转载
供稿:网友
  • 本文来源于网页设计爱好者web开发社区http://www.html.org.cn收集整理,欢迎访问。
  • 前一段时间在论坛上看见有人问如何使用.net进行pop3编程,其实pop3的使用很简单,所以.net没有向smtp那样给出相应的类来控制.

    废话少说,程序员最需要的使代码,:)!

    1.打开vs.net 2003.

    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




    <c#网络应用编程>



    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表