查询Gmail服务配额:调用超限及API调用归类咨询
问题描述
- 触发错误:
Service invoked too many times for one day: gmail - 脚本背景:原脚本每分钟扫描垃圾邮件文件夹,现已调整为每10分钟执行一次,且每次最多处理10封邮件
- 脚本功能:邮件正文/主题匹配关键词、或包含附件时,永久删除该邮件
- 核心疑问:使用消费者版Gmail,
msg.getPlainBody().match、msg.getSubject().match、msg.getAttachments().length是否属于Google配额表中「Email read/write (excluding send)」的范畴?
编辑补充:触发超限的原代码(已修改为每次最多扫描10封垃圾邮件)
var threads = GmailApp.search("in:spam"); for (var i = 0; i < threads.length; i++) { var msg = threads[i].getMessages()[0]; if (msg.getPlainBody().match(/car|truck|(you won)/gi) !== null) { console.log('Msg Delete') console.log(i) Gmail.Users.Messages.remove('me', msg.getId()) continue; } if (msg.getSubject().match(/car|truck|(you won)/gi) !== null) { console.log('Sbj Delete') console.log(i) Gmail.Users.Messages.remove('me', msg.getId()) continue; } if (msg.getAttachments().length > 0) { console.log('Attachment Delete') console.log(i) Gmail.Users.Messages.remove('me', msg.getId()) continue; } }
解答
配额范畴判定
这三个操作均属于「Email read/write (excluding send)」的配额范畴:msg.getPlainBody()、msg.getSubject()是读取邮件内容/主题的操作,属于邮件读调用,会计入该配额msg.getAttachments()是获取邮件附件列表的操作,本质也是读取邮件属性的读调用,同样计入该配额
原代码超限原因分析
消费者版Gmail的「Email read/write (excluding send)」每日配额为1000次。原脚本每分钟执行一次,每次循环中:GmailApp.search是1次读调用- 每处理1封邮件,会触发
getMessages()、getPlainBody()、getSubject()、getAttachments()多次读调用,再加上Gmail.Users.Messages.remove的写调用,单轮执行的配额消耗就很高,短时间内累计极易触发上限
优化建议
- 合并判断条件:将三个删除条件合并为一个
if语句,避免重复执行读调用,减少配额消耗if (msg.getPlainBody().match(/car|truck|(you won)/gi) !== null || msg.getSubject().match(/car|truck|(you won)/gi) !== null || msg.getAttachments().length > 0) { console.log('Delete') console.log(i) Gmail.Users.Messages.remove('me', msg.getId()) } - 批量删除:收集所有需要删除的邮件ID,一次性调用删除接口,减少写调用次数
- 限制扫描数量:在
search时直接限制结果数量,比如GmailApp.search("in:spam", 0, 10),避免处理过多邮件
- 合并判断条件:将三个删除条件合并为一个
内容的提问来源于stack exchange,提问作者crjunk
相关产品推荐
相关产品推荐

