11

我正在尝试实现一个简单的谷歌脚本来处理 Gmail 用户收到的每条消息。

我找到了一个这样的例子:

var threads = GmailApp.getInboxThreads();
for (var i=0; i < threads.length; i++) {
   var messages = threads[i].getMessages();

   for (var j=0; j < messages.length; j++) {
       if (!messages[j].isUnread()) {
         continue; 
       }
      //process message
   }
}

那就是:我遍历收件箱中的所有消息并搜索未读的消息。这对于仅 1800 条消息来说非常慢。

理想情况下,我正在寻找一旦收到每条新消息就会触发的触发器。

如果没有这样的东西,我会尝试利用我看到的这个:

GmailApp.getMessageById(id)
4

6 回答 6

15

很抱歉回复晚了,但我遇到了同样类型的问题,我最终使用了 GmailApp.search() ...希望这会有所帮助。

// find unread messages
var threads = GmailApp.search('is:unread');
....

警告

当所有线程的大小太大而系统无法处理时,此调用将失败。如果线程大小未知,并且可能非常大,请使用“分页”调用,并指定要在每次调用中检索的线程范围。

看看GmailApp.search(query)GmailApp.search(query, start, max)

于 2014-08-12T20:07:17.500 回答
9

不幸的是,没有为每条收到的消息触发的触发器。但是有一个很好的解决方法:

设置一个过滤规则,为所有传入消息分配一个特殊标签,例如“ToBeProcessedByScript”。由于通配符在 Gmail 过滤器中并不真正起作用,因此请使用 to: 字段。

运行一个时间触发的脚本,该脚本收集所有带有GmailApp.getUserLabelByName("ToBeProcessedByScript").getThreads(). 在处理新消息之前删除特殊标签。

于 2013-06-05T05:24:44.720 回答
4

您可以使用

GmailApp.getInboxThreads(0, 50);

用前 50 封邮件初始化变量。

于 2013-04-18T09:29:05.430 回答
3

我扩展了代码,检查第一条消息是否真的是未读消息。如果不是,它将检查下一条消息并将继续,直到找到未读消息:

function getUnreadMails() {
   var ureadMsgsCount = GmailApp.getInboxUnreadCount();
   var threads;
   var messages;
   var k=1;
   if(ureadMsgsCount>0)
   {        
     threads = GmailApp.getInboxThreads(0, ureadMsgsCount);
     for(var i=0; i<threads.length; i++)
     {
       if(threads[i].isInInbox())
       {
          messages = threads[i].getMessages();
          for(var j=0; j<messages.length; j++)
          {

             while (messages[j].isUnread() === false)
             {
             threads=GmailApp.getInboxThreads(k, ureadMsgsCount);
             messages = threads[i].getMessages();
             k++;
             }
             Logger.log(messages[j].getSubject());

             // process unread message
          }
       }
     }
   }
 }
于 2017-09-21T19:31:24.450 回答
2

您可以像 djtek 提到的那样创建时间触发器,但不是标记所有消息然后检索标记的消息,您可以只获取未读消息的数量,并按照有效的代码检索从 0 到未读消息数量的线程为了我:

 function getUnreadMails() {
   var ureadMsgsCount = GmailApp.getInboxUnreadCount()
   if(ureadMsgsCount>0)
   {        
     var threads = GmailApp.getInboxThreads(0, ureadMsgsCount);
     for(var i=0; i<threads.length; i++)
     {
       if(threads[i].isInInbox())
       {
          var messages = threads[i].getMessages();
          for(var j=0; j<messages.length; j++)
          {
             Logger.log(messages[j].getSubject());
             // process unread message
          }
       }
     }
   }
 }
于 2017-01-23T10:13:12.963 回答
1
function getUnreadMessages(threadLimit) {
  function flatten(arr) { return [].concat.apply([], arr) }
  var threadsWithUnreadMessages = GmailApp.search('is:unread', 0, threadLimit)
  var messageCollection = threadsWithUnreadMessages.map(function(thread) {
    return thread.getMessages()
  })
  var unreadMessages = flatten(messageCollection).filter(function(message) { 
    return message.isUnread()
  })
  return unreadMessages
}

getUnreadMessages(100)
于 2020-02-05T03:32:16.850 回答