3

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

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

ImapClient.Inbox.MessagesArrived; 这似乎与 SquirrelMail 之类的开源邮件服务器运行良好,但在 Exchange 中根本无法运行。

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

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

4

1 回答 1

8

Subscribeand方法只是将Unsubscribe一个文件夹(又名邮箱)标记为已订阅或未订阅 - 通常这仅由邮件客户端用于决定用户是否希望在默认文件夹列表中查看该文件夹。

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

如果且仅当新消息计数大于旧消息计数时,该MessagesArrived事件会在事件之后立即发出。CountChanged不幸的是,这是一个设计/命名错误的事件,因为它可能非常具有误导性。由于决定是否发出事件的逻辑只有有限的上下文(旧消息计数和新消息计数),因此无法准确决定是否发出该事件。

以以下情况为例:

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

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

当 expunge 命令完成时,IMAP 服务器回复"* 7 EXISTS"

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

我想在新邮件到达邮箱、是否移动/删除任何邮件以及是否有任何邮件移动到此 imap 文件夹时收到通知。

如果您想知道新消息何时到达,您需要收听该CountChanged事件并自己记账以确定是否有新消息到达或消息是否已从文件夹中移出/删除。

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

当我的收件箱发生问题时,我应该采取哪种方法尽快获得事件?

如果您的服务器支持 IDLE 扩展,您可能需要考虑使用ImapClient.Idle()(or IdleAsync()) 方法,因为该CountChanged事件仅在收到"* # EXISTS"来自服务器的响应时才会发出,并且 IMAP 服务器只会将该响应作为对来自客户端的命令客户端处于空闲模式的响应。

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

MailKit 的 GitHub 存储库中有一个ImapIdle 示例,以了解如何使用它。

于 2015-05-07T18:41:16.560 回答