【问题标题】:How to reliably delete message from gmail? [ActiveUp.Net.Mail]如何可靠地从 gmail 中删除消息? [ActiveUp.Net.Mail]
【发布时间】:2021-01-19 00:45:08
【问题描述】:

我编写了一个程序来读取来自 gmail 的特定消息。阅读和分析后,我想删除它们。但是,我无法让它工作。我使用以下代码:

    /// <summary>
    /// Deletes a set of E-Mails by their messageID from a given mailbox
    /// </summary>
    /// <param name="messageIds">The IDs of the messages to delete</param>
    /// <param name="mailBox">The mailbox to delete the messages from</param>
    public void DeletMails(List<int> messageIds, string mailBox)
    {
        if (messageIds.Count<1)
        {
            return;
        }
        // get the mailbox
        Mailbox mails = Client.SelectMailbox(mailBox);
        
        // create a collection of flags to set for the emails
        var flags = new FlagCollection();
        // set only the deleted flag
        flags.Add(new Flag("DELETED"));

        Logging.Log.Info($"Deleting {messageIds.Count} mails");
        // set the flag for each email in the messageIds
        try
        {
            foreach (var id in messageIds)
            {
                mails.DeleteMessage(id, true);
                mails.SetFlags(id, flags);
            }
        }
        catch (Exception ex)
        {
            Logging.Log.Error($"{ex.Message}:{ex.StackTrace}");
        }

        Logging.Log.Info($"Finished deleting {messageIds.Count} mails");

        Client.Expunge();
        Client.Disconnect();
    }

我知道代码中有一些重复项

  • mails.DeleteMessage(id, true);
  • mails.SetFlags(id, flags);
  • Client.Expunge();

但是。它不起作用。

当我登录我的 gmail 帐户时,我仍然可以看到电子邮件。只有改变:它们被标记为已读并且标签被从它们中移除。 (例如:我使用 gmail 的过滤器设置将来自 service@paypal.de 的每封电子邮件标记为 PayPal,然后我从邮箱 PayPal 中获取所有电子邮件并记住它们的 ID 并删除它们。之后它们被标记为已读和它们不再具有 PayPal 标签,但并未从邮箱 PayPal 中删除。)

执行代码时没有抛出异常。

知道为什么吗?你推荐使用另一个 Mail-API 吗?我正在使用 ActiveUp.Net.Mail。

感谢您的建议。

【问题讨论】:

  • 对于 gmail,您需要将它们移至回收站。删除它们会删除文件夹标签,这实际上使它们“存档”。
  • @Max 啊,好的。谢谢你的帮助。你能把它作为答案,这样我就可以结束这个话题了吗?

标签: c# wpf email imap


【解决方案1】:

好吧,我终于想通了。

@Max:IMAP 设置确实(半)有效。但是,这有点烦人;) 如here 所述,您必须:

  1. 将“当我在 IMAP 中将邮件标记为已删除时”设置为“删除 - 等待客户端更新服务器。
  2. 将“当邮件被标记为已从最后可见的 IMAP 文件夹中删除时”设置为“立即永久删除邮件

但如第二个设置中所述,您必须从所有 IMAP 文件夹中删除邮件。谷歌似乎混合了文件夹和标签。因此,在 gmail 设置中使用过滤器标记电子邮件实际上会为该电子邮件提供辅助标签/文件夹。第一个是“收件箱”。要删除它,使其不会出现在 gmail 应用程序中,您必须从收件箱和其他标记文件夹中删除该消息,并为此消息设置 DELETED 标志。但是您必须为收件箱和其他文件夹执行此操作,其中消息具有不同的 ID。

然后该邮件被移至 Gmail/Trash 文件夹,并在其中保留 30 天或类似的时间,然后最终被删除。

感谢您将我推向正确的方向。

【讨论】:

    【解决方案2】:

    对于 GMail,您需要将它们移到垃圾箱 (UID MOVE x "[Gmail/Trash]")。注意文件夹的本地化。

    Gmail 认为 \Deleted 标志是从该邮件中删除标签,这意味着删除收件箱标签实际上与归档邮件相同。

    【讨论】:

    • 对不起,不得不重新接受。现在邮件有 [Imap]/Trash 标签。这意味着它们仍然出现在 gmail android 应用程序的收件箱中,而是用该标签标记。删除它们会删除标签并将它们存档:(关于如何永久删除它们而不显示在 gmail 应用程序中的任何想法?
    • limilabs.com/blog/delete-email-permanently-in-gmail 提到 gmail 设置:“当邮件被标记为已删除并从最后一个可见的 IMAP 文件夹中删除时:” 1 - 存档邮件(默认) 2 - 将邮件移至垃圾箱 3 - 但是,立即永久删除该消息。将其设置为“3”似乎根本不会改变行为。邮件仍然显示在 gmail 应用程序中,带有“垃圾”标签或没有任何标签:(
    • IMAP 设置不起作用。您需要将其移至垃圾箱,如果您真的希望它永远消失,请切换到垃圾箱,然后从那里删除并清除它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    相关资源
    最近更新 更多