使用MailKit在邮箱的INBOX发生邮件或更改时,立即通知的最佳方法是什么?
我一直在玩以下活动: ImapClient.Inbox.CountChanged;这在使用Exchange服务器时似乎效果最好,因为它们对MessageArrived事件完全没有反应。 PFF ..
ImapClient.Inbox.MessagesArrived;对于像SquirrelMail这样的开源邮件服务器来说,这似乎很安静,但对Exchange来说根本不起作用。
我希望在新邮件到达邮箱时收到通知,如果有任何邮件被移动/删除,以及是否有任何邮件移动到此imap文件夹。当我的INBOX出现问题时,我应该采取哪种方法来获取事件?我想要两全其美。
什么是ImapClient.Inbox.Subscribe();用于??
答案 0 :(得分:4)
Subscribe
和Unsubscribe
方法只是将文件夹(也称为邮箱)标记为已订阅或取消订阅 - 通常这仅供邮件客户端用来决定用户是否要查看该文件夹默认文件夹列表。
每当MailKit从IMAP服务器获取未标记的CountChanged
行时,就会发出"* # EXISTS"
事件,通常作为对刚刚发送的命令的响应的一部分。
MessagesArrived
事件在CountChanged
事件之后立即发出,如果新邮件计数大于旧邮件计数,则仅发出"* 7 EXISTS"
事件。不幸的是,这是一个设计糟糕/命名的事件,因为它可能会产生误导。由于确定是否发出事件的逻辑仅具有有限的上下文(旧消息计数和新消息计数),因此无法准确地决定是否发出此事件。
以下列情况为例:
当您打开文件夹时,请说明邮件数为10。
现在你从文件夹中删除了一些消息(5?)...但是,当消息被删除时,你会得到2条新消息。
当expunge命令完成时,IMAP服务器将回复MessagesArrived
由于7(新邮件计数)小于10(旧邮件计数),因此不会发出CountChanged
事件。
我希望在新邮件到达邮箱时收到通知,如果有任何邮件被移动/删除,以及是否有邮件移动到此imap文件夹。
如果您想知道新邮件何时到达,您需要收听ImapClient.Idle()
事件并自行记录,以确定是否有新邮件到达,或者邮件是否已从文件夹中移出/删除。
没有办法区分将移动到文件夹中的邮件与传递到文件夹的新邮件(除非您正在移动)。
当我的INBOX出现问题时,我应该采取哪种方法来获取事件?
如果您的服务器支持IDLE扩展,那么您可能希望使用IdleAsync()
(或CountChanged
)方法,因为"* # EXISTS"
事件只会在它从服务器收到ImapClient.NoOp()
响应,如果客户端处于IDLE模式,IMAP服务器将仅发送该响应作为对来自客户端或的命令的响应的一部分。
如果您的服务器不支持IDLE扩展,则需要" ping" IMAP服务器使用rleid
方法(这是一个无法执行任何操作的虚拟命令)定期检查自上次发送命令后是否有新消息到达。
MailKit的GitHub存储库中有一个ImapIdle sample,可以看看如何使用它。