如何创建一个带有特定标签的Gmail邮件?

3
我一直在使用RSS2Email将Gmail变成Google Reader
我想创建一个Google Apps Script来代替它,以获得两个优势:
  1. 调度将由Google Apps Script处理。(无需专用计算机运行脚本。)

  2. 生成的电子邮件将被标记为每个源的订阅,使事情井然有序。

使用Google Apps Script与Gmail Snooze等实现方式相同。
我知道如何获取订阅源。但是我卡在了如何使用特定标签创建电子邮件上。到目前为止,我调查过的方法有:
  1. Gmail Service for Google Apps Scripts不允许这样做,至少不明显。
    • GmailApp.sendEmail不允许您指定标签。这是有道理的,因为它用于通用电子邮件发送。但是......
    • GmailApp.sendEmail返回GmailApp,而不是您可以用来标识消息并稍后更改其标签的东西。
    • 该服务还似乎不允许您以编程方式创建Gmail过滤器,排除了另一种可能的解决方法。
  2. Gmail Migration API非常适合做这个——但它不适用于普通的消费者Gmail帐户。呃。
  3. Google的IMAP扩展可能允许此操作,但对我来说还不清楚。
我想我可以使用1,将一些UID放入主题中,以便我可以使用它来查找已发送的消息,添加标签(并希望通过删除UID使主题更加美观)。但是这似乎有点笨拙。
使用3,IMAP扩展,可能看起来不那么笨拙,尽管编写和测试工作可能更多。
在这些选项中有任何建议吗?还有其他API或策略吗?

我也考虑过在主题中使用UID技巧。并且我同意:很丑陋。只有在最后的情况下才能使用。 - offby1
除了难看之外,我还担心在调用GmailApp.sendEmail后的延迟和在邮箱中查找邮件的可用性。 - Greg Hendershott
我越想越觉得IMAP是正确的选择。只是在Google Apps Script环境中,它比我希望的更“沉重”。 - Greg Hendershott
顺便说一句,我非常好奇你会想出什么。 - offby1
@offby1 我在 Racket 中有一个原型正在运行。因为我可以在 Racket 中进行 IMAP。似乎在 Google Apps Script 环境中根本不可能实现。因此,看起来我不能使用 Google Apps Script 运行此过程。 - Greg Hendershott
@offby1 我采用了Racket的方法:http://www.greghendershott.com/2013/05/feeds2gmail.html - Greg Hendershott
3个回答

5
Google Apps Script GmailApp API没有提供一种在发送邮件时添加标签的方法,这是从UI中可以做到的。这在问题跟踪器中显示为Issue 1859,请访问并收藏以获取更新。
解决方法是利用线程API。如果将邮件抄送(bcc'd)给发件人,则它也会出现在其收件箱中作为新邮件,我们可以使用getInboxThreads()找到它。将标签添加到此线程,并可选地将其标记为已读后归档。 代码也作为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

同意。不幸的是,我不知道如何在Google Apps Script环境中与IMAP通信。据我所知,不仅没有任何IMAP服务,也没有TCP服务供我进行低级别的操作。UrlFetchApp是最通用的,但仅适用于HTTP。 - Greg Hendershott
您可以使用标准的IMAP协议来操作您的Gmail,以及GMail IMAP扩展。IMAP协议不依赖于HTTP,演示代码如下:imapClient.ConnectSsl("imap.gmail.com", 993); IMAP的棘手部分是XOAUTH身份验证。 - skyfree
所以,忘记使用HTTP RESTful API服务(这是大多数Google API使用的服务),并转向IMAP:http://tools.ietf.org/html/rfc3501。访问邮箱不需要任何HTTP服务,这就是为什么你找不到Gmail API的原因,因为它根本不必要! - skyfree
谷歌搜索“IMAP客户端源代码”或搜索与IMAP邮件客户端相关的开源项目,您将找到所需的一切。 - skyfree
谢谢您的评论,但是:我知道如何通常情况下使用IMAP。但是我不知道如何在Google Apps脚本环境中这样做。我没有看到任何高级IMAP服务,也没有看到任何低级别的TCP连接能力,可以在其中自己构建 -- 同样是在Google Apps脚本环境中。 - Greg Hendershott
显示剩余3条评论

0

GmailApp.sendEmail() 返回一个 GmailMessage 对象会更方便,这样我们就可以获取它的 id 并分配一个标签。但它不支持,但是您可以使用以下解决方法:

  1. 使用 GmailApp.createDraft() 将邮件保存为草稿。

  2. 使用 GmailDraft.send() 发送草稿邮件。此方法确实返回一个 GmailMessage 对象。

  3. 分配标签 (您可以使用 GmailMessage.getThread().addLabel() 为整个线程分配标签,或者如果要将其分配给单个消息,则必须使用高级 Gmail 服务 如此描述)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接