这要找邮箱之类的服务器控件了吧就跟AJAX在线聊天差不多吧,期待有高手编写出来

解决方案 »

  1.   

    想请教可否用POP3解决此问题?
      

  2.   

    有兄弟用POP3解决过类似问题吗?
      

  3.   

    什么意思?
    你想写个程序,然后在程序中输入email和密码,点击,显示该邮箱内未读的邮件数?这个样子?
      

  4.   

    需要用到socket类和pop3协议,具体的查一下资料吧。
      

  5.   

    .net framework本身并未提供对pop3的支持,你可以搜索一下pop3client,它提供了基本的pop3的支持
      

  6.   

    使用Freepops可以完成该功能,因为其是完全通过访问网页实现邮件收发的,不过该软件需要针对不同的客户端编写插件,比较麻烦!
      

  7.   

    之前一直在用pop3
    我也没有办法取得没读的邮件,不懂楼主找到方法了吗?找到的话和我说下!谢谢!
      

  8.   

    Jmail有个Method,GetMessageUID(i), 是取得邮件唯一标识的. 
    收到邮件后,将这个标识保存到本地, 下次收邮件时, 先取邮件标识, 
    判断本地没有该邮件后再收取即可.
      

  9.   

    另一种方法c#通过IMAP协议获取未读邮件数量
    http://www.cnblogs.com/huazai/archive/2008/09/22/1296188.html
      

  10.   

    using System.Net;
    using System.Net.Sockets;
    using System.Net.Security;
    using System.IO;
    using System.Text.RegularExpressions;
    using System.Security.Cryptography.X509Certificates; 申明对象:
     public TcpClient tc;
            public NetworkStream ns;
            public StreamReader sr;
            public SslStream ss;
            public static int count;
            public int port=110;
            public string server;   //与服务器建立连接
            public TcpClient GetClient()
            {
                try 
                {
                    string user = Txtuser.Text;
                    server = "pop." + user.Substring(user.IndexOf('@') + 1);
                    if (user.IndexOf("@gpres") != -1 || user.IndexOf("@gmail") != -1)
                    {
                        port = 995;
                        server = "pop.gmail.com";                }
                    else
                    {
                        port = 110;
                    }
                    tc = new TcpClient(server, port);
                    return tc;
                }
                catch(Exception ex)
                {
                    return null;
                }
            }        //断开与服务器的连接(110端口)
            private void Disconnect110()
            {
                //"quit"  即表示断开连接
                string input = "quit" + "\r\n";
                Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
                ns.Write(outbytes, 0, outbytes.Length);
                //关闭数据流
                ns.Close();
            }        //断开与服务器的连接(995端口)
            private void Disconnect995()
            {
                //"quit"  即表示断开连接
                string input = "quit" + "\r\n";
                Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
                ss.Write(outbytes, 0, outbytes.Length);
                //关闭数据流
                ns.Close();
            }     //关闭连接
            private void Disconnect()
            {
                if(port==110)
                {
                    this.Disconnect110();
                }
                else
                {
                    this.Disconnect995();
                }
            }  //110端口登陆
            public bool Login110()
            {
                try 
                {
                    string user = Txtuser.Text;//用户名
                    string pwd = Txtpwd.Text;//密码
                    TcpClient tcp = this.GetClient();
                    ns = tcp.GetStream();//获得连接对象
                    sr = new StreamReader(ns);
                    sr.ReadLine();
                    Byte[] outbytes;
                    string input;
                    string readuser = string.Empty;
                    string readpwd = string.Empty;
                    string readsize = string.Empty;
                    input = "user " + user + "\r\n";
                    outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
                    ns.Write(outbytes, 0, outbytes.Length);
                    readuser = sr.ReadLine();
                    input = "pass " + pwd + "\r\n";
                    outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
                    ns.Write(outbytes, 0, outbytes.Length);
                    readpwd = sr.ReadLine();
                    //登陆
                    if (readpwd.IndexOf("-ERR") != -1)
                    {
                        return false;
                    }
                    else
                    {
                        return true;
                    }
                }
                catch(Exception ex)
                {
                    return false;
                }
                
            }
      

  11.   

    接上面
            //995端口登陆(ssl验证)
            public bool Login995()
            {
                string user = Txtuser.Text;//用户名
                string pwd = Txtpwd.Text;//密码            TcpClient tcp = this.GetClient();
                RemoteCertificateValidationCallback callback = new RemoteCertificateValidationCallback(OnCertificateValidation);
                tcp.ReceiveBufferSize = 1024;
                tcp.SendBufferSize = 1024;
                ss = new SslStream(tcp.GetStream(), false, callback);
                ss.AuthenticateAsClient(server);
                if (ss.IsAuthenticated == true)
                {
                    sr = new StreamReader(ss);
                    sr.ReadLine();
                    Byte[] outbytes;
                    string input;
                    string readuser = string.Empty;
                    string readpwd = string.Empty;
                    input = "user " + user + "\r\n";
                    outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
                    ss.Write(outbytes, 0, outbytes.Length);
                    readuser = sr.ReadLine();
                    input = "pass " + pwd + "\r\n";
                    outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
                    ss.Write(outbytes, 0, outbytes.Length);
                    readpwd = sr.ReadLine();
                    //登陆
                    if (readpwd.IndexOf("-ERR") != -1)
                    {
                        return false;
                    }
                    else
                    {
                        return true;
                    }
                }
                else
                {
                    return false;
                }
     
            }        //登陆服务器
            public bool GetLogin()
            {
                    if (port ==110)
                    {
                      return  this.Login110();
                    }
                    else
                    {
                        return this.Login995();
                    }
            }        //获得邮件的数目(110端口)
            public int GetMialCount110()
            {
                Byte[] outbytes;
                string input;
                int MialCount=0;
                input = "stat" + "\r\n";
                outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
                ns.Write(outbytes, 0, outbytes.Length);
                string readsize = sr.ReadLine();            if (readsize.Substring(0, 4) != "-ERR")
                {
                    string[] Array = readsize.Split(' ');
                    MialCount = int.Parse(Array[1]);            }
                else
                {
                    MialCount=0;
                }            return MialCount;
            }        //获得邮件的数目(995端口)
            public int GetMialCount995()
            {
                Byte[] outbytes;
                string input;
                int MialCount = 0;
                input = "stat" + "\r\n";
                outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
                ss.Write(outbytes, 0, outbytes.Length);
                string readsize = sr.ReadLine();            if (readsize.Substring(0, 4) != "-ERR")
                {
                    string[] Array = readsize.Split(' ');
                    MialCount = int.Parse(Array[1]);            }
                else
                {
                    MialCount = 0;
                }            return MialCount;
            }        public int GetMialCount()
            {
                int count;
                if(port==110)
                {
                   count= this.GetMialCount110();
                }
                else
                {
                    count = this.GetMialCount995();
                }            return count;
            }
    登陆调用的方法:
          protected void BtnSubmit_Click(object sender, EventArgs e)
            {
                if (this.GetClient() != null)
                {
                    if(this.GetLogin()==true)
                    {
                        int count = this.GetMialCount();
                         Response.Write("您有:"+count +"封未读邮件");
                      /*  if (count > 0)
                        {                        this.GetNewMail();
                        }
                        else
                        {
                            Response.Write("收件箱有:0个邮件");
                        }*/
                       // Response.Write("登陆成功!");
                    }
                    else
                    {
                        Response.Write("用户名或者密码错误");
                    }
                }
                else
                {
                    Response.Write("连接失败");
                }        }
      

  12.   

    不好意思还有这个方法
      private static bool OnCertificateValidation(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
            {
                if (sslPolicyErrors == SslPolicyErrors.None)
                {
                    return true;
                }
                return false;
            }    //断开与服务器的连接(110端口)
            private void Disconnect110()
            {
                //"quit"  即表示断开连接
                string input = "quit" + "\r\n";
                Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
                ns.Write(outbytes, 0, outbytes.Length);
                //关闭数据流
                ns.Close();
            }        //断开与服务器的连接(995端口)
            private void Disconnect995()
            {
                //"quit"  即表示断开连接
                string input = "quit" + "\r\n";
                Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(input.ToCharArray());
                ss.Write(outbytes, 0, outbytes.Length);
                //关闭数据流
                ns.Close();
            }
      

  13.   

    readsize.Substring(0, 4) != "-ERR"楼上的为什么这么写,这是在判断什么
      

  14.   

    POP3根本就没有这样的功能。对于POP3来说,邮件不分已读未读,你只能下载邮件。就好像HTTP一样,不能判断某某文章你是否读过,读过就不下载。你要有已读未读的区分,必须用IMAP,但国内大多数邮箱都不支持IMAP,你就只能通过HTTP爬虫去抓取分析了。
      

  15.   

     imap我也试过,可是它返回的是邮箱的邮件总数,可是未读邮件还在研究
      

  16.   

    大家,如果用web网页形式抓取的话是可以区分的,每个邮件都有一个唯一的messageId,可以把这个保存到数据库中,然后下次抓取的时候可以比较,然后从数据库中取邮件显示出来。
    但是抓取我有一个搞不掂的难题就是怎么样才不会重复抓取全部,也就是说怎么设置在上次抓取的时间之后去抓取