用于邮件转发的时间驱动触发器
Time-Driven trigger for mail forwarding
我正在尝试测试我正在处理的脚本。脚本很好,当我手动触发它时它执行成功。当我添加每分钟间隔的时间驱动脚本时,脚本会在几个小时后开始抛出异常。
Exception: Service invoked too many times for one day: gmail
我查看了邮件的每日配额,发现我还有剩余的邮件配额
var quota = MailApp.getRemainingDailyQuota();
Logger.log(quota);
我也能收到 try catch 邮件,但邮件没有被转发。
这是因为与触发器关联的执行时间配额吗?下面是代码
function MailForward() {
try{
var glabel = createLabel_("Mail-Forwarded");
var rtm_email = 'abc@abc.com';
var from_email = Session.getActiveUser().getEmail();
var threads = GmailApp.search('in:inbox is:unread newer_than:1d');
var mForward = 0;
for (var i=0;i<threads.length;i++) {
var messages=threads[i].getMessages();
for (var m = 0; m < messages.length; m++){
if (messages[m].isUnread()){
mForward = 0;
var mlabels = threads[i].getLabels();
for (var j = 0; j < mlabels.length; j++) {
Logger.log(mlabels[j].getName());
if (mlabels[j].getName() === "Mail-Forwarded") {
mForward = 1;
}
}
if (mForward===0) {
// Logger.log(messages.length)
// Logger.log(messages[m].getFrom());
var from = messages[m].getFrom();
//Logger.log(messages[m].getDate());
var date = messages[m].getDate();
// Logger.log(messages[m].getSubject());
var subject = messages[m].getSubject();
// Logger.log(messages[m].getTo());
var to = messages[m].getTo();
var body = messages[m].getBody();
var attachment = messages[m].getAttachments();
var emailoptions = ("---------- Forwarded message ----------" +'<br>'+'From: '+from+ "<'" + from.replace(/^.+<([^>]+)>$/, "") +"'>"+'<br>'+ 'Date: '+date+'<br>'+ 'Subject: ' +subject+'<br>'+
'To: ' +to+ "<'" + to.replace(/^.+<([^>]+)>$/, "") +"'>"+'<br>'+'<br>'+'<br>');
messages[m].forward(rtm_email,{htmlBody: emailoptions + body , Attachment: attachment});
glabel.addToThread(threads[i]);
Logger.log(glabel.getName());
messages[m].markRead();
mForward = 1;
}
}
}
}
} catch(e) {
MailApp.sendEmail("abc@abc.com", "Exception found in Sript", e );
Logger.log(e);
}
}
您使用 MailApp.getRemainingDailyQuota();
而不是 GmailApp
检查配额。这是两种不同的服务。
仅 quota method returns "the number of remaining emails a user can send for the rest of the day." 但您达到的限制是您调用该服务的次数,无论出于何种目的。
您经常使用 GmailApp
来访问现有消息,而不是发送新消息。特别是,从今天开始,您将检查每个线程中的每条消息,并且每分钟检查一次。这是很多 API 次调用:getMessages
、isUnread
等
减少 API 调用次数的一种方法是进行更有针对性的搜索。 after:
搜索参数接受 Unix 时间戳,这使得执行以下操作成为可能:
function doSomethingWithNewEmail() {
var interval = 5; // if the script runs every 5 minutes; change to 1 if it runs every minute
var date = new Date();
var timeFrom = Math.floor(date.valueOf()/1000) - 60 * interval;
var threads = GmailApp.search('is:inbox after:' + timeFrom);
for (var i = 0; i < threads.length; i++) {
// do something
}
}
我以 5 分钟的间隔成功地使用了上述方法。它也可以在 1 分钟内工作,因为大多数时间 search
将是脚本进行的唯一 API 调用。
我正在尝试测试我正在处理的脚本。脚本很好,当我手动触发它时它执行成功。当我添加每分钟间隔的时间驱动脚本时,脚本会在几个小时后开始抛出异常。
Exception: Service invoked too many times for one day: gmail
我查看了邮件的每日配额,发现我还有剩余的邮件配额
var quota = MailApp.getRemainingDailyQuota();
Logger.log(quota);
我也能收到 try catch 邮件,但邮件没有被转发。
这是因为与触发器关联的执行时间配额吗?下面是代码
function MailForward() {
try{
var glabel = createLabel_("Mail-Forwarded");
var rtm_email = 'abc@abc.com';
var from_email = Session.getActiveUser().getEmail();
var threads = GmailApp.search('in:inbox is:unread newer_than:1d');
var mForward = 0;
for (var i=0;i<threads.length;i++) {
var messages=threads[i].getMessages();
for (var m = 0; m < messages.length; m++){
if (messages[m].isUnread()){
mForward = 0;
var mlabels = threads[i].getLabels();
for (var j = 0; j < mlabels.length; j++) {
Logger.log(mlabels[j].getName());
if (mlabels[j].getName() === "Mail-Forwarded") {
mForward = 1;
}
}
if (mForward===0) {
// Logger.log(messages.length)
// Logger.log(messages[m].getFrom());
var from = messages[m].getFrom();
//Logger.log(messages[m].getDate());
var date = messages[m].getDate();
// Logger.log(messages[m].getSubject());
var subject = messages[m].getSubject();
// Logger.log(messages[m].getTo());
var to = messages[m].getTo();
var body = messages[m].getBody();
var attachment = messages[m].getAttachments();
var emailoptions = ("---------- Forwarded message ----------" +'<br>'+'From: '+from+ "<'" + from.replace(/^.+<([^>]+)>$/, "") +"'>"+'<br>'+ 'Date: '+date+'<br>'+ 'Subject: ' +subject+'<br>'+
'To: ' +to+ "<'" + to.replace(/^.+<([^>]+)>$/, "") +"'>"+'<br>'+'<br>'+'<br>');
messages[m].forward(rtm_email,{htmlBody: emailoptions + body , Attachment: attachment});
glabel.addToThread(threads[i]);
Logger.log(glabel.getName());
messages[m].markRead();
mForward = 1;
}
}
}
}
} catch(e) {
MailApp.sendEmail("abc@abc.com", "Exception found in Sript", e );
Logger.log(e);
}
}
您使用
MailApp.getRemainingDailyQuota();
而不是GmailApp
检查配额。这是两种不同的服务。仅 quota method returns "the number of remaining emails a user can send for the rest of the day." 但您达到的限制是您调用该服务的次数,无论出于何种目的。
您经常使用 GmailApp
来访问现有消息,而不是发送新消息。特别是,从今天开始,您将检查每个线程中的每条消息,并且每分钟检查一次。这是很多 API 次调用:getMessages
、isUnread
等
减少 API 调用次数的一种方法是进行更有针对性的搜索。 after:
搜索参数接受 Unix 时间戳,这使得执行以下操作成为可能:
function doSomethingWithNewEmail() {
var interval = 5; // if the script runs every 5 minutes; change to 1 if it runs every minute
var date = new Date();
var timeFrom = Math.floor(date.valueOf()/1000) - 60 * interval;
var threads = GmailApp.search('is:inbox after:' + timeFrom);
for (var i = 0; i < threads.length; i++) {
// do something
}
}
我以 5 分钟的间隔成功地使用了上述方法。它也可以在 1 分钟内工作,因为大多数时间 search
将是脚本进行的唯一 API 调用。