赞
踩
前言: 肯定会有小伙伴会对系统发出的邮件进行验证,但是呢用SMTP发出邮件后,发现又读取不了,那我们就得用到IMAP协议去读取邮件了。话不多说往下看
一开始肯定是需要配置邮件的邮箱,这里因为方便大家查看,我就直接定义string参数了。
- string imapServer= "emil.qq.com";
- int port = 995;
- string username = "name"; //用户名
- string password = "pwd"; //密码
-
那有了配置之后,肯定的有连接才行,那我这边用的就是 MailKit包,大家需要去NuGet添加MailKit
接下来肯定是创建IMAP客户端了,废话不多说,直接贴代码
- // 创建IMAP客户端
- using (var client = new ImapClient())
- {
- client.Connect(imapServer, port, true);
- client.Authenticate(username, password);
-
- // 打开收件箱
- var inbox = client.Inbox;
- inbox.Open(FolderAccess.ReadOnly);
-
- // 遍历收件箱中的邮件并输出主题
- for (int i = 0; i < inbox.Count; i++)
- {
- var message = inbox.GetMessage(i);
- Console.WriteLine("邮件主题:{0}", message.Subject);
- }
-
- client.Disconnect(true);
- }
到这里大家可能又要问了,我不想要收件箱的啊,我需要的是发件箱的啊,别急,看下面。
-
- // 创建IMAP客户端
- using (var client = new ImapClient())
- {
- client.Connect(imapServer, port, true);
- client.Authenticate(username, password);
-
- // 打开发件箱 不可随哟更改邮箱文件夹名称和移动邮件
- var folder = client.GetFolder("已发送邮件");
-
- folder.Open(FolderAccess.ReadOnly);
-
- // 获取收件箱中的邮件数量
- Console.WriteLine("收件箱中共有 {0} 封邮件", folder.Count);
-
-
- // 遍历收件箱中的邮件并输出主题
- for (int i = 0; i < folder.Count; i++)
- {
- var message = folder.GetMessage(i);
- Console.WriteLine("邮件主题:{0}", message.Subject);
- }
-
- //必须得关,坑已经踩过了
- client.Disconnect(true);
- client.Dispose();
- }
哎,大家可以看到client.GetFolder("已发送邮件"); 非常灵活是不是,但是记住,如果邮箱文件夹名称变了,记得这一块也要变动,不然就报错了哦。
到这大家是不是还有疑惑,邮件这么多,都这么分析是不是要老久了,哎,其实他还可以读取时间段内的邮件,接着看代码
- // 创建IMAP客户端
- using (var client = new ImapClient())
- {
- client.Connect(imapServer, port, true);
- client.Authenticate(username, password);
-
- // 打开发件箱 不可随哟更改邮箱文件夹名称和移动邮件
- var folder = client.GetFolder("已发送邮件");
-
- folder.Open(FolderAccess.ReadOnly);
-
- // 获取收件箱中的邮件数量
- Console.WriteLine("收件箱中共有 {0} 封邮件", folder.Count);
- //获取昨天到今天的邮件 一般两天足已
- var uidss = folder.Search(SearchQuery.DeliveredAfter(DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"))));
-
- //获取完整邮件
- foreach (var item in uidss)
- {
- MimeMessage message = folder.GetMessage(new UniqueId(item.Id));
- Console.WriteLine("邮件主题:{0}", message.Subject);
- }
- //必须得关,坑已经踩过了
- client.Disconnect(true);
- client.Dispose();
- }
停停停,到这你是不是已经以为结束了,NONONO,你会发现读取出来的内容乱码了,其实也很好解决。
引用一下 System.Text.Encoding.CodePages 包,在最开始的地方添加 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 即可
最终的代码就是这样的
- /// <summary>
- /// IMAP 读取邮箱信息 MimeKit包下 (亲测可用)
- /// </summary>
- public static void IMAP()
- {
- try
- {
- //注册字符集,缺失字符集,一些中文编码数据为乱码 --千万别删,不然就是乱码了
- Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
- // 设置IMAP服务器地址、端口、用户名和密码
- string imapServer = "emil.qq.com";
- int port = 995;
- string username = "name"; //用户名
- string password = "pwd"; //密码
-
- // 创建IMAP客户端
- using (var client = new ImapClient())
- {
- client.Connect(imapServer, port, true);
- client.Authenticate(username, password);
-
- // 打开发件箱 不可随哟更改邮箱文件夹名称和移动邮件
- var folder = client.GetFolder("已发送邮件");
-
- folder.Open(FolderAccess.ReadOnly);
-
- // 获取收件箱中的邮件数量
- Console.WriteLine("收件箱中共有 {0} 封邮件", folder.Count);
- //获取昨天到今天的邮件 一般两天足已
- var uidss = folder.Search(SearchQuery.DeliveredAfter(DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"))));
-
- //获取完整邮件
- foreach (var item in uidss)
- {
- MimeMessage message = folder.GetMessage(new UniqueId(item.Id));
- Console.WriteLine("邮件主题:{0}", message.Subject);
- }
- //必须得关,坑已经踩过了
- client.Disconnect(true);
- client.Dispose();
- }
- }
- catch (Exception ex)
- {
- Console.WriteLine("读取收件箱失败:" + ex.Message);
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。