【问题标题】:Time-Driven trigger for mail forwarding邮件转发的时间驱动触发器
【发布时间】:2016-04-21 06:38:19
【问题描述】:

我正在尝试测试我正在处理的脚本。脚本很好,当我手动触发它时它成功执行。当我添加每分钟间隔的时间驱动脚本时,脚本在几小时后开始抛出异常。

例外:一天内服务调用次数过多: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(/^.+<([^>]+)>$/, "$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("abc@abc.com", "Exception found in Sript", e );
      Logger.log(e);

  }
}

【问题讨论】:

    标签: google-apps-script gmail


    【解决方案1】:
    1. 您使用 MailApp.getRemainingDailyQuota(); 而不是 GmailApp 检查配额。这是两种不同的服务。

    2. quota method 仅返回“用户在一天剩余时间内可以发送的剩余电子邮件数量”。但是您要达到的限制是您出于任何目的调用服务的次数。

    您经常使用GmailApp 来访问现有消息,而不是发送新消息。特别是,您从今天开始检查每个线程中的每条消息,并且每分钟都检查一次。这是很多 API 调用:getMessagesisUnread 等。

    减少 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 调用。

    【讨论】:

    • 谢谢,它有效,但很少有电子邮件没有转发,我收到以下异常附件内容不被识别为字符串或二进制。任何建议将不胜感激
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-18
    • 1970-01-01
    相关资源
    最近更新 更多