【问题标题】:Google gmail script that triggers on incoming email收到电子邮件时触发的 Google gmail 脚本
【发布时间】:2018-10-06 13:27:33
【问题描述】:

我一直在阅读gmail addons。当您打开电子邮件时,它们会触发上下文触发器。

当我收到电子邮件时,是否可以触发服务?我能找到的最好的是unconditional,但这只会在打开电子邮件时触发。

【问题讨论】:

标签: google-apps-script gmail gmail-addons


【解决方案1】:

您无法为每封电子邮件创建触发器,但您可以执行类似as described in this answer 的操作。

例如,您可以:

  1. 设置一个过滤器,在您要处理的传入电子邮件上放置一个特殊标签。

  2. 设置每 10 分钟甚至每分钟运行一次的重复脚本。在脚本中,您可以提取所有具有给定标签的电子邮件,并相应地处理它们,完成后删除标签。

function processEmails() {
  var label = GmailApp.getUserLabelByName("Need To Process");
  var threads = label.getThreads();  
  for (var i = threads.length - 1; i >= 0; i--) {
    //Process them in the order received
    threads[i].removeLabel(label).refresh();
  }
}

然后,您可以在 time based trigger 上设置它,让它尽可能频繁地运行。

如果您想跟踪已处理的电子邮件,可以创建另一个“已处理”标签,并在处理完成后将其添加到邮件中。

【讨论】:

  • 那么,要么我执行一分钟的基于时间的触发器,要么......还有其他选择吗?是否有一个 gmail api,我可以为它编写自己的应用程序(尽管这开始听起来像一个邮件客户端)。我在想应用程序“Unroll.me”,想知道他们在做什么。
  • 是的,您可以使用Gmail API。但是,似乎没有任何订阅或回调可用,因此您仍然需要设置某种重复出现的脚本或 cron 作业来访问 API 并查看您是否经常收到新消息。跨度>
  • @user3312395 看来我们不能在 Gmail 插件中使用基于时间的触发器。我在自己的 Google Apps 脚本(为我自己)中使用它们,但有没有办法向客户分发使用基于时间的触发器的 Google Apps 脚本?
  • @Basj 你可以让它运行得非常分钟,并且在那个脚本中会执行延迟 250 毫秒的循环,所以你真的运行了 250 毫秒
【解决方案2】:

我在正确获取标签时遇到了一些麻烦,因此我包含了用于记录标签的代码。我修改了 user3312395 的代码也添加了新标签。 也感谢您的原始答案!

function emailTrigger() {

  var label = GmailApp.getUserLabelByName('Name of Label to Process');
  var newLabel = GmailApp.getUserLabelByName('New Label Name');

  if(label != null){
    var threads = label.getThreads();
    for (var i=0; i<threads.length; i++) {
      //Process them in the order received
      threads[i].removeLabel(label);
      threads[i].addLabel(newLabel);
      //run whatever else here
    }
  }

}

function getLabels(){
  var labels = GmailApp.getUserLabels();
  for(i=0; i<labels.length; i++){
    Logger.log(labels[i].getName());
  }
}

【讨论】:

  • 我看到以下错误:Exception: Invalid argument: label emailTrigger @ Code.gs:11 单击时会将光标带到“addLabel”中的“a”。这是预期的结果,还是代码在 2 年内发生变化?
  • Ahhhhhhh ...第二个标签名称变量中有一个错误的空格。对不起!
【解决方案3】:

实际上,他们有一些复杂的发布/订阅服务,需要设置 OAuth 身份验证。使用此服务,您必须能够获得推送通知。但我也认为将触发器设置为每 10 分钟甚至 1 分钟运行一次更容易。

【讨论】:

    【解决方案4】:

    是的,您可以为每封新电子邮件触发一个函数!

    只需使用搜索查询newer_than:1h。例如,让您的触发器每 10 分钟运行一次。然后您将基本上为每封新电子邮件运行逻辑(最多延迟 10 分钟,这可能没问题)。

    var TRIGGER_NAME = 'handleNewEmails'
    
    // Maximum number of threads to process per run.
    var PAGE_SIZE = 150
    
    var INTERVAL = 10
    
    function Install() {
        // First run 2 mins after install
        ScriptApp.newTrigger(TRIGGER_NAME)
            .timeBased()
            .at(new Date(new Date().getTime() + 1000 * 60 * 2))
            .create()
    
        // Run every 10 minutes there after
        ScriptApp.newTrigger(TRIGGER_NAME)
            .timeBased().everyMinutes(INTERVAL).create()
    }
    
    function Uninstall() {
        var triggers = ScriptApp.getProjectTriggers()
        for (var i = 0; i < triggers.length; i++) {
            if (triggers[i].getHandlerFunction() === TRIGGER_NAME) ScriptApp.deleteTrigger(triggers[i])
        }
    }
    
    function handleNewEmails() {
        var threads = GmailApp.search("newer_than:1h", 0, PAGE_SIZE)
        for (var i = 0; i < threads.length; i++) {
            var thread = threads[i]
    
            // Do something with the thread.
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2010-10-10
      • 2010-09-23
      • 1970-01-01
      • 2018-02-05
      相关资源
      最近更新 更多