Gmail 脚本不删除所有邮件 - 每次都删除一些

Gmail script not deleting all messages - deletes some each time

我编写了一个脚本来删除标签中超过 10 天前的所有电子邮件。当我 运行 脚本时,每次它都会删除一些电子邮件,但不会删除所有电子邮件。我有大约 7 个标签,其中很多有大约 2k 封电子邮件,最大的大约有 18k。

function empty_mail() {

// get GmailLabels as variables
  var labelOne = GmailApp.getUserLabelByName("myLabel1");
  var labelTwo = GmailApp.getUserLabelByName("myLabel2");
  // some more labels ...
  var lastLabel = GmailApp.getUserLabelByName("myLastLabel");

  // array of GmailLabels (edited)
  var labels = [myLabel1, myLabel2, myLastLabel];

  var days_old = 10; // all messages older than 10 days will be deleted in these labels

  // set threshold date in past
  var threshold_date = new Date();
  threshold_date.setDate(threshold_date.getDate() - days_old);

  // format threshold date as string and log
  var mnth = threshold_date.getMonth() + 1;
  var dy = threshold_date.getDate();
  var yr = threshold_date.getFullYear();
  var strDate = mnth + "/" + dy + "/" + yr;
  Logger.log("Mail older than " + strDate + " will be deleted.");

  // run delete_mail function on each label
  for (var i=0; i < labels.length; i++){
    Logger.log("==== Deleting old mail in: " + labels[i].getName() + " ====");  
    delete_mail(labels[i], threshold_date);
  }
}

function delete_mail(theLabel, oldDate){
  var count = 0;
  var threads = theLabel.getThreads();
  // if message is older than threshold date, move it to trash
  for (var i = 0; i < threads.length; i++){
    if (threads[i].getLastMessageDate() < oldDate){
      threads[i].moveToTrash();
      count++;
    }
  }
  Logger.log("    - deleted " + count + " messages from " + theLabel.getName());
}

乍一看和一些早期测试效果很好。但是当我注意到并非所有标签都被清除并且记录器正在输出如下内容时,我开始记录:

[15-06-30 15:38:56:487 PDT] Mail older than 6/20/2015 will be deleted.
[15-06-30 15:38:56:488 PDT] ==== Deleting old mail in: <label1> ====
[15-06-30 15:38:56:921 PDT]     - deleted 0 messages from <label1>
[15-06-30 15:38:56:921 PDT] ==== Deleting old mail in: <label2> ====
[15-06-30 15:38:57:626 PDT]     - deleted 0 messages from <label2>
[15-06-30 15:38:57:627 PDT] ==== Deleting old mail in: <label3> ====
[15-06-30 15:38:57:900 PDT]     - deleted 0 messages from <label3>
[15-06-30 15:38:57:901 PDT] ==== Deleting old mail in: <label4> ====
[15-06-30 15:39:02:593 PDT]     - deleted 0 messages from <label4>
[15-06-30 15:39:02:594 PDT] ==== Deleting old mail in: <label5> ====
[15-06-30 15:39:02:849 PDT]     - deleted 0 messages from <label5>
[15-06-30 15:39:02:850 PDT] ==== Deleting old mail in: <label6> ====
[15-06-30 15:39:30:078 PDT]     - deleted 24 messages from <label6>
[15-06-30 15:39:30:079 PDT] ==== Deleting old mail in: <label7> ====
[15-06-30 15:39:36:633 PDT]     - deleted 0 messages from <label7>

问题是至少在标签 4、6 和 7 中,仍有许多(数百或数千)封电子邮件仍应删除。任何人都可以看到我的代码中的错误,是否有某种超时命中,或者是否有其他人 运行 遇到这样的事情?谢谢!

我通过深入研究代码解决了这个问题。在 gmail 脚本中 documentation for the getThreads() function 它有这一行:“当所有线程的大小太大系统无法处理时,此调用将失败。

在我的例子中,调用并没有失败,只是返回了 前 500 个线程。为了解决这个问题,我使用了 getThreads(start, max) 调用,如下所示。

function delete_mail(theLabel, oldDate){

  var threadStart = 0;
  var threadMax = 100;
  var totalDeletedCount = 0;
  var totalThreadCount = 0;
  var pageDeleteCount = 0;
  // get 100 threads at a time
  do {
    var threads = theLabel.getThreads(threadStart, threadMax);
    for (var i = 0; i < threads.length; i++){
      if (threads[i].getLastMessageDate() < oldDate){
        threads[i].moveToTrash();
        totalDeletedCount++;
        pageDeleteCount++;
      }
    }
    threadStart += threadMax;        //start at next max
    threadStart -= pageDeleteCount;  //subtract threads deleted in loop
    pageDeleteCount = 0;
    totalThreadCount += threads.length;
  } while (threads.length == threadMax);
  // log using totalThreadCount and totalDeletedCount
}

这一次获得 100 个线程,然后通过加 100 和减去移动到下一个线程,但是许多线程刚刚被删除。

其他问题:

  • 仍有太多操作达到 google 配额。
    • 查看所有配额信息here
  • Google 将在 运行 时间 6 分钟后使脚本超时。
  • 由于上述 one/both,脚本未完成。

可能的修复

  • 每个标签分成一个脚本,运行 分开。
  • 通过删除更多邮件使每个标签的大小更易于管理。
  • 首先获取标签的大小,然后从末尾循环并在具有足够新日期的线程处中断。
    • 我使用了最后一个选项并且效果很好,post 如果您想查看代码示例。