背景介绍:VS2017 | .net core | C# |  .netframwork 4.0

-----------------------------------------------------------------------

这东西本来没打算记的,主要是连接邮件服务器的时候百度搜出来的大多博客不能用,浪费1小时,所以来记一下,主要看的是这个参考博客,我在此基础上做了改动

实现功能如下:

1. 通过授权码连接到邮箱服务器,并获取到某文件夹下的邮件,以上出错添加了能看到是哪块的问题(对使用的邮箱需要你开启STMP服务,设置规则以确保符合的邮件移动到此文件夹下)

2. 不打开邮件,只根据主题进行筛选,同主题邮件取日期最新的那个(通过linq筛选实现)

3. 直接下载邮件中所有的普通附件(大于50M的是超大附件,只有链接,且无法通过代码下载(反正我不行,你行你试试))

4. 下载完成删除同类旧压缩包

因为头担心QQ强制改掉授权码,要求换一个,我选了网易,这两个都支持最大50M的,还有新浪什么的,但没注册就没用

关于授权码:

网易:授权码是你自己设定的,方便记忆 最多16位

QQ:授权码给你分配的,12位,但明确说了可以有很多个不用记,但只要你改QQ密码或什么中心密码,之前的全部失效

但连获取邮箱文件夹内容这里,QQ网易不一样啊,网易真的坑,你愣愣的上来会获不到“故意设置障碍,其实是网易需要我们表明我们登录的客户端身份,具体的原理和命令参照我上一篇文章查看IMAP ID COMMAND命令,下面只具体说说mailkit如何使用到这条命令,其实mailkit是提供这个命令的,足见mailkit的强大”   ---参考这个博客,

一,nuget包,搜MailKit   找到适合你的版本,下载

-----------------------------------------------------------------------

二.  代码内容(QQ的)

            string account = "198416****@qq.com";string passWord = "jsknsh**********";//获得的授权码m_logger.LogInformation("开始到邮箱查询更新包");//准备工作结束ImapClient client = new ImapClient();#region 连接到邮件服务器try{//一、创建获取邮件客户端并连接到邮件服务器。//带端口号和协议的连接方式client.Connect("imap.qq.com", 993, true);}catch (ImapCommandException ex){m_logger.LogInformation($"---------尝试连接时出错:{0}------------" + ex.Message);}catch (ImapProtocolException ex){m_logger.LogInformation($"---------尝试连接时的协议错误:{0}------------" + ex.Message);}catch (Exception ex){m_logger.LogInformation($"---------服务器连接错误:{0}------------" + ex.Message);}try{// 二、验证登录信息,输入账号和密码登录。client.Authenticate(account, passWord);}catch (AuthenticationException ex){m_logger.LogInformation($"---------无效的用户名或密码:{0}------------" + ex.Message);}catch (ImapCommandException ex){m_logger.LogInformation($"---------尝试验证错误:{0}------------" + ex.Message);}catch (ImapProtocolException ex){m_logger.LogInformation($"---------尝试验证时的协议错误:{0}------------" + ex.Message);}catch (Exception ex){m_logger.LogInformation($"---------账户认证错误:{0}------------" + ex.Message);}#endregion//  三、获取邮箱文件夹。这次用到的的收件箱文件夹叫YiBaoRDZ。//获取所有的文件夹//List<IMailFolder> mailFolderList = client.GetFolders(client.PersonalNamespaces[0]).ToList();//只获取收件箱文件夹var folder = client.GetFolder("其他文件夹/YiBaoRDZ");//四、从文件夹获取文件//打开文件夹并设置为读的方式folder.Open(MailKit.FolderAccess.ReadOnly);//获取大于2018-3-26时间的所有邮件的唯一Idvar uidss = folder.Search(SearchQuery.DeliveredAfter(DateTime.Parse("2018-3-26")));//获取邮件头var MailHeaders = folder.Fetch(uidss, MessageSummaryItems.UniqueId | MessageSummaryItems.Full);//同主题邮件取日期最新var NeedMailIds = from a in MailHeadersgroup a by a.NormalizedSubject into grplet maxTime = grp.Max(a => a.Date.DateTime)from row in grpwhere row.Date.DateTime == maxTimeselect row.UniqueId;if (NeedMailIds!=null){//获取邮件信息foreach (var item in NeedMailIds){MimeMessage message = folder.GetMessage(item);//提取该邮件所有普通附件foreach (MimePart attachment in message.Attachments){//下载附件using (var cancel = new System.Threading.CancellationTokenSource()){string filePath = Path.Combine(outDirPath, attachment.FileName);using (var stream = File.Create(filePath)){attachment.ContentObject.DecodeTo(stream, cancel.Token);}}
/从这里开始是我自己写的内容,和本次博客无关//// 散列值是否正确string strHash;string strLocalTmpFullPath = Path.Combine(direcotryDownload.FullName, attachment.FileName);using (FileStream fs = new FileStream(strLocalTmpFullPath, FileMode.Open, FileAccess.Read)){strHash = Crypto.GetSHA1String(fs);}if (strHash != singleInfo.HashString){m_logger.LogError("文件散列值不匹配\n远程散列值:" + singleInfo.HashString + "\n本地计算散列值:" + strHash);continue;}//删除同类旧版更新包DirectoryInfo dyInfo = new DirectoryInfo(outDirPath);//获取文件夹下所有的文件foreach (FileInfo feInfo in dyInfo.GetFiles()){//判断同名文件日期是否小于今天,是则删除if (feInfo.CreationTime < DateTime.Today&& feInfo.Name.Contains(singleInfo.PackageName))feInfo.Delete();}}}}//关闭文件夹folder.Close();

QQ官网帮助文档:QQ邮箱的POP3与SMTP服务器是什么  我用的SMTP,而SMTP需要身份验证,密码不再是邮箱的登陆密                                                                                                码,而是授权码    如何拿到授权码

帮助中心

-----------------------------------------------------------------------

三.  代码内容(网易的)

