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);
}
我想将 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);
}