【问题标题】:How to create a Gmail message with a specific label?如何创建带有特定标签的 Gmail 邮件?
【发布时间】:2013-04-15 12:28:13
【问题描述】:

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

我想创建一个 Google Apps 脚本来执行此操作,以获得两个优势:

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

  2. 生成的电子邮件将被标记为每个提要,很好地组织事情。

使用 Google Apps 脚本与例如使用 Google Apps 脚本具有相同的实施精神。 Gmail Snooze.


我了解如何获取提要。我陷入困境的是如何使用特定标签创建电子邮件。到目前为止我研究过的方法:

  1. Gmail Service for Google Apps Scripts 不允许这样做,至少不是很明显。
    • GmailApp.sendEmail 不允许您指定标签。这是有道理的,因为这是用于通用电子邮件发送。但是...
    • GmailApp.sendEmail 返回 GmailApp,而不是您可以用来标识消息并稍后更改其标签的东西。
    • 该服务似乎也不允许您以编程方式创建 Gmail 过滤器,因此排除了解决此问题的另一种可能方法。
  2. Gmail Migration API 非常适合执行此操作 - 但它不适用于普通的消费者 Gmail 帐户。呸。
  3. Google 的 IMAP extensions 可能允许这样做,但我不清楚。

我想我可以使用 1,将一些 UID 放入主题中,我可以使用它来查找传递的消息,添加标签(并希望通过删除 UID 来取消主题)。但这似乎有点笨拙。

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

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

【问题讨论】:

  • 我也在考虑 UID-in-the-Subject 技巧。我同意:丑陋。仅作为最后手段。
  • 除了难看,我还担心打GmailApp.sendEmail后的延迟,邮箱里能找到。
  • 越想越觉得IMAP是正确的方法。它只是比我希望在 Google Apps 脚本环境中做的“重”。
  • 顺便说一句,我真的很想知道你想出了什么。
  • @offby1 我有一个在 Racket 中工作的原型。因为我可以在 Racket 中进行 IMAP。这似乎在Google Apps Script environment 中根本不可能。因此,对于作为 Google Apps 脚本运行的进程,我似乎无法执行此操作。

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


【解决方案1】:

Google Apps 脚本 GmailApp API 无法在您发送邮件时为邮件添加标签,而您可以通过 UI 执行此操作。这在问题跟踪器中显示为 Issue 1859,请访问并加注星标以获取更新。

一种解决方法是利用线程 api。如果邮件被密送(bcc'd)给发件人,它也会在他们的收件箱中显示为新邮件,我们可以在其中使用getInboxThreads() 找到它。将标签添加到此线程,并可选择将其标记为已读,然后将其归档。

也编码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);
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我们制作了一个基于 IMAP 的 gmail 客户端,包括标签操作。所以,我相信 IMAP 可以解决您的问题。
    • 同意。不幸的是,我看不到如何从 Google Apps 脚本环境与 IMAP 对话。 AFAICT 不仅没有任何 IMAP 服务,而且没有 TCP 服务让我将其滚动到低级别。 UrlFetchApp 是通用的,而且仅适用于 HTTP。
    • 您可以使用标准的IMAP protocol 来操作您的gmail,以及GMail IMAP 扩展。 IMAP协议不依赖HTTP,演示代码如下:imapClient.ConnectSsl("imap.gmail.com", 993); IMAP 的棘手部分是 XOAUTH 身份验证。
    • 所以忘记 HTTP RESTful API 服务(大多数 Google API 都使用),转而使用 IMAP:tools.ietf.org/html/rfc3501 访问邮箱不需要任何 HTTP 服务,这就是你找不到 Gmail 的原因API,因为根本不需要!
    • 谷歌“IMAP客户端源码”或者搜索开源项目相关的IMAP邮件客户端,你会找到你需要的
    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-25
      • 2021-07-10
      • 2016-12-21
      • 1970-01-01
      • 2020-05-25
      • 2015-11-02
      • 2018-03-22
      • 1970-01-01
      相关资源
      最近更新 更多