如何在 MailKit ImapClient 处于空闲状态时使用它来读取消息?

Posted

技术标签:

【中文标题】如何在 MailKit ImapClient 处于空闲状态时使用它来读取消息?【英文标题】:How can I use the MailKit ImapClient to read messages while it is in idle state? 【发布时间】:2015-01-26 07:25:27 【问题描述】:

我正在使用IdleAsync 来接收有关新电子邮件的通知。

我想在有新消息到达时收到通知,然后阅读该消息,但是当我尝试阅读该消息时,我收到ImapClient 处于空闲状态的异常。

我需要创建另一个ImapClient 还是我们可以使用同一个客户端来阅读消息而不停止接收新消息的通知?

【问题讨论】:

【参考方案1】:

正如 Nameless One 所指出的,MailKit 的 Idle() 和 IdleAsync() 方法采用“done” CancellationToken 可用于结束 IDLE 状态(当您取消“done”令牌时,它将因此发送 DONE 命令结束 IDLE 状态)。

完成此操作后,您可以获取消息并照常继续。

有些人做的另一种选择是拥有 2 个 ImapClients - 一个用于 Idle(),另一个用于获取消息。

【讨论】:

我很困惑,当我们取消“完成”令牌时,我们可以获取消息,但我们将无法再收到新邮件通知(因为退出空闲状态)。这是正确的吗?所以唯一的方法(我现在正在使用)是使用两个 IMAP 客户端。一种用于获取新邮件(空闲),另一种用于获取邮件。另外我还有一个疑问,当 IMAP 客户端处于空闲状态时,我们是否会为新到达的邮件获取任何 uid 或其他内容,以便我们可以使用该 id 获取该消息。现在我正在使用 folder.Count-1 来阅读第一封邮件。 正确,当您取消doneToken时,您将停止收到新消息的通知,但您可以在获取新消息后再次调用Idle()。 当新消息到达时,您将不会获得新消息的 UID(因为服务器不发送),所以您必须这样做你已经在做什么了。 感谢大家。我会更好地使用两个 IMAP 客户端【参考方案2】:

在 IDLE 状态下,您可以发送的唯一命令是终止 IDLE 的 DONE。如果您不介意轮询,您可以考虑使用 CONDSTORE 并使用 HIGHESTMODSEQ 检测新消息。

【讨论】:

我应该只使用 MailKit。所以我正在寻找答案。【参考方案3】:

Rick Sanders 是对的,您需要发送 DONE 响应(请参阅 RFC2177 了解 IMAP IDLEDONE 的工作原理)。

虽然我不熟悉 mailkit 或Cancellation,但看起来Idle 方法接受CancellationToken,您可以通过在其CancellationTokenSource 上调用Cancel() 来取消它。这应该会根据需要发送DONE 命令。

【讨论】:

你是对的,当doneToken被取消时,它会发送DONE命令,退出IDLE状态。我将更新文档以提及这一点。

以上是关于如何在 MailKit ImapClient 处于空闲状态时使用它来读取消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何安装 imapclient

如何从 Imapclient 文件夹中获取所有消息?

如何使用 Mailkit 发送电子邮件

如何通过 Mimekit/Mailkit 发送 HTML 消息

如何使用 mailkit/mimekit IMAP 下载/保存所有收件箱/发送的电子邮件?

如何通过用户名进行身份验证并传入 MailKit?