如何可靠地从 gmail 中删除邮件? [ActiveUp.Net.Mail]
How to reliably delete message from gmail? [ActiveUp.Net.Mail]
我编写了一个程序来读取来自 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, 标志);
- Client.Expunge();
不过。没用。
当我登录到我的 gmail 帐户时,我仍然可以看到电子邮件。唯一的改变:它们被标记为已读并且标签被移除。 (示例:我使用 gmail 的过滤器设置将来自 service@paypal.de 的每封电子邮件标记为 PayPal,然后我从邮箱 PayPal 获取所有电子邮件并记住它们的 ID 并删除它们。之后它们被标记为已阅读,它们不再具有 PayPal 标签,但它们不会从邮箱 PayPal 中删除。)
执行代码时没有抛出异常
知道为什么吗?您是否推荐使用另一个 Mail-API?我正在使用 ActiveUp.Net.Mail.
感谢您的建议。
对于 GMail,您需要将它们移到垃圾箱 (UID MOVE x "[Gmail/Trash]"
)。注意文件夹的本地化。
Gmail 认为 \Deleted 标志是从该邮件中删除标签,这意味着删除收件箱标签实际上与归档邮件相同。
好吧,我终于明白了。
@Max:IMAP 设置可以(半)工作。但是,这有点烦人;)
如前所述 here 你必须:
- 设置'When I mark a message in IMAP as deleted'为'Expunge off – 等待客户端更新服务器。'
- 设置'When a message is marked as deleted and expunged from the last visible IMAP folder'为'立即永久删除消息'
但是如第二个设置中所述,您必须从所有 IMAP 文件夹中删除邮件。 Google 似乎混合了文件夹和标签。因此,在 gmail 设置中用过滤器标记 e-mail 实际上会为这封电子邮件提供辅助 label/folder。第一个是 'INBOX'。要删除它,使其不显示在 gmail 应用程序中,您必须从收件箱和其他标记的文件夹中删除该邮件,并为此邮件设置 DELETED 标志。但是您必须为收件箱和其他文件夹执行此操作,其中邮件具有不同的 ID。
然后邮件被移动到 Gmail/Trash 文件夹,在最终删除之前保留 30 天或类似时间。
谢谢你把我推向正确的方向。
我编写了一个程序来读取来自 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, 标志);
- Client.Expunge();
不过。没用。
当我登录到我的 gmail 帐户时,我仍然可以看到电子邮件。唯一的改变:它们被标记为已读并且标签被移除。 (示例:我使用 gmail 的过滤器设置将来自 service@paypal.de 的每封电子邮件标记为 PayPal,然后我从邮箱 PayPal 获取所有电子邮件并记住它们的 ID 并删除它们。之后它们被标记为已阅读,它们不再具有 PayPal 标签,但它们不会从邮箱 PayPal 中删除。)
执行代码时没有抛出异常
知道为什么吗?您是否推荐使用另一个 Mail-API?我正在使用 ActiveUp.Net.Mail.
感谢您的建议。
对于 GMail,您需要将它们移到垃圾箱 (UID MOVE x "[Gmail/Trash]"
)。注意文件夹的本地化。
Gmail 认为 \Deleted 标志是从该邮件中删除标签,这意味着删除收件箱标签实际上与归档邮件相同。
好吧,我终于明白了。
@Max:IMAP 设置可以(半)工作。但是,这有点烦人;) 如前所述 here 你必须:
- 设置'When I mark a message in IMAP as deleted'为'Expunge off – 等待客户端更新服务器。'
- 设置'When a message is marked as deleted and expunged from the last visible IMAP folder'为'立即永久删除消息'
但是如第二个设置中所述,您必须从所有 IMAP 文件夹中删除邮件。 Google 似乎混合了文件夹和标签。因此,在 gmail 设置中用过滤器标记 e-mail 实际上会为这封电子邮件提供辅助 label/folder。第一个是 'INBOX'。要删除它,使其不显示在 gmail 应用程序中,您必须从收件箱和其他标记的文件夹中删除该邮件,并为此邮件设置 DELETED 标志。但是您必须为收件箱和其他文件夹执行此操作,其中邮件具有不同的 ID。
然后邮件被移动到 Gmail/Trash 文件夹,在最终删除之前保留 30 天或类似时间。
谢谢你把我推向正确的方向。