使用 Mailkit 获取收件箱更改通知

Getting notification on inbox changes using Mailkit

当使用 MailKit 我的邮箱的收件箱发生邮件或更改时,即时通知的最佳方式是什么?

我一直在研究以下事件: ImapClient.Inbox.CountChanged;这似乎在使用 Exchange 服务器时效果最好,因为它们对 MessageArrived 事件根本没有反应。噗..

ImapClient.Inbox.MessagesArrived;这似乎与开源邮件服务器(如 SquirrelMail)运行良好,但对 Exchange 根本不起作用。

我想在新邮件到达邮箱时收到通知,如果有任何邮件 moved/deleted,以及是否有任何邮件移至此 imap 文件夹。当我的收件箱发生问题时,我应该采取哪种方法尽快收到事件?我想要两全其美。

什么是 ImapClient.Inbox.Subscribe();用于??

SubscribeUnsubscribe 方法只是将文件夹(又名邮箱)标记为已订阅或未订阅 - 通常这仅供邮件客户端用来决定用户是否要查看默认文件夹列表中的文件夹。

只要 MailKit 从 IMAP 服务器获得未标记的 "* # EXISTS" 行,就会发出 CountChanged 事件,通常作为对刚刚发送的命令的响应的一部分。

当且仅当新消息计数大于旧消息计数时,MessagesArrived 事件会在 CountChanged 事件之后立即发出。不幸的是,这是一个严重的 designed/named 事件,因为它可能具有很大的误导性。由于判断是否触发事件的逻辑只有有限的上下文(旧消息计数和新消息计数),因此无法准确判断是否触发该事件。

以下面的情况为例:

当您打开文件夹时,假设邮件数为 10。

现在您从文件夹中删除了一些消息(5 条?)...但是,在删除消息的同时,您收到了 2 条新消息。

清除命令完成后,IMAP 服务器回复 "* 7 EXISTS"

由于 7(新消息计数)小于 10(旧消息计数),MessagesArrived 事件不会被触发。

I want to be notified when new mails arrive to the mailbox, if any mails are moved/deleted, and if there any mails moved to this imap folder.

如果您想知道新消息何时到达,您需要收听 CountChanged 事件并自己记账以确定新消息是否到达或消息是否已 moved/deleted文件夹。

无法区分正在移动 文件夹的邮件与正在传送到文件夹的新邮件(除非您正在移动)。

Which approach should I take to get an event asap when something happens to my INBOX??

如果您的服务器支持 IDLE 扩展,您可能需要考虑使用 ImapClient.Idle()(或 IdleAsync())方法,因为 CountChanged 事件只会在以下情况下发出它从服务器收到一个 "* # EXISTS" 响应,如果客户端在 空闲模式。

如果您的服务器不支持 IDLE 扩展,您将需要使用 ImapClient.NoOp() 方法(这是一个不执行任何操作的虚拟命令)定期 "ping" IMAP 服务器命令检查自上次发送命令以来是否有任何新消息到达。

MailKit 的 GitHub 存储库中有一个 ImapIdle sample 以查看如何使用它。