繁体   English   中英

Google Apps 脚本 - Gmail,永久删除垃圾箱中特定 label 的电子邮件

[英]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的回答已经指出了对我有用的解决方案,但由于缺乏经验/非专业开发人员,我花了一点时间将其转化为原始问题的工作解决方案。 以下是我用于执行此任务的步骤的简要说明:

  1. 在我的脚本中创建以下函数:

     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()); } } 
  2. 要为此脚本启用高级服务,请在菜单上找到“ Resources ”,然后选择“ Advanced Google services...

  3. 在列表中启用Gmail API

  4. 在选择OK之前,请单击Google Developers Console链接。 搜索gmail ,并在那里启用该服务。

  5. 完成,选择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 ,只有将该服务添加到项目后才能访问,如下所示:

第 1 步:点击服务中的+

点击服务

(请注意,此处目前没有列出任何服务)

第2步:

向下滚动到 Gmail 服务,select 然后单击添加

添加 Gmail 服务

第 3 步:

最后,确认该服务现在出现在服务列表中:

在此处输入图像描述


示例代码

重申一下,下面的示例代码需要在一个像上面那样添加了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高级服务(来自谷歌指南):

第 1 步:点击服务中的+

单击服务部分的“+”: 在此处输入图像描述

(请注意,此处目前没有列出任何服务)

第2步:

向下滚动到 Gmail 服务,select 然后单击添加

在此处输入图像描述

第 3 步:

最后,确认该服务现在出现在服务列表中:

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM