C# 通过IMAP协议读取邮件进行解析

前言: 肯定会有小伙伴会对系统发出的邮件进行验证,但是呢用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);
            }
        }

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值