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



我一直在用RSS2Email把Gmail变成Google Reader。

我想创建一个Google Apps脚本来做这件事,以获得两个优势:

  1. 调度将由Google Apps Script处理。(不需要专门的电脑来运行脚本)

  2. 生成的电子邮件将被标记为 per-feed,很好地组织事情。

使用Google Apps Script将是相同的实现精神,例如Gmail贪睡。


我知道如何获取提要。我卡住的地方是如何使用特定的标签创建电子邮件。到目前为止我研究过的方法:

  1. Gmail服务的谷歌应用程序脚本不允许这样,至少不明显。
    • GmailApp.sendEmail不允许指定标签。这是有道理的,因为这是一般的电子邮件发送。但是…
    • GmailApp.sendEmail返回GmailApp,而不是您可以用来标识消息并稍后更改其标签的东西。
    • 该服务似乎也不允许你以编程方式创建Gmail过滤器,排除了另一种可能的解决方法。
  2. Gmail的迁移API将是完美的做到这一点,但它不能正常工作,消费者Gmail帐户。嗨。
  3. Google的IMAP扩展可能允许这个,但我不清楚。

我想我可以使用1,在Subject中放置一些UID,我可以用它来查找所传递的消息,并添加标签(并希望通过删除UID来使Subject不难看)。但这似乎有点笨拙。

使用3,IMAP扩展,看起来可能不那么笨拙,尽管可能需要更多的编码和测试工作。

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

Google Apps Script GmailApp API没有提供在发送消息时添加标签的方法,而您可以从UI 执行此操作。这在问题跟踪器中显示为问题1859,请访问并标记以获取更新。

一个解决方法是利用线程api。如果消息被盲目复制(密件抄送)给发送者,它也会作为新消息出现在他们的收件箱中,在那里我们可以使用getInboxThreads()找到它。给这个线程添加标签,并选择将其标记为已读,然后存档。

代码也可作为要点。

/**
 * 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);
}

是的,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

这将是方便的GmailApp.sendEmail()返回一个GmailMessage对象,所以我们可以得到它的id,然后分配一个标签。它没有,但你可以使用这个解决方案:

  1. 使用GmailApp.createDraft()创建消息为草稿

  2. 使用GmailDraft.send()发送草稿消息。方法返回一个GmailMessage对象。

  3. 分配标签(要么用GmailMessage.getThread().addLabel()将其分配给整个线程,要么如果你想将其分配给单个消息,你必须使用这里描述的高级Gmail服务)

相关内容

  • 没有找到相关文章

最新更新