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

时间:2017-09-26 19:28:25

标签: javascript email google-apps-script gmail gmail-api

使用Google Apps脚本(http://script.google.com),我知道the docs,如何发送,转发,转移到垃圾邮件等,但我找不到如何删除电子邮件的文件附件,即:

  1. 保留文本内容(无论是HTML还是纯文本都可以)
  2. 保留原始发件人,保留收件人
  3. 保留原始消息日期/小时(重要!)
  4. 删除附件
  5. 如果通过API无法实现,是否有办法将消息重新发送给自己,同时保留1,2和3?

    注意:GmailAttachment类看起来很有趣并允许列出收件人:

    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());
         }
       }
     }
    

    但我找不到如何删除附件。

    注意:我已经研究过许多其他解决方案,我已经阅读了几乎所有关于此的文章(具有专用Web服务的解决方案,本地客户端如Thunderbird + Attachment extractor插件等等),但它们都不是真的很酷。这就是我寻找通过Google Apps脚本手动完成解决方案的原因。

1 个答案:

答案 0 :(得分:5)

看起来消息必须是re-created-ish

  

邮件不可变:只能创建和删除邮件。除了应用于给定消息的标签之外,不能更改任何消息属性。

Advanced Gmail ServiceGmail API insert()一起使用,您可以使用以下方式解决问题:Gmail.Users.Messages.insert(resource, userId)

使用前的高级服务must be enabled

示例:[使用EMAIL_ID填写email_id或以任何方式填写电子邮件

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*)(\r)*(\n)*(?=Content-Type: text\/html;)/.exec(email);
  var re = re_html || /(-*\w*)(\r)*(\n)*(?=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)
}

这将删除电子邮件中的附件并将其重新插入您的邮箱。

编辑/更新:新的RegExp可以使用html&amp;纯文本电子邮件 - 现在可以处理多个边界字符串