【问题标题】:MailKit : Obtaining new mail notification from IMAP serverMailKit : 从 IMAP 服务器获取新邮件通知
【发布时间】:2014-12-09 20:00:18
【问题描述】:

我需要创建一个连接到 IMAP 服务器并侦听新邮件的服务(或控制台)应用程序。我目前正在尝试使用 MailKit,但在尝试从文档中弄清楚如何完成此操作时遇到了麻烦。

我最接近的是来自this 的帖子。据我所知,这篇文章将连接设置为空闲模式,并偶尔发送 NoOP 以尝试保持连接处于活动状态。我不完全清楚的是如何接收新邮件通知。

MailKit 文档似乎表明存在可用的警报事件。我已经尝试过使用它,但这似乎无法解决任何问题。

这是我尝试过的:

    var cts = new CancellationTokenSource();
    testIDLEMailNotification(cts.Token);

    ...

    private static void testIDLEMailNotification(CancellationToken token)
    {
        using (var client = ClientCreateAndConnect(token))
        {
            while(!token.IsCancellationRequested)
            {
                using (var done = new CancellationTokenSource())
                {
                    using (var timer = new System.Timers.Timer(9 * 60 * 1000))
                    {
                        timer.Elapsed += (sender, e) => done.Cancel();
                        timer.AutoReset = false;
                        timer.Enabled = true;
                        try
                        {
                            client.Idle(done.Token, token);
                            client.NoOp(token);

                        }
                        catch (OperationCanceledException)
                        {
                            break;
                        }
                    }
                }
            }
        }
    }

    private static ImapClient ClientCreateAndConnect(CancellationToken token)
    {
        var client = new ImapClient();
        client.Connect("server.domain", 993, true, token);
        client.AuthenticationMechanisms.Remove("XOAUTH");
        client.Authenticate("mailbox@server.domain", "password",token);

        client.Inbox.Open(MailKit.FolderAccess.ReadWrite, token);
        client.Alert += client_Alert;
        return client;
    }

    static void client_Alert(object sender, AlertEventArgs e)
    {
        Console.WriteLine("New Email or something.");
    }

【问题讨论】:

    标签: c# imap mailkit


    【解决方案1】:

    由于您实际上是在尝试编写 IMAP 客户端,因此必须阅读几个 RFC。特别是,RFC3501 会告诉您 ALERT 是什么以及您应该如何处理它。

    抱歉,要么选择另一个为您提供更高级别界面的库,要么学习如何使用 IMAP。

    【讨论】:

    • Mailkit 非常好,可以满足 OP 的要求。问题中的链接甚至说它包含一个名为“imapidle”的示例程序。
    • RFC3501 没有告诉我任何关于使用 MailKit 实现 IMAP 客户端的信息,这就是我的问题所在。我的问题是关于 MailKit 以及 MailKit 如何实现处理新邮件通知的。我同意 RFC3501 可能会帮助我理解 IMAP,但它不会帮助我使用 MailKit。是的,我可以使用不同的库,但是当我编写并运行大部分代码时,我认为在 SO 上询问其他人(也许是作者)是否知道如何实现它并不是不合理的。
    • 您显示的代码的问题是它试图使用非常原始的 IMAP 事件,而不是那些已经转换为远程邮箱高级状态的事件。看来你找到了MailKit中实现你需要的接口的部分,很好。
    【解决方案2】:

    我找到了一个样本here。我一直在 IMAPClient 上寻找某种事件,但没有任何与消息通知特别相关的内容。

    但是,如示例所示,事件位于 IMAPFolder 类中……现在我想起来了。

    希望这对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 1970-01-01
      • 2014-09-03
      • 2018-07-16
      • 2012-08-08
      • 2015-06-03
      • 2013-12-24
      • 2013-05-25
      • 1970-01-01
      相关资源
      最近更新 更多