我一直在使用RSS2Email to turn Gmail into Google Reader。
我想创建一个Google Apps脚本,以获得两个优势:
计划将由Google Apps脚本处理。 (无需专用计算机来运行脚本。)
生成的电子邮件将标记为每个Feed ,很好地组织内容。
使用Google Apps脚本与实施精神相同Gmail Snooze
我了解如何获取Feed。我遇到的问题是如何使用特定标签创建电子邮件。到目前为止我调查过的方法:
GmailApp.sendEmail
不允许您指定标签。这是有道理的,因为这是通用电子邮件发送。但是...... GmailApp.sendEmail
会返回GmailApp
,而不是您可以用来识别邮件并稍后更改其标签的内容。我想我可以使用1,在主题中添加一些UID,我可以使用它查找传递的消息,添加标签(并希望通过删除UID来解除主题)。但这似乎有些愚蠢。
使用3,IMAP扩展,似乎可能不那么重要了,尽管可能需要更多的代码和测试工作。
其中有什么建议吗?是否有其他API或策略?
答案 0 :(得分:4)
Google Apps脚本GmailAppApp API无法在您发送消息时为消息添加标签,而可以从UI进行操作。这在问题跟踪器中显示为Issue 1859,访问并将其标记为更新。
解决方法是利用线程apis。如果邮件被盲目复制(密件抄送)给发件人,它也会在收件箱中显示为新邮件,我们可以使用getInboxThreads()
来查找邮件。将标签添加到此线程,并可选择将其标记为read,然后将其存档。
/**
* 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 :(得分: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
答案 2 :(得分:0)
GmailApp.sendEmail()
返回一个 GmailMessage
对象会很方便,这样我们就可以获取它的 id 然后分配一个标签。没有,但您可以使用此解决方法:
使用 GmailApp.createDraft()
使用 GmailDraft.send()
发送消息草稿。此方法确实返回一个 GmailMessage
对象。
分配标签(使用 GmailMessage.getThread().addLabel()
将其分配给整个线程,或者如果您想将其分配给单个邮件,则必须使用高级 Gmail 服务 as described here ).