zoukankan      html  css  js  c++  java
  • C# Po3协议读取邮件内容遇到的问题

    背景:最近在做一个小工具,读取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);
    }
  • 相关阅读:
    Web自动化测试之滑动验证码的解决方案
    设计模式之单例
    设计模式之原型
    设计模式之建造者
    DG环境RMAN删除归档报错RMAN-08137: archived log not deleted【转载】
    RFS[3]: No standby redo logfiles available for thread 1
    spring-boot之webflux简单入门
    spring-boot-security组件总结补充
    spring-boot启用security组件 · 下
    spring-boot启用security组件 · 中
  • 原文地址:https://www.cnblogs.com/francis-gao/p/5162913.html
Copyright © 2011-2022 走看看