using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Collections ;
using System.IO;namespace MailSender
{
    //封装Mail帐号信息//
    public class MailAccount
    {
        private string SERVER;
        private string USER;
        private string PASS;
        private string PORT;        public string User
        {
            get
            {
                return USER;
            }
            set
            {
                USER = value;
            }
        }        public string Password
        {
            get
            {
                return PASS;
            }
            set
            {
                PASS = value;
            }
        }        public string Port
        {
            get
            {
                return PORT;
            }
            set
            {
                PORT = value;
            }
        }
        public string Server
        {
            get
            {
                return SERVER;
            }
            set
            {
                SERVER = value;
            }
        }
        
    }
    //封装Mail信息//
    public class MailMessage
    {
        private string from;
        private string to;
        private string cc;
        private string bcc;
        private string subject;
        private string body;
        
        public string From
        {
            get 
            {
                return from;
            }
            set
            {
                from=value;
            }
        }
         public string To
        {
            get 
            {
                return to;
            }
            set
            {
                to=value;
            }
        }
         public string Cc
        {
            get 
            {
                return cc;
            }
            set
            {
                cc=value;
            }
        }
         public string Bcc
        {
            get 
            {
                return bcc;
            }
            set
            {
                bcc=value;
            }
        }
         public string Subject
        {
            get 
            {
                return subject;
            }
            set
            {
                subject=value;
            }
        }
         public string Body
        {
            get 
            {
                return body;
            }
            set
            {
                body=value;
            }
        }
    }
    //枚举Pop3会话3个连接状态//
    public enum Pop3STATE
    {
        AUTHORIZATION,//连接确认成功
        TRANSACTION,  //登陆成功,操作邮件状态
        UPDATE        //执行QUIT时进入的状态
    }
    //定义连接关闭接口//
    public interface IConnection
    {
        bool Connect(MailAccount mail, ref string msg);
        bool Close(ref string msg);
    }
    //定义通信操作接口//
    public interface ICommunicater
    {
        string ReceiveResponse(StreamReader stream);
        void SendCommand(string command,NetworkStream stream);
    }
    //定义pop3操作接口//
    public interface IPop3Operation:IConnection
    {
        
        bool Login(ref string msg);
        int GetMailNumber(ref string msg);
        Hashtable ListMails(ref string msg);
        MailMessage GetMail(int i,ref string msg);
        bool DelMail(int i, ref string msg);
        void Rset(ref string msg);
        void Noop(ref string msg);
    }
    //定义smtp操作接口//
    public interface ISmtpOperation : IConnection
    {    }
    

解决方案 »

  1.   

    /// <summary>
        /// Pop3功能实现,利用类封装
        /// </summary>
        public class Pop3Client:Communicater,IPop3Operation 
        {
          private TcpClient client;
          private NetworkStream NTstream;
          private StreamReader stream;
          private Pop3STATE state;              //当前连接状态
          private MailAccount account;          //用来保存当前用户帐户信息        /// <summary>
            /// 连接邮箱
            /// </summary>
          public bool Connect(MailAccount ma, ref string msg)
          {
              account=ma;
              try
              {
                  client = new TcpClient(account.Server, Convert.ToInt32(account.Port));
                  NTstream = client.GetStream();
                  stream = new StreamReader(client.GetStream());
              }
              catch (Exception e)
              {
                  throw new Exception(e.ToString());
              }
              string response = ReceiveResponse(stream);
       
               if (response.IndexOf("+OK")>=0)//成功建立连接
               {
                   state=Pop3STATE.AUTHORIZATION;
                   return true;
                  
                }
            msg=ReceiveResponse (stream);        stream.Close();
            client.Close();
            return false;           
                
          }
            /// <summary>
            /// 退出邮箱
            /// </summary>
          public bool Close(ref string msg)
          {
              if(state!=Pop3STATE .UPDATE)
              {
                  SendCommand("QUIT",NTstream);
                  msg=ReceiveResponse(stream);
                  stream.Close();
                  client.Close();
                  state=Pop3STATE.UPDATE;
                  return true;
              }
              msg = state.ToString();
              return false;
          }
          /// <summary>
          /// 登陆邮箱服务器
          /// </summary>
          public bool Login(ref string msg)
          {
            //验证用户名
            SendCommand("USER " + account.User,NTstream);
            msg = ReceiveResponse(stream);
            if (msg.IndexOf("+OK") >= 0)
            {
              //验证密码
              SendCommand("PASS " + account.Password,NTstream);
              msg = ReceiveResponse(stream);
              if (msg.IndexOf("+OK") >= 0)
              {
                //验证成功,进入TRANSACTION状态
                state=Pop3STATE .TRANSACTION;
                return true;
              }
            }                    
            return false;      }
            /// <summary>
            /// 获取邮件数目
            /// </summary>
          public int GetMailNumber(ref string msg)
          {
              int mailnum;
              if (state != Pop3STATE.TRANSACTION)
              {
                  msg = "Please connect first!";
                  return -1;
                  
              }
              SendCommand("STAT",NTstream);
              string response=ReceiveResponse(stream);
              if(response.IndexOf("+OK")>=0)
              {
                response=response.Substring(3,response.Length-3).TrimStart();
                string[] strs=response.Split(' ');
                mailnum=Convert.ToInt32(strs[0]);
                return mailnum;
              }
              return -1;      }
            /// <summary>
            /// 获取全部邮件序列号和大小
            /// </summary>
          public Hashtable ListMails(ref string msg)
          {
              Hashtable list = new Hashtable();
              string response;
              if (state == Pop3STATE.TRANSACTION)
              {
                  //在登陆状态下才可获取邮件列表
                  SendCommand("LIST", NTstream);
                  response = ReceiveResponse(stream);
                               if (response.IndexOf("+OK") >= 0)
                  {
                      //获取成功
                      response = response.Substring(5, response.Length - 5);                  StringReader sr = new StringReader(response);
                      while (sr.Peek() > 0)
                      {
                          string[] d = sr.ReadLine().Split(' ');
                          list.Add(d[0], d[1]);
                      }
                      
                      
                  }
              }
              return list;
          }
            /// <summary>
            /// 获取一个邮件信息
            /// </summary>
          public MailMessage GetMail(int i,ref string msg)
          {
              string response="-ERR";
              MailMessage amail=new MailMessage ();
              if (state == Pop3STATE.TRANSACTION)
              {
                  SendCommand("RETR " + i.ToString(),NTstream);
                  response = ReceiveResponse(stream);
                  if (response.IndexOf("+OK") >= 0)
                  {
                      StringReader sr = new StringReader(response);
                      sr.ReadLine();
                      string tmp = sr.ReadToEnd();
                      response = "+OK";
                      //解析邮件
                      amail.Body = tmp;
                  }          }
              msg = response;
              return amail;
          }
            /// <summary>
            /// 删除一个邮件
            /// </summary>
          public bool DelMail(int i,ref string msg)
          {
              if (state == Pop3STATE.TRANSACTION)
              {
                  SendCommand("DELE " + i.ToString(), NTstream);
                  msg = ReceiveResponse(stream);
                 
                  if(msg.IndexOf("+OK")>=0)
                      return true;
              }
              msg = "-ERR,Please Connect First!";
              return false;
          }
            /// <summary>
            /// 执行一个空操作
            /// </summary>
          public void Noop(ref string msg)
          {
              if (state == Pop3STATE.TRANSACTION)
              {
                  SendCommand("NOOP", NTstream);
                  msg = ReceiveResponse(stream);
                  return;
              }
              msg="-ERR,Please Connect First";
              
          }
            /// <summary>
            /// 用于取消正在进行的操作
            /// </summary>
          public void Rset(ref string msg)
          {
              if (state == Pop3STATE.TRANSACTION)
              {
                  SendCommand("RSET",NTstream);
                  msg = ReceiveResponse(stream);
                  return;
              }
              msg = "-ERR,Please Connect First";
          }
           
          
          
        }
        /// <summary>
        /// 客户端与邮件服务器的连接通信类
        /// </summary>
        public class Communicater:ICommunicater
        {        
           ///获取返回值
            public string ReceiveResponse(StreamReader stream)
            {
                
                try
                {                string stringbuffer = stream.ReadToEnd();                return stringbuffer;            }
                catch (Exception e)
                {
                    throw new Exception(e.ToString());
                    return e.ToString();
                }
            }
            //发送命令
            public void SendCommand(string command,NetworkStream stream)
            {
                try
                {
                    string stringtosend = command + "\r\n";
                    byte[] arraytosend = Encoding.Default.GetBytes(stringtosend.ToCharArray());
                    stream.Write(arraytosend, 0, arraytosend.Length);
                }
                catch (Exception e)
                {
                    throw new Exception(e.ToString());
                }
            }
            
        }
        /// <summary>
        /// smtp客户端类
        /// </summary>
        public class SmtpClient : Communicater, ISmtpOperation
        {
            //连接
            public bool Connect(MailAccount mail, ref string msg)
            {
                return true;
            }
            //关闭
            public bool Close(ref string msg)
            {
                return true;
            }
        }
    }为什么我正确连接pop3服务器并登陆后,执行ListMails()后,得到的数据只是一部分邮件的信息?偶尔会得到全部邮件的信息,还是执行GetMail()后命令是返回+OK\r\n,后面并没有跟着此邮件的内容?请高手帮帮忙看看
      

  2.   

    刚睡醒,看着有点晕,给你个现成的,你看看,我用的是Email.dll来做的,比较方便,不用自己写这么多东西,邮件总数目获取:
            /// <summary>
            /// 获取服务器上邮件总数
            /// </summary>
            /// <returns></returns>
            public int GetNewMessage()
            {
                POP3 objPOP3 = new POP3(POPServer, user, pwd);
                objPOP3.Connect();
                objPOP3.Login();
                objPOP3.QueryServer();
                int EmailCount = objPOP3.TotalMailCount;
                objPOP3.Close();
                return EmailCount;
            }
      

  3.   

    谢谢,我的目的是想学习以下pop3以及Smtp协议,不过还是感谢你们