我遇到了 gmail 的各种速率限制,我不确定我能做些什么来解决它们。我想要完成的是在 gmail 中搜索任何带有某些“过期”标签的消息(以分钟为单位的不同时间)。我的意图是让邮件规则将这些标签应用于在一定时间后变得无关紧要的邮件。我希望这些邮件保留在我的收件箱中,直到它们过期,然后自动存档。我基于我在http://googleappsdeveloper.blogspot.com/2011/07/gmail-snooze-with-apps-script.html看到的一篇文章的一般技术
我在每五分钟运行一次“过期”功能的触发器上有这个。
因此,它每五分钟调用 10 次 GmailApp.getUserLabelByName 和 1 次 getThreads()。然后根据它找到多少匹配线程,对于每个线程:
1 x getFirstMessageSubject 1 x getLastMessageDate 1 x addLabel 1 x moveToArchive 1 x removeLabel
每个线程 5 次调用。
所以,我想,我每天要打 10 个电话/5 分钟,或者 2880 个电话,只是为了寻找消息。然后,假设我在一天中发现 1,000 条消息,另外还有 5,000 个电话。加起来就是 7,880 个电话,这在我认为的配额限制之下,但我有点不清楚。根据配额限制下的https://docs.google.com/a/macros/latinschool.org/dashboard,对于像我这样的 Google Apps for Edu 帐户,我应该能够读取 10,000 个 GMail 和每天 10,000 个 GMail 写操作。我认为我所有的电话都属于这两者之一。
我可以减少我正在使用的标签/次数的数量,而不是获取主题(我正在使用它进行调试),但除此之外,我不确定如何使这个脚本更有效率。而且我完全不清楚我是如何达到配额的(见上面的数学)。
这是我的代码:
/**
* Expire mail after set time by archiving based on labels
* based on http://googleappsdeveloper.blogspot.com/2011/07/gmail-snooze-with-apps-script.html
* For more information on interacting with GMail labels, see
* https://developers.google.com/apps-script/class_gmaillabel
*/
var expiretimes = [5,15,30,60,120,180,240,480,720]; // times in minutes to expire messages
function getLabelName(i) {
return "expire/expire " + i;
}
function setup() {
// Create the labels we’ll need for expiring
GmailApp.createLabel("expire");
for (var expt = 0; expt < expiretimes.length; expt++) {
GmailApp.createLabel(getLabelName(expt));
}
GmailApp.createLabel("expired");
}
function expiremsgs(expiremin) {
// get current date
var nowdate = new Date();
Logger.log(nowdate);
// get the label for given name
var label = GmailApp.getUserLabelByName(getLabelName(expiremin));
var expiredlabel = GmailApp.getUserLabelByName("expired");
var threads = label.getThreads();
Utilities.sleep(1000);
for (var i = 0; i < threads.length; i++) {
Logger.log("i: " + i);
Logger.log(threads[i].getFirstMessageSubject());
var lastmsgdate = threads[i].getLastMessageDate();
Logger.log(lastmsgdate);
var minold = (nowdate-lastmsgdate)/60000; // convert from ms to minutes
Logger.log(minold);
if (minold > expiremin) {
threads[i].addLabel(expiredlabel);
threads[i].moveToArchive();
threads[i].removeLabel(label);
Logger.log("Archived");
}
Utilities.sleep(1500);
}
};
function expire() {
for (var expt = 0; expt < expiretimes.length; expt++) {
expiremsgs(expt);
}
}