Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Mailkit获取收件箱更改通知_C#_Mailkit - Fatal编程技术网

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

C# 使用Mailkit获取收件箱更改通知,c#,mailkit,C#,Mailkit,当使用MailKit收到邮件或邮箱收件箱发生更改时,即时收到通知的最佳方式是什么 我一直在玩以下事件: ImapClient.Inbox.CountChanged;这似乎在使用Exchange服务器时效果最好,因为它们对MessageArrived事件根本没有反应。Pff ImapClient.Inbox.messages已驱动;这似乎在开源邮件服务器(如SquirrelMail)上运行良好,但在Exchange上根本不起作用 我希望在新邮件到达邮箱时收到通知,如果有邮件被移动/删除,以及是否有

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

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

ImapClient.Inbox.messages已驱动;这似乎在开源邮件服务器(如SquirrelMail)上运行良好,但在Exchange上根本不起作用

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


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

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

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

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

以以下情况为例:

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

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

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

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

我希望在新邮件到达邮箱时收到通知,如果有邮件被移动/删除,以及是否有邮件移动到此imap文件夹

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

无法区分移动到文件夹中的邮件和传递到文件夹中的新邮件(除非您正在移动)

当我的收件箱出现问题时,我应该采取哪种方法尽快获取事件

如果您的服务器支持IDLE扩展,您可能需要研究使用
ImapClient.IDLE()
(或
IdleAsync()
)方法,因为
CountChanged
事件只有在从服务器接收到
“*#EXISTS”
响应时才会发出,IMAP服务器只会将该响应作为对来自客户端的命令的响应的一部分发送,或者如果客户端处于空闲模式

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


MailKit的GitHub存储库中有一个可以查看如何使用它的工具。

感谢您提供了非常详细的答案。我可以看出MessagesRived在我的情况下对我没有什么好处,而且subscribe()方法超出了我的范围。我已经有一个IMAP连接,它的唯一目的是保持空闲模式,以接收这些事件。为什么SquirrelMail在新邮件到达邮箱时似乎不会立即对“*#存在”作出反应?即使有一个IMAP连接处于持续空闲模式。不幸的是,即使空闲也不能保证您会收到即时通知,因为并非所有服务器都会为所有类型的事件提供即时通知。例如,GMail不支持IDLE中标志更改的通知。我已经运行了一些进一步的测试,看来SquirrelMail实际上响应CountChanged。但我看到的是,当计数改变时,我收到的邮件被触发,被关闭1?因此,如果我发送一封邮件,它在我发送另一封邮件之前不会被提取,因此第二封邮件在n-mail发送之前不会被提取,等等。。我的提取看起来像:inbox.fetch(0,-1,MessageSummaryItems.Full | MessageSummaryItems.UniqueId | MessageSummaryItems.Flags)如果我通过ie.Outlook手动从收件箱中移动邮件,它似乎很快就会变为CountChanged()。但当我收到新邮件或任何邮件时,我都不会收到那个事件,因为一些奇怪的原因:/当我移动邮件时,它似乎还差一个