【问题标题】:MailKit: Message not delete from Inbox when gmail setting Conversation view onMailKit:当gmail设置对话视图时,邮件不会从收件箱中删除
【发布时间】:2017-05-12 03:26:27
【问题描述】:

我正在使用 MailKit 库,但遇到了问题。

我的应用程序已阅读收件箱 (Gmail) 中的指定电子邮件,然后将其删除。

IList<UniqueId> listUid = inbox.Search(query);
for (int i = 0; i < listUid.Count; i++)
{
  var message = inbox.GetMessage(listUid[i]);
  inbox.AddFlags(msg.Uid, MessageFlags.Deleted, true);
  inbox.Expunge();
}

它运行正常,但是当 Gmail 设置对话视图 = 对话视图时,如果邮件主题和发件人相同,则标记为删除的邮件将在收件箱中返回。在下一次我计算消息时,所有删除消息将被重新计算。如何避免? (保存删除消息的Uid是一种方式,但是当消息数量增加时,处理会很慢)

非常感谢。

【问题讨论】:

    标签: c# imap mailkit


    【解决方案1】:

    不幸的是,GMail 的行为方式与大多数其他 IMAP 服务器的行为方式不同,因此当您将邮件标记为 \Deleted 时,它会自动移至垃圾箱文件夹,因此 Expunge 不会执行任何操作。

    您需要做的是转到您的 GMail 设置并更改您的 IMAP 帐户的行为,以便它不会将邮件移动到垃圾箱。

    自己或 MoveTo() 将邮件放到垃圾箱文件夹中,这样您就可以在垃圾箱文件夹中获取邮件的 UID(提示:使用 MoveTo() 方法的返回值),然后打开垃圾箱文件夹并从那里删除消息。

    注意:此代码未经测试,但应如下所示:

    var trash = client.GetFolder (SpecialFolder.Trash);
    var moved = client.Inbox.MoveTo (uid, trash);
    if (moved.HasValue) {
        trash.Open (FolderAccess.ReadWrite);
        trash.AddFlags (moved.Value, MessageFlags.Deleted, true);
        trash.Expunge (new [] { moved.Value });
    }
    

    【讨论】:

    • 谢谢。我按照您的建议解决了这个问题。但是当我使用雅虎电子邮件时。 var trash = client.GetFolder (SpecialFolder.Trash);已经抛出异常The IMAP server does not support the SPECIAL-USE nor XLIST extensions.邮件服务器不支持获取特殊文件夹,怎么办?
    • 我认为在这种情况下,我会正常使用AddFlagsExpunge。它现在似乎工作了。
    • pop3 怎么样?我知道调用DeleteMessage 删除一条消息,但是当Conversation View = Conversation view on 已删除的消息将回到收件箱并重新计算。如何避免这种情况?
    • 对。并非所有服务器都支持 SPECIAL-USE,因此您不能使用 SpecialFolder 枚举来获取特殊文件夹。对于这样的服务器,您要么必须使用最初使用的方法,要么使用自定义逻辑来确定垃圾箱文件夹(可能是用户指定的文件夹?)。对于 POP3,我不确定如何解决这个问题 - 也许还有一个 GMail 设置?
    猜你喜欢
    • 1970-01-01
    • 2014-06-07
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 2022-06-17
    相关资源
    最近更新 更多