谷歌应用脚本从 gmail 中删除特定附件
Posted
技术标签:
【中文标题】谷歌应用脚本从 gmail 中删除特定附件【英文标题】:Google app Script delete specific attachment from gmail 【发布时间】:2020-03-09 03:20:45 【问题描述】:我对谷歌应用脚本有点陌生,并尝试弄清楚如何使用谷歌应用脚本解决我的谷歌邮件问题
更新:只有特定的附件需要删除结构的其余部分,附件需要相同。提供的解决方案删除所有附件!
问题:
我每天都会收到来自供应商和客户的带有 pdf 附件的电子邮件,有些是使用自动系统发送给我的,有些是手动发送给我的,有些电子邮件有名为“noname”的附件,我无法打开或阅读.当电子邮件完全忽略“无名”附件时,我正在使用自动应用程序下载此 pdf 附件,因此我每天都会错过一些 pdf
计划解决方案:
使用谷歌应用程序脚本我尝试捕获“无名”附件并删除只有该文件其余的电子邮件内容和 pdf 需要相同。
我已经设法实现代码来捕获发送无名附件的特定电子邮件,如果它们未读,则检查附件并删除无名
我需要建议的地方:如何删除选定的附件??
function myFunction()
Logger.log("unread emails: " +
GmailApp.search('is:unread from:pdf_sender@gmail.com'));
var deta = GmailApp.search('is:unread from:1031mymailx@gmail.com')
var msgs = GmailApp.getMessagesForThreads(deta);
for (var i = 0 ; i < msgs.length; i++)
Logger.log("msg object lenth " + msgs.length)
for (var j = 0; j < msgs.length; j++)
Logger.log("msg i object lenth " + msgs[i].length)
var attachments = msgs[i][j].getAttachments();
var m_id = msgs[i][j].getId()
for (var k = 0; k < attachments.length; k++)
Logger.log("attachment lenth " + attachments.length)
Logger.log('Message "%s" contains the attachment "%s" (%s bytes)', msgs[i][j].getSubject(), attachments[k].getName(), attachments[k].getSize());
if (attachments[k].getName() == "noname" )
// attachments[k].deleteAttachment();
Logger.log('Message "%s" contains the attachment "%s" (%s bytes)', msgs[i]
[j].getSubject(), attachments[k].getName(),attachments[k].getSize());
【问题讨论】:
这能回答你的问题吗? Remove an attachment of a Gmail email with Google Apps Script 感谢@Casper 的建议,但它删除了所有附件。这里我只需要删除无名附件。 【参考方案1】:GMail 消息是不可变的——也就是说,您不能修改它们。但是,您可以通过下载内容、修改内容并将修改后的消息重新插入您的帐户来重新创建它们。
我已经修改了您的代码,以便它按照您的要求使用说明的方法。它遍历搜索结果并检查消息是否包含名为noname
的文件名。如果是这样,它会插入不包含noname
附件的原始消息的修改。
此外,您可以选择取消注释两个不同的行,以便:
-
插入新邮件时带有
INBOX
标签(以便它显示在您的收件箱中)和UNREAD
标签。
插入新邮件后,原始邮件会被丢弃。
var BOUNDARY_REGEX = new RegExp('boundary=\"(.+)\"');
function removeAttachment(msg)
var emailContent = msg.getRawContent();
if (emailContent.indexOf('filename=noname') == -1) return;
var boundary = BOUNDARY_REGEX.exec(emailContent)[1];
var boundaryLine = '--' + boundary;
var sections = emailContent.split(boundaryLine);
var filteredSections = sections.filter(function(value, index, arr)
return value.indexOf('filename=noname') == -1;
);
var resultBody = filteredSections.join(boundaryLine);
var encodedResultBody = Utilities.base64EncodeWebSafe(resultBody);
var resource = 'raw': encodedResultBody;
// OPTIONAL - LABEL YOUR NEWLY CREATED MAIL AS 'INBOX' & 'UNREAD'
// resource['labelIds'] = ['INBOX', 'UNREAD'];
var response = Gmail.Users.Messages.insert(resource, 'me', null, 'internalDateSource': 'dateHeader');
Logger.log("Inserted email id is: %s", response.id);
// OPTIONAL - TRASH ORIGINAL MESSAGE
// GmailApp.moveMessageToTrash(msg);
return response.id;
function myFunction()
Logger.log("unread emails: " +
GmailApp.search('is:unread from:pdf_sender@gmail.com'));
var deta = GmailApp.search('is:unread from:1031mymailx@gmail.com')
var msgs = GmailApp.getMessagesForThreads(deta);
for (var i = 0 ; i < msgs.length; i++)
for (var j = 0; j < msgs[i].length; j++)
Logger.log("msg object length " + msgs[j].length);
removeAttachment(msgs[i][j]);
在执行此代码之前,请确保您拥有 GMail 高级服务enabled。
【讨论】:
亲爱的@carlesgg97 这对我很有帮助。在第一次尝试启用高级服务后,我感谢为这个答案付出的时间和精力,我遇到了 msg.getRawContent() 的问题。然后我解决它添加googleapis.com/auth/gmail.metadata到元数据然后我得到这个错误访问被拒绝::元数据范围不支持'q'参数line_Logger.log( “未读电子邮件:” + GmailApp.search _ 目前我被困在这里 嘿@Darshanak,我假设您的意思是您将范围https://www.googleapis.com/auth/gmail.metadata
添加到您的项目中。如果我理解正确,那么这是由于 search()
方法需要较少的限制性权限。为了执行脚本中的每个操作,您将需要https://www.googleapis.com/auth/gmail.modify
范围(或者如果您对此仍有问题,则需要https://mail.google.com/
)。让我知道这是否能解决您的问题,谢谢。
嗨@carlesgg97 感谢您的建议,它解决了问题。现在有一个TypeError: Cannot find function getRawContent in object GmailMessage.
嘿@Darshanak,抱歉。 GmailApp.getMessagesForThreads()
返回 Gmail 邮件的二维列表。我已经编辑了上面的答案,这样它就不会抛出那个错误。如果您有任何其他问题,请告诉我。
好的,现在我被困在这里了,如果我使用手动正则表达式,我会说没有正则表达式定义var boundary = BOUNDARY_REGEX.exec(emailContent)[1];
,那么我就卡在(function(value, index, arr)
以上是关于谷歌应用脚本从 gmail 中删除特定附件的主要内容,如果未能解决你的问题,请参考以下文章
使用谷歌应用脚本从 MYSQL 数据库中获取数据时,谷歌电子表格的单元格中缺少某些值
在 GAS/Javascript 中保存带有特定主题行的 Gmail 附件