使用 Google Apps 脚本删除 Gmail 电子邮件的附件
使用 Google Apps 脚本 (http://script.google.com),我从 文档,如何发送、转发、移至垃圾邮件等,但我不知道't find 如何删除电子邮件的文件附件,即:
Using Google Apps Script (http://script.google.com), I know from the docs, how to send, forward, move to trash messages, etc. but I don't find how to remove a file attachement of an email, i.e.:
- 保留文本内容(HTML 或纯文本都可以)
- 保留原发件人,保留收件人
- 保留原始消息日期/时间(重要!)
- 删除附件
如果不能通过 API,有没有办法在保留 1、2 和 3 的同时将消息重新发送给自己?
注意:GmailAttachment
类看起来很有趣,并允许列出收件人:
Note: the GmailAttachment
class looks interesting and allows to list recipients:
var threads = GmailApp.getInboxThreads(0, 10);
var msgs = GmailApp.getMessagesForThreads(threads);
for (var i = 0 ; i < msgs.length; i++) {
for (var j = 0; j < msgs[i].length; j++) {
var attachments = msgs[i][j].getAttachments();
for (var k = 0; k < attachments.length; k++) {
Logger.log('Message "%s" contains the attachment "%s" (%s bytes)',
msgs[i][j].getSubject(), attachments[k].getName(), attachments[k].getSize());
}
}
}
但我不知道如何删除附件.
but I don't find how to remove an attachment.
注意:我已经研究了许多其他解决方案,我已经阅读了几乎所有关于此的文章(具有专用 Web 服务的解决方案,具有本地客户端,如 Thunderbird + 附件提取器插件等),但没有一个真的很酷.这就是为什么我一直在寻找通过 Google Apps 脚本手动执行此操作的解决方案.
推荐答案
看起来消息必须是 重新创建-ish:
Looks like messages will have to be re-created-ish:
消息是不可变的:它们只能被创建和删除.除了应用于给定消息的标签之外,不能更改任何消息属性.
Messages are immutable: they can only be created and deleted. No message properties can be changed other than the labels applied to a given message.
将 高级 Gmail 服务 与 Gmail API insert() 您可以使用以下方法破解它:Gmail.Users.Messages.insert(resource, userId)
Using Advanced Gmail Service with the Gmail API insert() you can hack your way around it using: Gmail.Users.Messages.insert(resource, userId)
此高级服务必须启用 使用前.
This advanced service must be enabled before use.
示例:[使用 email_id
或您希望获取电子邮件的任何方式填写 EMAIL_ID
]
Example: [fill in the EMAIL_ID
with an email_id
or in whatever way you want to get the email]
function removeAttachments () {
// Get the `raw` email
var email = GmailApp.getMessageById("EMAIL_ID").getRawContent();
// Find the end boundary of html or plain-text email
var re_html = /(-*w*)()*(
)*(?=Content-Type: text/html;)/.exec(email);
var re = re_html || /(-*w*)()*(
)*(?=Content-Type: text/plain;)/.exec(email);
// Find the index of the end of message boundary
var start = re[1].length + re.index;
var boundary = email.indexOf(re[1], start);
// Remove the attachments & Encode the attachment-free RFC 2822 formatted email string
var base64_encoded_email = Utilities.base64EncodeWebSafe(email.substr(0, boundary));
// Set the base64Encoded string to the `raw` required property
var resource = {'raw': base64_encoded_email}
// Re-insert the email into the user gmail account with the insert time
/* var response = Gmail.Users.Messages.insert(resource, 'me'); */
// Re-insert the email with the original date/time
var response = Gmail.Users.Messages.insert(resource, 'me',
null, {'internalDateSource': 'dateHeader'});
Logger.log("The inserted email id is: %s",response.id)
}
这将从电子邮件中删除附件并将其重新插入您的邮箱.
This will remove the attachments from the email and re-insert it into your mailbox.
编辑/更新:新的正则表达式可以处理 html 和纯文本电子邮件 - 现在应该可以处理多个边界字符串
edit/update: New RegExp to work with html&plain-text only emails - should now work on multiple boundary strings
相关文章