谷歌应用程序脚本和GmailApp:获取新消息

Ago*_*noX 5 google-apps-script

我正在尝试实现一个简单的google脚本来处理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
   }
}
Run Code Online (Sandbox Code Playgroud)

即:我遍历收件箱中的所有邮件并搜索未读邮件.仅1800条消息就非常慢.
理想情况下,我正在寻找一个触发器,一旦收到每条新消息就会被触发.
如果没有这样的东西,我会尝试利用我看到的:

GmailApp.getMessageById(id)
Run Code Online (Sandbox Code Playgroud)

小智 10

对于迟到的回复感到抱歉,但我遇到了同样类型的问题,最后我使用了GmailApp.search()...希望这会有所帮助.

// find unread messages
var threads = GmailApp.search('is:unread');
....
Run Code Online (Sandbox Code Playgroud)

警告

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

看看GmailApp.search(查询)GmailApp.search(查询,开始,最大)


Tar*_*ras 8

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

设置过滤规则,为所有传入消息分配一个特殊标签"ToBeProcessedByScript"作为示例.由于通配符在Gmail过滤器中不起作用,请使用to:字段.

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

  • 这种方法有一个小问题:标签附加到线程,而不是消息.这意味着当消息进入收件箱并添加到已经处理的现有线程时,标签将重新应用于线程,您的方法将再次处理线程中的每条消息.这可以通过识别哪些消息不进行重新处理来避免:**快速和脏:**为消息加注星标并且仅处理未加星标的消息**缓慢而彻底:**在某处记录消息ID并在/之前/之后检查重复项处理 (3认同)