我一直在用RSS2Email把Gmail变成Google Reader。
我想创建一个Google Apps脚本来做这件事,以获得两个优势:
-
调度将由Google Apps Script处理。(不需要专门的电脑来运行脚本)
-
生成的电子邮件将被标记为 per-feed,很好地组织事情。
使用Google Apps Script将是相同的实现精神,例如Gmail贪睡。
我知道如何获取提要。我卡住的地方是如何使用特定的标签创建电子邮件。到目前为止我研究过的方法:
- Gmail服务的谷歌应用程序脚本不允许这样,至少不明显。
-
GmailApp.sendEmail
不允许指定标签。这是有道理的,因为这是一般的电子邮件发送。但是… -
GmailApp.sendEmail
返回GmailApp
,而不是您可以用来标识消息并稍后更改其标签的东西。 - 该服务似乎也不允许你以编程方式创建Gmail过滤器,排除了另一种可能的解决方法。
Gmail的迁移API将是完美的做到这一点,但它不能正常工作,消费者Gmail帐户。嗨。 -
- 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,然后分配一个标签。它没有,但你可以使用这个解决方案:
-
使用
GmailApp.createDraft()
创建消息为草稿 -
使用
GmailDraft.send()
发送草稿消息。方法返回一个GmailMessage
对象。 -
分配标签(要么用
GmailMessage.getThread().addLabel()
将其分配给整个线程,要么如果你想将其分配给单个消息,你必须使用这里描述的高级Gmail服务)