//mailkit还提供查询是否支持命令的语句,如果你不知道邮箱是否支持这个命令可以使用下面的函数来判断:private static bool HasImapCapabilitiesId(ImapCapabilities sourceFlag, ImapCapabilities targetFlag){return ((sourceFlag | targetFlag) == sourceFlag);}
            string account = "182379*****@163.com";string passWord = "zltdkj******";//获得的授权码m_logger.LogInformation("开始到邮箱查询更新包");//Result result;List<PackageInfo> listPackages = m_managerPackages.GetAllExeInfos();//获取可更新程序信息(更新程序,主程序,校验引擎,四个数据库)List<DownloadedInfo> listDownloadeds = m_managerDownload.GetDownloadedPackageInfos();//获得本地所有压缩包文件信息DirectoryInfo direcotryDownload = m_managerDownload.GetDownloadDirectory();//获得本地更新压缩包文件存放路径if (null == direcotryDownload){m_logger.LogError("获取本地包存放目录失败");return;}#endregion//准备工作结束ImapClient client = new ImapClient();#region 连接到邮件服务器try{//一、创建获取邮件客户端并连接到邮件服务器。//带端口号和协议的连接方式client.Connect("imap.163.com", 993, true);}catch (ImapCommandException ex){m_logger.LogInformation($"---------尝试连接时出错:{0}------------" + ex.Message);}catch (ImapProtocolException ex){m_logger.LogInformation($"---------尝试连接时的协议错误:{0}------------" + ex.Message);}catch (Exception ex){m_logger.LogInformation($"---------服务器连接错误:{0}------------" + ex.Message);}try{// 二、验证登录信息,输入账号和密码登录。client.Authenticate(account, passWord);}catch (AuthenticationException ex){m_logger.LogInformation($"---------无效的用户名或密码:{0}------------" + ex.Message);}catch (ImapCommandException ex){m_logger.LogInformation($"---------尝试验证错误:{0}------------" + ex.Message);}catch (ImapProtocolException ex){m_logger.LogInformation($"---------尝试验证时的协议错误:{0}------------" + ex.Message);}catch (Exception ex){m_logger.LogInformation($"---------账户认证错误:{0}------------" + ex.Message);}#endregion//这是网易故意设置障碍,其实是网易需要我们表明我们登录的客户端身份,具体的原理和命令参照我上一篇文章查看IMAP ID COMMAND命令,下面只具体说说mailkit如何使用到这条命令,其实mailkit是提供这个命令的,足见mailkit的强大//判断是否 添加ID COMMOND命令if (HasImapCapabilitiesId(client.Capabilities, ImapCapabilities.Id)){var clientImplementation = new ImapImplementation{Name = "MeSince",Version = "2.0"};var serverImplementation = client.Identify(clientImplementation);}//  三、获取邮箱文件夹。这次用到的的收件箱文件夹叫YBrdz。//获取所有的文件夹//List<IMailFolder> mailFolderList = client.GetFolders(client.PersonalNamespaces[0]).ToList();List<IMailFolder> mailFolderList = client.GetFolders(client.PersonalNamespaces[0]).ToList();IMailFolder InBoxFolder;if (mailFolderList != null){InBoxFolder = mailFolderList.Find(o => o.FullName.ToUpper() == "YBRDZ");//InBoxFolder.Open(MailKit.FolderAccess.ReadOnly);}//只获取收件箱文件夹var folder = client.GetFolder("YBrdz");//四、从文件夹获取文件//打开文件夹并设置为读的方式//folder.Open(MailKit.FolderAccess.ReadOnly);//已读写的方式打开文件夹folder.Open(FolderAccess.ReadWrite);//获取大于2018-3-26时间的所有邮件的唯一Idvar uidss = folder.Search(SearchQuery.DeliveredAfter(DateTime.Parse("2018-3-26")));//获取邮件头var MailHeaders = folder.Fetch(uidss, MessageSummaryItems.UniqueId | MessageSummaryItems.Full);//同主题邮件取日期最新var NeedMailIds = from a in MailHeadersgroup a by a.NormalizedSubject into grplet maxTime = grp.Max(a => a.Date.DateTime)from row in grpwhere row.Date.DateTime == maxTimeselect row.UniqueId;if (NeedMailIds!=null){//获取邮件信息foreach (var item in NeedMailIds){MimeMessage message = folder.GetMessage(item);//提取该邮件所有普通附件foreach (MimePart attachment in message.Attachments){//由附件名称获得信息,进行比较FileNameInfo singleInfo = FileNameInfo.Create(attachment.FileName);// 是否已经下载过相同或更高版本if (listDownloadeds.Where(s => (s.Name == singleInfo.PackageName) && (s.Version >= singleInfo.Version)).Count() > 0){continue;}//下载附件using (var cancel = new System.Threading.CancellationTokenSource()){string filePath = Path.Combine(outDirPath, attachment.FileName);using (var stream = File.Create(filePath)){attachment.ContentObject.DecodeTo(stream, cancel.Token);m_logger.LogInformation("更新压缩包 " + attachment.FileName + " 已下载");}} 
/从这里开始是我自己写的内容,和本次博客无关//

这次参考的博客汇总:

MailKit---获取邮件

使用MailKit / MimeKit从电子邮件中剥离附件

mailkit----163邮箱登录拉取邮件的坑

