Mailkit 流式传输大量消息并删除它们

Mailkit stream lots of messages and delete them

我想将 Gmail 邮件导出到文件中,每个文件的邮件。最好的策略是什么?

for (int i = 0; i < inbox.Count; i++)
   {
        var message = inbox.GetMessage(i);
        // export message
        inbox.AddFlags (i, MessageFlags.Deleted);
   }

我担心的是,如果我在循环内删除消息,是否会破坏订单索引。 我不能使用 2 个单独的循环来读取和删除,因为 gmail 读取速度很慢,如果读取循环在某个时候失败,那么我必须重新开始整个过程​​。

对于标准的 IMAP 服务器,在邮件上设置 \Deleted 标志并不会从文件夹中删除邮件,它只是设置一个标志,未来的 EXPUNGE 命令将使用该标志来决定哪些邮件清除。

也就是说,默认情况下,像 GMail 这样的服务器使用非标准行为,因此您的担忧是有道理的。

为避免此类问题,我建议改用 uid。我强烈建议完全避免使用基于索引的 API。

var uids = folder.Search (SearchQuery.All);
foreach (var uid in uids) {
    var message = folder.GetMessage (uid);
    folder.AddFlags (uid, MessageFlags.Deleted);
}