使用 MailKit 在我的邮箱的收件箱中发生邮件或更改时,获得即时通知的最佳方式是什么?
我一直在玩以下事件: ImapClient.Inbox.CountChanged; 这在使用 Exchange 服务器时似乎效果最好,因为它们根本不会对 MessageArrived 事件做出反应。噗..
ImapClient.Inbox.MessagesArrived; 这似乎在 SquirrelMail 等开源邮件服务器上运行良好,但在 Exchange 中根本不起作用。
我想在新邮件到达邮箱时收到通知,是否有任何邮件被移动/删除,以及是否有任何邮件移动到此 imap 文件夹。当我的收件箱发生问题时,我应该采取哪种方法来尽快收到事件?我想要两全其美。
什么是 ImapClient.Inbox.Subscribe(); 用于??
该Subscribe和Unsubscribe方法只是标志一个文件夹(又名邮箱)作为认购或退订-通常这只是使用邮件客户端来决定用户是否不希望看到在默认文件夹列表中的文件夹。
CountChanged任何时候 MailKit"* # EXISTS"从 IMAP 服务器获取未标记的行时都会发出该事件,通常作为对刚刚发送的命令的响应的一部分。
如果且仅当新消息计数大于旧消息计数时,该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 示例,可以查看如何使用它。
| 归档时间: |
|
| 查看次数: |
3340 次 |
| 最近记录: |