谷歌应用脚​​本从 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 附件

如何仅从特定 gmail 标签下载未读附件?

如何使用 nodejs 下载 Gmail API 的附件?

使用 Google Apps 脚本删除 Gmail 电子邮件的附件

如何在我的 Angular5 应用程序中发送带有附件的电子邮件(gmail)?