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
{ }
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
{ }
/// 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,后面并没有跟着此邮件的内容?请高手帮帮忙看看
/// <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;
}