C#使用 MailKit获取邮件中的附件(QQ邮箱/163网易邮箱)相关推荐

  1. python自动发送邮件(html、附件等),qq邮箱和网易邮箱发送和回复

    在python中,我们可以用程序来实现向别人的邮箱自动发送一封邮件,甚至可以定时,如每天8点钟准时给某人发送一封邮件.今天,我们就来学习一下,如何向qq邮箱,网易邮箱等发送邮件. 一.获取邮箱的SMT ...

  2. IMAP协议定时监听接收邮件(QQ邮箱、网易邮箱都可)

    前面已介绍过SMTP协议发论文:qq邮箱,网易邮箱,smtp邮箱发邮件 本文将继续介绍如何用IMAP协议收邮件. IMAP协议:即Internet Message Access Protocol(互联 ...

  3. 终于解决!——iPhone自带的邮件应用如何绑定163网易邮箱?

    首先,这种问题163网易邮箱自己的帮助中心肯定有涉及,但实际上它写的并不全:http://help.mail.163.com/faqDetail.do?code=d7a5dc8471cd0c0e8b4 ...

  4. Django邮件应用--QQ邮箱、网易邮箱(一)

    一.前言 今天和大家分享一下python的django框架如何发送邮件. 二.准备 1.QQ邮箱.网易邮箱配置 以QQ邮箱为例 1)登录QQ邮箱-->设置--->账户,如下图: 2)开启服 ...

  5. 使用Python从邮件中下载附件和提取元数据

    在本篇博客中,我们将解析一段Python代码,该代码可以从电子邮件中下载附件并提取发送人.主题和日期等元数据. 这段代码包含两个函数:download_file 和 get_email_title.其 ...

  6. Android 获取手机中微信聊天记录并后台发送到邮箱

    实验软件 :Android Studio 实验设备:Root过的真机一部或者夜神模拟器 测试效果 废话不多说  直接上代码 获取手机微信数据库目录并发送邮件 class CoreService : I ...

  7. qq邮件中插入html,qq邮箱如何添加标签

    为了方便管理邮件,我们一般在qq邮箱中,都会对邮件或者联系人添加标签,具体的操作是怎样的呢?下面就让学习啦小编告诉大家qq邮箱如何添加标签. qq邮箱添加标签的方法 直接在QQ上点击邮箱进入,或者在百 ...

  8. 在foxmail和outlook中设置QQ邮箱、gmail邮箱、新浪邮箱、微软邮箱、网易邮箱等的方法...

    怎么用邮件客户端如outlook和foxmail来设置各种邮箱<?xml:namespace prefix = "o" ns = "urn:schemas-micr ...

  9. Email邮件发送设置 工具开发整理(网易邮箱、Mailgun为例) 下篇

    Email邮件设置(网易邮箱.Mailgun)  下篇 说明:STMP服务邮件发送工具类,其中包括文本发送.html发送.附件发送. 1.maven pom 配置 <dependency> ...

最新文章

  1. 基于短语的统计机器翻(PBMT) 开源工具 :Moses
  2. 图像增强之拉普拉斯锐化---高斯一阶导二阶导数
  3. 《算法竞赛入门经典》习题——Chapter 3
  4. ETSI GS MEC 012,RNIS API
  5. null在java存在的意义何在,Java并发编程——volatile关键字
  6. 转:Android中如何修改系统时间(应用程序获得系统权限)
  7. c#输入三个数选出最大的_C#写一个输入三个整数,按大到小顺序输出的小程序...
  8. java 接口初始化_Java类的初始化 | 学步园
  9. 批处理call和start
  10. H3C认证路由交换互联网络专家
  11. leetcode136只出现一次的数字
  12. 2014程序化购买元年-芒果移动广告-王江
  13. ubuntu16.04 部署dzzoffice+onlyoffice 局域网实现word、excel文档协同编辑
  14. es进行curl请求时报错:missing authentication token for REST request
  15. 图片验证码识别教程技术原理分析
  16. 响应式Web设计在跨终端广告创意中的应用
  17. Vue教程-day05-2018年12月25日笔记
  18. 利用UE简化JAVA后端的SQL语句编辑
  19. 我的第一个工程-一个台球游戏
  20. JMS(Java消息服务)(Activemq简单介绍)

热门文章

  1. MPSOC之8——启动及错误处理
  2. 【方案分享】2020个人抖音账号打造执行方案(附下载)
  3. 如何扩大C盘的大小(电脑c盘太小的解决办法,分区助手V8.8操作步骤)
  4. 输入字符串判断有多少个字母,数字和其他
  5. 学习iPhone UIKit 9
  6. Linux---基础部分
  7. 水库工程标准化运管云系统,科技助力水库工程管理国家样板创建
  8. vue的三种传值方式:父传子,子传父,子传子
  9. 机器学习进阶——数据清洗
  10. 通过labview vision视觉模块写的带学习功能的OCR字符识别程序