幽夜莫知途 2025-01-10 16:17 采纳率: 21.4%
浏览 20
已结题

实时获取IMAP邮件的新数据

在使用C#的MailKit收取IMAP邮件时,有没有办法实时获取新接收的邮件,我目前的做法是用while一直请求,这样的话不会第一时间获取数据的更新,可能延迟有个10多20秒 可能更多。这是我的一部分代码


```c#
            var today = DateTimeOffset.Now.Date;
            String  mail = "123123123@163.com";
            var Query = SearchQuery.DeliveredAfter(today).And(SearchQuery.FromContains( mail));
            String imapServer = "imap.qq.com";
            int port = 993;
            CancellationTokenSource cts = new CancellationTokenSource();
            using (var client = new ImapClient())
            {
                client.Connect(imapServer, port, true);
                client.Authenticate("12342143214@qq.com", "234234214312");
                var inbox = client.Inbox;
                inbox.Open(FolderAccess.ReadOnly); 

                var  Results = inbox.Search( Query);
                foreach (var uid in  Results)
                {
                    var message = inbox.GetMessage(uid);
                    DateTimeOffset sentDate = message.Date;
                     
                    MessageBox.Show("sssss");
                }
            } 

```

  • 写回答

2条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-01-10 16:18
    关注
    让【道友老李】来帮你解答,本回答参考gpt编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    在使用MailKit收取IMAP邮件时,可以通过实现邮件监听器(IMailFolder)来实现实时获取新接收的邮件。其中可以使用事件订阅的方式,在有新邮件到达时触发事件,从而获取最新的邮件数据。 下面是一种实现方式的示例代码:
    using System;
    using MailKit;
    using MailKit.Net.Imap;
    using MailKit.Search;
    using System.Threading;
    class Program
    {
        static void Main(string[] args)
        {
            var today = DateTimeOffset.Now.Date;
            String wechatemail = "123123123@163.com";
            var wechatQuery = SearchQuery.DeliveredAfter(today).And(SearchQuery.FromContains(wechatemail));
            String imapServer = "imap.qq.com";
            int port = 993;
            
            using (var client = new ImapClient())
            {
                client.Connect(imapServer, port, true);
                client.Authenticate("12342143214@qq.com", "234234214312");
                
                var inbox = client.Inbox;
                inbox.Open(FolderAccess.ReadOnly);
                var wechatResults = inbox.Search(wechatQuery);
                foreach (var uid in wechatResults)
                {
                    var message = inbox.GetMessage(uid);
                    DateTimeOffset sentDate = message.Date;
                    Console.WriteLine("Received new message: " + message.Subject);
                }
                
                // Implement email listener to get real-time updates
                inbox.CountChanged += (sender, e) =>
                {
                    var newMessage = inbox.GetMessage(inbox.Count - 1);
                    Console.WriteLine("Received new message: " + newMessage.Subject);
                };
                
                // Keep the program running to continue listening for new emails
                while (!cts.Token.IsCancellationRequested)
                {
                    client.Idle();
                }
            }
        }
    }
    

    通过实现邮件监听器并订阅CountChanged事件,可以在有新邮件到达时得到实时通知。这样就避免了轮询请求导致的延迟,实现了及时获取新接收的邮件数据。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月18日
  • 修改了问题 1月10日
  • 创建了问题 1月10日