幽夜莫知途 2025-01-18 00:59 采纳率: 21.4%
浏览 14

MailKit在.net下有时无法执行监听方法

在使用C#的MailKit库时,我使用了CountChanged配合Idle来完成新邮件的监听,但是这个方法时灵时不灵,可以肯定的是CountChanged事件使监听到了新邮件,因为每次发邮件时控制台都有一个线程中断的log,如图

img


, 但是根本不进入CountChanged 绑定的新方法里面,不知道为什么有时可以有时不行,环境.net freamwork4.7 MailKit 4.9.0,以下是我的代码

                              using (var client = new ImapClient())
                                      {
                                        client.Connect("imap.qq.com", 993, true);
                                        client.Authenticate("111111@qq.com", "asfasewwf");
                                        var inbox = client.Inbox;
                                        inbox.Open(FolderAccess.ReadOnly);  
                                        inbox.CountChanged += async (sender, e) =>
                                        {
                                            Console.WriteLine("新邮件");
                                            try
                                            {
                                                using (var client1 = new ImapClient())
                                                {
                                                    client1.Connect(mailhost, 993, true);
                                                    client1.Authenticate("111111@qq.com","asfasewwf");
                                                    var inbox1 = client1.Inbox;
                                                    inbox1.Open(FolderAccess.ReadOnly);
                                                    MimeMessage message = inbox1.GetMessage(inbox1.Count - 1);
                                                    DateTimeOffset sentDate = message.Date;
                                                    string emaildate = sentDate.ToString("yyyy-MM-dd HH:mm:ss"); 
                                                    string address = message.From.Mailboxes.ToList()[0].Address;
                                                    
                                                }
                                            }catch(Exception ee)
                                            {
                                                MessageBox.Show(ee.Message);
                                            }
                                             
                                        };
                                        using (var cts = new CancellationTokenSource())
                                        {
                                            client.Idle(cts.Token);
                                            cts.Cancel();
                                        }
                                        
                                        inbox.Close();
                                        client.Disconnect(true);
                 }

  • 写回答

3条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据你的描述和图中的内容,这看起来像是在监听邮件变动时的回调没有被正确地触发或执行。有一些可能的原因和解决方案可以参考:

    1. 网络连接问题:邮件服务器可能在发送邮件后并没有立即更新邮件数量,导致CountChanged事件没有被触发。这种情况下,你可以尝试增加一些延时来等待邮件服务器更新邮件数量。例如,在接收到新邮件后等待一段时间再触发获取邮件内容的操作。
    2. 线程管理问题:你的代码在CountChanged事件触发时创建了一个新的ImapClient实例来获取邮件内容。如果在这个过程中发生了线程冲突或者资源竞争,可能会导致程序异常退出。尝试优化线程管理,确保在获取邮件内容的过程中不会发生线程冲突。
    3. 异常处理:你的代码中有一个异常处理的部分,但在catch块中只显示了一个MessageBox提示。这样的处理方式可能会影响到程序的运行流程,如果处理不当可能导致程序意外终止。你可以尝试记录详细的日志或者使用更严谨的异常处理方式。
    4. Idle方法的使用:在你的代码中,你使用了Idle方法来等待邮件服务器的变化,然后在接收到变化后取消了这个Token的等待。这个做法本身没有问题,但是你需要确保在取消Token之前完成了所有的工作,否则可能导致资源没有被正确释放。你可以尝试将取消Token的操作放在合适的时机执行。

    针对以上可能的问题,你可以尝试以下的解决方案:

    • 在获取邮件内容之前增加延时等待邮件服务器更新邮件数量。
    • 优化线程管理,避免在获取邮件内容的过程中发生线程冲突。
    • 完善异常处理,记录详细的日志或者使用更严谨的异常处理方式。
    • 确保在取消Token之前完成了所有的工作。

    最后,你也需要确认你的MailKit版本是否是最新的,并且你的邮件服务器是否支持相关的操作。希望这些信息能够帮助你解决问题!

    评论

报告相同问题?

问题事件

  • 创建了问题 1月18日