/** jmail 收取"未读邮件" **/
//测试邮箱地址为 recieveceshi@163.com
/* pop.DownloadUnreadMessages()是用来“收取未读邮件”(未被客户端下载过的邮件),
* 但这个方法现在被支持的不好。以下是这次实现读取"未读邮件"的思路:第一次收取邮
* 件,将邮件在服务器端的唯一标识(以下简称UID,保存为字符串)记录到本地数据库
* 中当再收取邮件,判断本地UID中是否已经存在要下载邮件的UID(判断邮件是否下载过),
* 已经下载过(本地UID已存),跳过;否则下载邮件,并保存此邮件的UID到本地数据库,
* 以此模拟读取"未读邮件"。
* 因为获取服务器端UID可以通过pop.GetMessageUID(i)《不用下载整封邮件》实现,相较
* 用时间来判断邮件是否未读要更好些的样子。*/
//创建jmail接收邮件类的实例
POP3 pop = new POP3();
try
{
//创建连接
//参数依次为:邮件名,密码,服务器地址
pop.Connect("recieveceshi", "qwerty", "pop.163.com");
//服务器端邮件总数量
int emailCount = pop.Count;
//真实要下载到本地的邮件数量(除去"已读邮件")
int readRecieveNum = 0;
//停止读取邮件的索引,初始值为从服务器端读到的信件数量
int breakNum = pop.Count;
//检测邮件哪些是"未读"的,并记录breakNum索引
for (int i = emailCount; i >= 1; i--)
{
/* 从服务器端信息最后一条开始检测,因为jmail收取的邮件信息是按时间由小到
* 大排序的(索引越小,收信的时间越早),所以倒序循环处理更合理,更有助于
* 减少循环次数。下面的for循环采用倒序循环的理由也是一样。*/
//获取指定邮件服务器端邮件UID。要注意的是,最小索引应该是1而不是0
string theUid = pop.GetMessageUID(i);
/* getLocalUID(string UID)为自己要定义的方法,用于检测指定邮件的唯一标
* 识(UID)在本地数据库中是否存在。
* 若存在,则返回false;反之(本地没有记录过)则返回 true*/
bool isUnread = getLocalUID(theUid);
if (isUnread)
{
/*指定邮件为"未读邮件",将停止读取邮件的索引减小,
以便在下面的for循环中使用。*/
breakNum--;
}
}
for (int i = emailCount; i >= 1; i--)
{
/*
* 倒序循环在上面已经说过,不再说了。
*/
if (i == breakNum)
{
//到此,"未读邮件"已经读取完毕了。
break;
}
//下载pop3获取的信息中索引为i的邮件。
/*pop.Messages[i]和pop.DownloadSingleMessage(i)基本是等效的,都是下载
包括附件在内的整封邮件*/
jmail.Message emailMessage = pop.DownloadSingleMessage(i);
//服务器端收信时间,下载整封邮件后获得,所以不用它来判断邮件是否已读
DateTime recieveTime = emailMessage.Date;
//收件人
string recieveMan = emailMessage.RecipientsString.Trim();
//发件人email地址
string fromMan = emailMessage.From;
//发件人昵称
string fromManName = emailMessage.FromName;
//邮件主题
string subject = emailMessage.Subject;
// 邮件主体内容, HTML格式:emailMessage.HTMLBody
string body = emailMessage.Body;
//邮件的附件处理
//每封邮件的所有附件
jmail.Attachments attachments = emailMessage.Attachments;
/* jmail.Attachments 索引正常,从0开始就好 */
for (int j = 0; j < attachments.Count; j++)
{
//根据索引取附件
jmail.Attachment attachment = attachments[j];
//附件名
string fileName = attachment.Name;
//附件保存在指定路径,不要有同名文件,否则出异常
attachment.SaveToFile(@"C:\" + fileName);
}
/* *****************************************************
* 读取完成就根据索引删除邮件:pop.DeleteSingleMessage(i)
* *****************************************************/
/* 如果要能读完这个邮件就马上用这个方法删除,那就省事多了,也就是不用
* 第一个for循环了,也不用把邮件的UID存在本地了并进行"检测"了。*/
/**** 先下载邮件,之后有必要时再,删除服务器端邮件****/
/*
*/
/* insertUIDIntoLocal(string UID)为自己定义的方法,把邮件唯一标识(UID)
* 保存到本地数据库中,应与getLocalUID(string UID)操作同一数据表(源)。
* 注意保证数据保存成功*/
insertUIDIntoLocal(pop.GetMessageUID(i));
//记录真实下载了的邮件
readRecieveNum++;
/* 写一个方法,把获取邮件的相关信息保存到数据库就就完成了 */
}
//断开连接
pop.Disconnect();
MessageBox.Show("海上升明月,天涯共此时。");
}
catch
{
MessageBox.Show("片云天共远,永夜月同孤。");
}
/**完成时间 2014-8-27**/