[英]Google Apps Script - Gmail, delete forever e-mails in trash with specific label
我正在尝试制作一个脚本,该脚本可以立即永久地自动删除来自某个发件人的电子邮件,因为 Gmail 只允许将电子邮件发送到垃圾箱 30 天的过滤器。 请不要暗示默认过滤器就足够了,至于我的情况,重要的是我不知道我收到了来自该发件人的电子邮件。
我当前的脚本如下所示:
function deleteForever(labelName) {
var threads = GmailApp.search("in:trash label:" + labelName);
for (var i = 0; i < threads.length; i++) {
threads[i].moveToTrash(); // Where I would need a delete forever trigger
}
};
但是,我一直无法找到一种使用 GmailThread 并将其永久删除的方法,因为不存在用于此目的的 function。 我想看看是否有办法使用 JavaScript 完成任务,但一直无法找到方法。
有谁知道我如何设置这些电子邮件以在收到时永久删除它们自己?
根据设计,使用GmailApp永久删除电子邮件是不可能的。
@ karan的回答已经指出了对我有用的解决方案,但由于缺乏经验/非专业开发人员,我花了一点时间将其转化为原始问题的工作解决方案。 以下是我用于执行此任务的步骤的简要说明:
在我的脚本中创建以下函数:
function deleteForever(userId, labelName) { var threads = GmailApp.search("in:trash label:" + labelName); for (var i = 0; i < threads.length; i++) { Gmail.Users.Messages.remove(userId, threads[i].getId()); } }
要为此脚本启用高级服务,请在菜单上找到“ Resources
”,然后选择“ Advanced Google services...
在列表中启用Gmail API
。
在选择OK
之前,请单击Google Developers Console
链接。 搜索gmail
,并在那里启用该服务。
完成,选择OK
; 该功能现在应该工作。 (评论:如@karan提供的链接中所述 ,可以使用"me"
作为userID,或者提供一个人的Gmail地址: "<address>@gmail.com"
。)
(为我的脚本启用高级服务的步骤基于此处的 Google指南。)
此脚本适用于Google Apps脚本。 您必须一起连接和授权服务。
function myFunction() {
var labelName = "deleteForever"
var threads = GmailApp.search("in:trash label:" + labelName);
for (var i = 0; i < threads.length; i++) {
Gmail.Users.Messages.remove('me', threads[i].getId());
}
}
如果它可以帮助某人,可以使用高级服务完成。
https://developers.google.com/gmail/api/v1/reference/users/messages/delete
高级服务中的方法是
Gmail.Users.Messages.remove(userId, id)
这更像是对@JonathanY 的https://stackoverflow.com/a/37799896/325742的支持评论:
请注意,能够永久删除消息或线程依赖于Gmail
class ,只有将该服务添加到项目后才能访问,如下所示:
+
(请注意,此处目前没有列出任何服务)
向下滚动到 Gmail 服务,select 然后单击添加
最后,确认该服务现在出现在服务列表中:
重申一下,下面的示例代码需要在一个像上面那样添加了Gmail
服务的项目中。
要测试此代码,请选择 Bin 中的任何消息并使用deleteForever
对其进行 label(如果需要,请创建此 label)。
将dryRun
保留为 true 并执行 function。output 将显示哪些线程和/或消息将被删除。
在实际使用中,如果您计划通过Gmail.Users.Threads.remove
删除整个线程,那么您将不会使用checkMessagesForContentBeforeDeleting
,因为后者会在删除之前检查各个消息正文的内容(即只会删除与“正文内容”匹配的各个消息具有指定的正则表达式标准)而不是整个线程。
var dryRun = true;
String.prototype.indexOfRegex = function (regex) {
var match = this.match(regex);
return match ? this.indexOf(match[0]) : -1;
}
function testDeleteForever() {
var labelName = "deleteForever"
var badContentFilterForMessages = ".*08:29.*"
var gmailSearchString = `in:trash label:${labelName}`
var threads = GmailApp.search(gmailSearchString);
const n = threads.length;
if (n <= 0) {
Logger.log("No threads matching search string \"%s\"", gmailSearchString);
return
} else {
Logger.log("Found %s threads matching action **%s**", n, gmailSearchString);
}
for (var i = 0; i < threads.length; i++) {
var thread = threads[i];
Logger.log(`\t Processing Thread#${i} [ID: ${thread.getId()}]: [First message subject: ${thread.getFirstMessageSubject()}]`)
if (!dryRun) {
Logger.log(`\t \t Will delete forever the THREAD: ${thread.getFirstMessageSubject()}`)
Gmail.Users.Threads.remove('me', thread.getId())
} else {
Logger.log(`\t \t **DRY RUN** would have deleted forever the THREAD: ${thread.getFirstMessageSubject()}`)
}
checkMessagesForContentBeforeDeleting(thread, badContentFilterForMessages);
}
}
function checkMessagesForContentBeforeDeleting(thread, badContentFilterForMessages){
Logger.log(`\t \t Checking messages in ${thread.getId()} for content matching "${badContentFilterForMessages}" before deleting forever`)
var messages = thread.getMessages();
Logger.log(`\t \t Number of messages in ${thread.getId()}: ${messages.length} `)
for (var j = 0; j < messages.length; j++) {
var message = messages[j];
Logger.log(`\t \t \t Checking Message#${j}: [Subject: ${message.getSubject()}]`)
var body = message.getRawContent();
var containsSearchString = body.indexOfRegex(badContentFilterForMessages) > -1;
if (containsSearchString) {
Logger.log(`\t \t \t \t Message#${j} is a match! Will be deleted!`)
if (!dryRun) {
Logger.log(`\t \t \t \t Will delete forever the MESSAGE: ${message.getSubject()}`)
Gmail.Users.Messages.remove('me', message.getId());
} else {
Logger.log(`\t \t \t \t **DRY RUN** would have deleted forever.`)
Gmail.Users.Messages.remove('me', message.getId());
}
} else {
Logger.log(`\t \t \t \t NOT deleting the MESSAGE (content does not match)`)
}
}
}
试试这个
function delete_all_mail(){
var myspreadsheet = SpreadsheetApp.openById('1AG1fZ9BuS8***********');
var mysheet = myspreadsheet.getSheets()[0];
//0~500
var threads = GmailApp.getInboxThreads(0 , 500);
for(var i = 0; i < threads.length; i++)
{
threads[i].moveToTrash();
}
}
通过使用batchDelete
而不是多次调用 remove 方法,在多条消息的情况下性能更好:
function deleteForever (labelName, emailAccount = 'me') {
const threads = GmailApp.search('in:trash label:' + labelName);
const messages = threads.map(thread => thread.getMessages()).flat();
const messagesIds = messages.map(message => message.getId());
if (!threads.length) {
return console.log('not emails to delete');
}
Gmail.Users.Messages.batchDelete({ ids: messagesIds }, emailAccount);
console.log(`${messages.length} messages in ${threads.length} threads deleted forever`);
}
// example call to function:
// deleteForever('labelName')
注意:使用脚本前,需要开启Gmail
高级服务(来自谷歌指南):
+
(请注意,此处目前没有列出任何服务)
向下滚动到 Gmail 服务,select 然后单击添加
最后,确认该服务现在出现在服务列表中:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.