2016-04-21 47 views
2

我正在尝试测试我正在处理的脚本。脚本没问题,手动触发时它会成功执行。当我添加每分钟间隔的时间驱动脚本时,脚本开始在几个小时后抛出异常。时间驱动的邮件转发触发器

例外:服务调用次数过多一天:Gmail的

我检查电子邮件的每日配额,发现我仍然有邮件配额留下

var quota = MailApp.getRemainingDailyQuota(); 
Logger.log(quota); 

而且我能够收到try catch电子邮件,但邮件未被转发。

这是因为与触发器关联的执行时间配额吗?下面是代码

function MailForward() { 

    try{ 
    var glabel = createLabel_("Mail-Forwarded"); 
    var rtm_email = '[email protected]'; 
    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(/^.+<([^>]+)>$/, "$1") +"'>"+'<br>'+ 'Date: '+date+'<br>'+ 'Subject: ' +subject+'<br>'+ 
         'To: ' +to+ "<'" + to.replace(/^.+<([^>]+)>$/, "$1") +"'>"+'<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("[email protected]", "Exception found in Sript", e); 
     Logger.log(e); 

    } 
} 

回答

1
  1. 您使用MailApp.getRemainingDailyQuota();GmailApp检查配额。这是两种不同的服务。

  2. quota method仅返回“用户可以在一天剩余时间内发送的剩余电子邮件数量”。但是您所触及的限制是您调用该服务的次数,无论出于何种目的。

您使用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调用。

+0

谢谢,它的工作,但很少电子邮件不转发,我得到以下例外附件内容不被识别为字符串或二进制。任何建议将不胜感激 – user3223016