如何创建具有特定标签的Gmail邮件?

时间:2013-04-22 14:40:35

标签: google-apps-script gmail google-api gmail-imap google-reader

我一直在使用RSS2Email to turn Gmail into Google Reader

我想创建一个Google Apps脚本,以获得两个优势:

  1. 计划将由Google Apps脚本处理。 (无需专用计算机来运行脚本。)

  2. 生成的电子邮件将标记为每个Feed ,很好地组织内容。

  3. 使用Google Apps脚本与实施精神相同Gmail Snooze


    我了解如何获取Feed。我遇到的问题是如何使用特定标签创建电子邮件。到目前为止我调查过的方法:

    1. Gmail Service for Google Apps Scripts不允许这样做,至少不是很明显。
      • GmailApp.sendEmail不允许您指定标签。这是有道理的,因为这是通用电子邮件发送。但是......
      • GmailApp.sendEmail会返回GmailApp,而不是您可以用来识别邮件并稍后更改其标签的内容。
      • 该服务似乎也不允许您以编程方式创建Gmail过滤器,排除了解决此问题的另一种方法。
    2. Gmail Migration API最适合这样做 - 但它不适用于普通的消费者Gmail帐户。尔加。
    3. 谷歌的IMAP extensions可能允许这样做,但我不清楚。
    4. 我想我可以使用1,在主题中添加一些UID,我可以使用它查找传递的消息,添加标签(并希望通过删除UID来解除主题)。但这似乎有些愚蠢。

      使用3,IMAP扩展,似乎可能不那么重要了,尽管可能需要更多的代码和测试工作。

      其中有什么建议吗?是否有其他API或策略?

3 个答案:

答案 0 :(得分:4)

Google Apps脚本GmailAppApp API无法在您发送消息时为消息添加标签,而可以从UI进行操作。这在问题跟踪器中显示为Issue 1859,访问并将其标记为更新。

解决方法是利用线程apis。如果邮件被盲目复制(密件抄送)给发件人,它也会在收件箱中显示为新邮件,我们可以使用getInboxThreads()来查找邮件。将标签添加到此线程,并可选择将其标记为read,然后将其存档。

代码available as a gist

/**
 * An alternative to GmailApp.sendEmail(), which applies a
 * label to the message thread in the sender's account.
 *
 * Sends an email message with optional arguments. The email can
 * contain plain text or an HTML body. The size of the email
 * (including headers, but excluding attachments) may not
 * exceed 20KB.
 *
 * @param {String} recipient    the addresses of the recipient
 * @param {String} subject      the subject line
 * @param {String} body         the body of the email
 * @param {Object} options      a JavaScript object that specifies
 *                              advanced parameters, as documented
 *                              for GmailApp.sendEmail()
 * @param {String} label        the label to be applied
 */
function sendAndLabel(recipient, subject, body, options, label) {
  var sender = Session.getActiveUser().getEmail();

  // Add sender to bcc list
  if (options.bcc) {
    options.bcc = options.bcc.split(',').concat(sender).join(',');
  }
  else {
    options.bcc = sender;
  }

  GmailApp.sendEmail( recipient, subject, body, options )

  // Check if label already exists, create if it doesn't
  var newLabel = GmailApp.getUserLabelByName(label);
  if (!newLabel) newLabel = GmailApp.createLabel(label);

  // Look for our new message in inbox threads
  Utilities.sleep(2000); // Wait for message to be received
  var inboxThreads = GmailApp.getInboxThreads();
  for (var t = 0; t < inboxThreads.length; t++) {
    var foundSubject = inboxThreads[t].getFirstMessageSubject();
    var numLabels = inboxThreads[t].getLabels().length;  // Could add more criteria
    if (foundSubject === subject && numLabels === 0) {
      // Found our thread - label it
      inboxThreads[t].addLabel(newLabel)
                     .markRead()
                     .moveToArchive();
      break;
    }
  }
}

使用示例:

function test_sendAndLabel() {
  var recipient = Session.getActiveUser().getEmail();
  var subject = "Test Labelling";
  var body = "This email is testing message labelling.";
//  var options = {bcc:"someone@example.com"};
  var options = {};
  var label = "LabelTest";
  sendAndLabel(recipient, subject, body, options, label);
}

答案 1 :(得分:1)

是的,IMAP是正确的方法。你可以找到一些第三方IMAP库,以方便你的工作。

添加标签的命令是:STORE 123 + X-GM-LABELS(yourLabel)

关于Gmail标签的官方文档:

https://developers.google.com/google-apps/gmail/imap_extensions#access_to_gmail_labels_x-gm-labels

答案 2 :(得分:0)

GmailApp.sendEmail() 返回一个 GmailMessage 对象会很方便,这样我们就可以获取它的 id 然后分配一个标签。没有,但您可以使用此解决方法:

  1. 使用 GmailApp.createDraft()

    将消息创建为草稿
  2. 使用 GmailDraft.send() 发送消息草稿。此方法确实返回一个 GmailMessage 对象。

  3. 分配标签(使用 GmailMessage.getThread().addLabel() 将其分配给整个线程,或者如果您想将其分配给单个邮件,则必须使用高级 Gmail 服务 as described here ).