以下 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 个问题:
- 此算法是否总是完全删除来自 test@test.com 的所有新消息?
- 此算法是否永远不会删除来自其他发件人的邮件?
- 假设 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:
- 发件人是
sender1
或 sender2
- 有标签
label_name
。
注:
- 您将不再需要
extractEmailAddress
。
我的目标是确保所有来自 test@test.com 的 Gmail 邮件都被立即永久删除。
我创建了一个过滤器,为来自该地址的新邮件提供标签“deleteforever”。接下来,我制作了一个 Google 脚本,可以完全删除所有带有“deleteforever”标签的邮件。为了确定没有其他消息被删除,我额外检查了消息是否真的来自 test@test.com。这样,当一个线程中包含来自test@test.com的消息和来自其他地址的消息时,只需要删除来自test@test.com的消息。
我计划每分钟 运行。我有 3 个问题:
- 此算法是否总是完全删除来自 test@test.com 的所有新消息?
- 此算法是否永远不会删除来自其他发件人的邮件?
- 假设 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:
- 发件人是
sender1
或sender2
- 有标签
label_name
。
注:
- 您将不再需要
extractEmailAddress
。