背景:最近在做一个小工具,读取PO3协议邮件服务器的指定人员的邮件,东西做出来了,弄了一个While死循环,20秒执行一次,
结果运行了3天,周一来IT人员找上门来了,你的电脑什么情况,怎么一个小时下载流量达到1个G多,而且都是PO3协议的,哈哈,哈哈
心理很想呵呵,但是还得如实跟他解释了一下情况,然后立刻把程序停止了。
接下来我就是找问题啦,最后找到了原因是因为我每次都是循环读取邮箱中的180条邮件,这180条中还有好多有几十兆附件的,哈哈
解决办法和问题原因:
问题就出现这循环读取以及读取过的内容里面,因为PO3协议不支持读取未读的邮件,或是说标记邮件为已读的。所以我当时只能从所有邮件中不断重复循环读取,
直到有新的需要的邮件进来,处理一下,继续循环。后来我找到了一个办法,POP3协议有一个UID的东西,每个邮件都是唯一的,每次都获取到邮箱所有邮件的UID,
然后保存到本地,下次用本地的和这个对比,有新的UID进来,只针对这个新的UID进行邮件读取,这样所有事就都解决了,流量也很小很小了。
我这里使用的是MailKit.dll,
开源的项目,在项目中用nuget一下DLL下载下来,nuget命令去官网看吧。
粘贴出来主要代码:
IList<string> msgUids = client.GetMessageUids(); IList<string> notReadUids = new List<string>(); foreach (var item in msgUids) { if (!alreadySentMsgId.Contains(item)) { notReadUids.Add(item); sw.WriteLine(item); //记录没有读取过的邮件的UID } } if (notReadUids.Count != 0) //如果有未读过的邮件才进行读取及解析 { IList<MimeMessage> notReadMessages = client.GetMessages(notReadUids); }
时间: 2024-11-05 21:39:09