如何防止 gmail 线程返回

How to keep gmail threads from coming back

我有这个功能,我 运行 每小时。它检查收件箱中是否有发往邮件列表的消息。然后它稍微重新格式化它们,保存附件,并将它们转发到另一个电子邮件地址,然后表面上丢弃处理过的消息。效果很好,除了....

我最近遇到了一个不会死的线程。它有超过 50 个回复,当新回复以相同的主题行出现时,线程中所有已处理的旧消息将再次处理。所以我的发件箱呈指数级增长,收件人的电子邮件收件箱也是如此。我不确定我是否只是没有有效地删除已发送的消息,或者是否有其他方法我应该在线程中识别已处理的消息,以便在将更多消息添加到线程时不会再次处理它们.我不知道这是应用程序脚本问题还是 gmail 问题。

这是我的代码:

function processPMFMail(){
  var threads = GmailApp.getInboxThreads();
  var message = GmailApp.getMessagesForThreads(threads); 
  for(var i = 0; i < message.length; i++) {
    for(var j = 0; j < message[i].length; j++) {
      var from = message[i][j].getFrom();
      var to = message[i][j].getTo();
      var cc = message[i][j].getCc();
      var bcc = message[i][j].getBcc();
      var fields = {to, cc, bcc};
                    //Logger.log(to);

                    if (
                    [to,cc,bcc].some(field =>
                    ["EMAIL-1","EMAIL-2"].some(email => field.includes(email))
                    )
                    ) {
                    var subject = cleanSubject(message[i][j]);
                    if (subject == "DoNotPost") {
                    Logger.log("Email not for posting - " + cleanSubject(message[i][j]));
                    message[i][j].moveToTrash();
                   } else{
                    var from = parseEmailName(message[i][j]);
                    var body = message[i][j].getPlainBody();
                    var hBody = message[i][j].getBody();
                    var attachment = saveAttachments(message[i][j]);
                    var opening = "<br>From: " + from + "<br> Sent: "+ Utilities.formatDate(message[i][j].getDate(), "US/Eastern", "M/d/yy @ h:mm aaa") + "<br><br>" + attachment;
                    if (hBody.indexOf("</body>")>-1) {
                    hBody = removeForwards (hBody);
                    hBody = hBody.replace("</body>",opening + "</body>").trim();
                   } else{
                    hBody = hBody + opening;
                   }
                    Logger.log(subject + opening);
                    //send the message
                    GmailApp.sendEmail("EMAIL-3", subject , opening + body , 
                    {htmlBody: hBody, 
                    name: from
                   })  
    }  // end of processed messages
    //move the message to the trash
    message[i][j].moveToTrash();
  } 
  else {Logger.log("No Messages to forward")}
}
}

}

任何指点不胜感激。

-DH

因此,如果我理解正确的话,您将一遍又一遍地从线程中获取所有消息。

但最终这是预料之中的,因为您将首先获得 GmailThread and then checking every GmailMessage in the thread. Even if you have already checked it up and deleted it is part of the Thread and is normal that you get it back when using getMessagesForThreads()

我建议在每封邮件中使用 isInTrash()(在 for 嵌套循环内),以检查您是否已将此邮件移至垃圾箱。

像这样:

function processPMFMail() {
    var threads = GmailApp.getInboxThreads();
    var message = GmailApp.getMessagesForThreads(threads);
    for (var i = 0; i < message.length; i++) {
        for (var j = 0; j < message[i].length; j++) {
            if (!message[i][j].isInTrash()) {
                var from = message[i][j].getFrom();
                var to = message[i][j].getTo();
                var cc = message[i][j].getCc();
                var bcc = message[i][j].getBcc();
                var from = message[i][j].getFrom();
                var fields = { to, cc, bcc };
                //Logger.log(to);

                if (
                    [to, cc, bcc].some(field =>
                        ["EMAIL-1", "EMAIL-2"].some(email => field.includes(email))
                    )
                ) {
                    var subject = cleanSubject(message[i][j]);
                    if (subject == "DoNotPost") {
                        Logger.log("Email not for posting - " + cleanSubject(message[i][j]));
                        message[i][j].moveToTrash();
                    } else {
                        var from = parseEmailName(message[i][j]);
                        var body = message[i][j].getPlainBody();
                        var hBody = message[i][j].getBody();
                        var attachment = saveAttachments(message[i][j]);
                        var opening = "<br>From: " + from + "<br> Sent: " + Utilities.formatDate(message[i][j].getDate(), "US/Eastern", "M/d/yy @ h:mm aaa") + "<br><br>" + attachment;
                        if (hBody.indexOf("</body>") > -1) {
                            hBody = removeForwards(hBody);
                            hBody = hBody.replace("</body>", opening + "</body>").trim();
                        } else {
                            hBody = hBody + opening;
                        }
                        Logger.log(subject + opening);
                        //send the message
                        GmailApp.sendEmail("EMAIL-3", subject, opening + body,
                            {
                                htmlBody: hBody,
                                name: from
                            })
                    }  // end of processed messages
                    //move the message to the trash
                    message[i][j].moveToTrash();
                }
                else { Logger.log("No Messages to forward") }
            }
        }
    }

}