以下 google 脚本是否准确删除了带有特定标签的邮件?

Does the following google script exactly delete the messages with certain label?

我的目标是确保所有来自 test@test.com 的 Gmail 邮件都被立即永久删除。

我创建了一个过滤器,为来自该地址的新邮件提供标签“deleteforever”。接下来,我制作了一个 Google 脚本,可以完全删除所有带有“deleteforever”标签的邮件。为了确定没有其他消息被删除,我额外检查了消息是否真的来自 test@test.com。这样,当一个线程中包含来自test@test.com的消息和来自其他地址的消息时,只需要删除来自test@test.com的消息。

我计划每分钟 运行。我有 3 个问题:

  1. 此算法是否总是完全删除来自 test@test.com 的所有新消息?
  2. 此算法是否永远不会删除来自其他发件人的邮件?
  3. 假设 test@test.com 不发送很多电子邮件,这不会花费太多 运行时间吗? (我看到每天有1小时的限制。)
function extractEmailAddress(header) {
  return header.match(/[^@<\s]+@[^@\s>]+/)[0];
}

function deleteForever() {
  var threads, msgs, label1, label2, sender,message,messageId;
  label1="test@test.com";
  label2="Test@test.com";

  threads= GmailApp.getUserLabelByName("deleteforever").getThreads();
  msgs = GmailApp.getMessagesForThreads(threads);
  for (var i = 0 ; i < msgs.length; i++) {
    for (var j = 0; j < msgs[i].length; j++) {
      message=msgs[i][j];
      sender = extractEmailAddress(message.getFrom());
      if (sender==label1 || sender==label2){
         messageId=message.getId();
         Gmail.Users.Messages.remove("me", messageId);
      }
    }
  }
}

更新

受@TheMaster 评论的启发,以下策略解决了潜在的运行时间问题:

-修改 Gmail 中的过滤器,使来自 test@test.com 的邮件跳过收件箱。

-隐藏“deleteforever”文件夹

现在脚本可以 运行 每 5 分钟或更低的频率。

由于您愿意按照 TheMaster 和 运行 和 script/function 的建议将通知静音,因此我建议您使用 Gmail API 进一步改进它,特别是batchDelete 提高性能。

脚本:

function deleteForever() {
  label_name = 'deleteforever';
  sender1 = 'do-not-reply@Whosebug.email';
  sender2 = 'forms-receipts-noreply@google.com';
  
  // get labelId of label_name
  var labelId = Gmail.Users.Labels.list("me").labels.filter(label => label.name == label_name)[0].id;
  // filter messages where it has labelId and from either sender1 or sender2
  var messages = Gmail.Users.Messages.list("me", {
    "labelIds": labelId, 
    "q": `{from: ${sender1} from: ${sender2}}`
  }).messages;
  // if messages is not empty
  if(messages){
    // get ids of the messages
    var ids = messages.map(message => message.id);
    // bulk delete the messages
    Gmail.Users.Messages.batchDelete({"ids": ids}, "me");
  }
}

这将在满足条件的情况下批量删除累积的消息ID:

  • 发件人是 sender1sender2
  • 有标签 label_name

注:

  • 您将不再需要 extractEmailAddress