在Google脚本中按日期拆分Gmail线程和标签

时间:2018-07-18 22:08:33

标签: google-apps-script gmail

嗨,

我有一台服务器,每天向我发送几封日志邮件,并且我想自动为这些邮件加上标签。 我无法修改服务器配置以适应邮件主题,因此工作必须由“接收者”完成。

主题仍然是相同的,因此gmail将它们合并为100个线程,但我想按日期对它们进行拆分。所以一个日期,一个线程。另外,我想给它们加上嵌套标签:“ Server1”->“ Date”

我只找到了一种在全局性上向线程添加标签的方法,而没有办法对它们进行拆分。

有可能吗?

重新审视我的问题后,也许在消息主题中添加日期可能会拆分线程。

赞:

function AddLogSubjectADate() {
   var threads = GmailApp.search('from:sender@server.com has:nouserlabels');
   threads.forEach(function(messages){
      messages.getMessages().forEach(function(msg){
      var date = msg.getDate();
      var date_of_mail = Utilities.formatDate(date, "GMT+1", "yyyy/MM/dd")
      var subj = msg.getSubject()
      var newsubj = subj + date_of_mail
      //A way to modify subject
      });
   });
}

但是我没有找到改变主题的方法。

  

后圣经》

我认为这无关紧要,但这是我以前的工作。但是它将标签添加到线程中。就像我说的那样,我还没有找到拆分线程的方法。

function AddLogLabelbyDate() {
   var today = new Date();
   var tomorrow = new Date();
   var yesterday = new Date();
   tomorrow.setDate(today.getDate()+1);
   yesterday.setDate(today.getDate()-1);
   var date_today = Utilities.formatDate(today, "GMT+1", "yyyy/MM/dd")
   var date_tomorrow = Utilities.formatDate(tomorrow, "GMT+1", "yyyy/MM/dd")
   var date_yesterday = Utilities.formatDate(yesterday, "GMT+1", "yyyy/MM/dd")
   var threads = GmailApp.search('from:sender@server.com has:nouserlabels before:'+ date_tomorrow +' after:'+ date_yesterday +'');
   label.addToThreads(threads);
}

1 个答案:

答案 0 :(得分:1)

Per the API documentation,Gmail遵循一些有关线程分组的规则:

  

要成为主题的一部分,消息或草稿必须满足以下条件:
1。必须在您提供的threadIdMessage上指定所请求的Draft.Message
2。必须按照RFC 2822标准设置ReferencesIn-Reply-To标头。
3。 Subject标头必须匹配。

因此,您可以通过修改这三个参数中的任何一个来防止自动分组到给定的会话线程中。

或者,您可以应用每个消息的对话标签,尽管如果您使用"Conversation View" UI并不能真正帮助您。

这两种方法都需要使用Gmail REST API,而Apps脚本为此提供了"advanced service" client library。原生GmailApp没有提供用于按消息线程更改或以所需方式处理消息的方法。

线程分离

如果您想禁用会话分组,从理论上讲,您可以这样做:

  1. Message#get获取完整的邮件表示形式
  2. 修改Gmail用于执行线程分组的属性之一
  3. Message#insertimport在服务器上创建新消息
  4. Message#delete删除原始文件
  5. Message#get,以在Gmail给其threadId后获得插入的邮件元数据。
  6. 获取应该共享该新threadId的其余消息,进行适当的修改,然后insert
  7. 重复。

我没有测试过这种方法,因此我的“理论上”评论。

每条消息标签

相关的API方法包括Gmail.User.Labels.listGmail.User.Messages.listGmail.User.Messages.modifyGmail.User.Messages.batchModify。您可能要使用listmessages.batchModify方法,因为您似乎有大量要更改的消息。请注意,这里有non-trivial rate limits,因此小批量工作可能会最节省资源。

这可能是最简单的实现方法,因为您不必实际创建或删除邮件-只需搜索应具有给定标签的邮件,然后将其添加(或创建并添加)即可,删除所有不希望的标签。首先,这里有一些最小的示例,这些示例显示了如何使用Gmail REST API。我希望您在使用此信息来构建实际脚本时需要参考API文档。

示例Labels#list

function getLabelsWithName(labelName) {
  const search = Gmail.Users.Labels.list("me");
  if (!search.labels || !search.labels.length)
    return [];

  const matches = search.labels.filter(function (label) {
    // Return true to include the label, false to omit it.
    return label.name === labelName;
  });
  return matches;
}

示例Messages#list

function getPartialMessagesWithLabel(labelResource) {
  const options = {
    labelIds: [ labelResource.id ],
    fields: "nextPageToken,messages(id,threadId,labelIds,internalDate)"
  };
  const results = [];

  // Messages#list is paginated, so we must page through them to obtain all results.
  do {
    var search = Gmail.Users.Messages.list("me", options);
    options.pageToken = search.nextPageToken;
    if (search.messages && search.messages.length)
      Array.prototype.push.apply(results, search.messages);
  } while (options.pageToken);

  return results;
}

示例Messages#batchModify

function batchAddLabels(messageArray, labels) {
  if (!messageArray || !messageArray.length || !messageArray[0].id)
    throw new Error("Missing array of messages to update");
  if (!labels || !labels.length || !labels[0].id)
    throw new Error("Missing array of label resources to add to the given messages");
  const requestMetaData = {
    "addLabelIds": labels.map(function (label) { return label.id; }),
    "ids": messageArray.map(function (msg) { return msg.id; }) // max 1000 per request!
  };

  Gmail.Users.Messages.batchModify(requestMetaData, "me");
}

其他资源: