3

我一直在使用RSS2Email 将 Gmail 变成 Google Reader

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

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

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

使用 Google Apps 脚本与Gmail Snooze的实现精神相同。


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

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

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

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

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

4

3 回答 3

5

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

一种解决方法是利用线程 api。如果邮件被密送(bcc'd)给发件人,它也将作为新邮件出现在他们的收件箱中,我们可以在其中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);
}
于 2013-09-10T19:54:18.987 回答
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

于 2013-04-25T14:52:33.813 回答
0

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

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

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

  3. 分配标签(或者将其分配给整个线程,GmailMessage.getThread().addLabel()或者如果您想将其分配给单个邮件,您必须使用此处所述的高级 Gmail 服务)。

于 2021-04-05T23:12:07.860 回答