MailKit:从IMAP服务器获取新邮件通知

8
我需要创建一个连接到IMAP服务器并监听新邮件的服务(或控制台)应用程序。我目前正在尝试使用MailKit,但是从文档中无法弄清如何完成此操作。
最接近的方法来自this帖子。从我所看到的内容来看,该帖子将连接设置为IDLE模式,并偶尔发送NoOP以尝试保持连接活动状态。对我而言不完全清楚的是如何接收新邮件通知。
MailKit文档似乎表明有一个可用的Alert事件。我尝试了连接到那个事件,但那似乎没有解决任何问题。
这是我尝试过的内容:
    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.");
    }
2个回答

9
我在这里找到了一个示例(链接)。我一直在IMAPClient上寻找某种事件,但没有特别与消息通知相关的事件。

然而,正如示例所示,事件是在IMAPFolder类上的...现在想想也是有道理的。

希望这能帮助其他人。


太棒了!谢谢!这个链接非常有用。 - Sanktos

-8

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

抱歉,要么选择另一个提供更高级接口的库,要么学习如何使用IMAP。


Mailkit非常好,可以满足OP的需求。问题中的链接甚至提到它包括一个名为“imapidle”的示例程序。 - arnt
1
RFC3501对于使用MailKit实现IMAP客户端并没有提供任何帮助,这正是我的问题所在。我的问题是关于MailKit以及MailKit如何实现处理新邮件通知的。我同意RFC3501可能有助于我理解IMAP,但它对我处理MailKit并没有任何帮助。是的,我可以使用不同的库,但当我已经编写并运行了大部分代码时,在SO上询问是否有其他人(也许是作者)知道如何实现它,我认为这并不过分。 - RHarris
你展示的代码问题在于它试图消费相当原始的IMAP事件,而不是那些已经转换为远程邮箱高级状态的事件。看起来你找到了MailKit实现所需接口的部分,这很好。 - Jan Kundrát

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接