You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Google Apps Script获取Gmail主邮件专属附件

解决方案

要过滤掉内嵌.eml邮件中的附件,只保留主邮件的直接附件,可通过以下逻辑实现:

  1. 识别主邮件中的.eml格式附件(MIME类型为message/rfc822)
  2. 解析每个.eml附件,提取其中嵌套附件的唯一ID
  3. 遍历主邮件附件时,仅保存不在嵌套附件ID列表中的内容

修改后的代码如下:

var threads = GmailApp.search('subject:' + 'test subject');
var folder = DriveApp.getFolderById('someID');

if(threads.length <= 0){
    return "email not found";
}

for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();

    for (var m = 0; m < messages.length; m++) {
        var attachments = messages[m].getAttachments();
        Logger.log('attachments found ' + attachments.length);

        if (attachments.length > 0) {
            // 收集所有内嵌邮件附件的唯一ID
            var nestedAttachmentIds = new Set();
            
            attachments.forEach(function(att) {
                // 判断是否为.eml格式的内嵌邮件附件
                if (att.getContentType() === 'message/rfc822') {
                    // 解析.eml内容为可操作的邮件对象
                    var emlRaw = att.copyBlob().getDataAsString();
                    var nestedMessage = GmailApp.getMessageFromRaw(emlRaw);
                    // 记录内嵌邮件的所有附件ID
                    var nestedAtts = nestedMessage.getAttachments();
                    nestedAtts.forEach(function(nestedAtt) {
                        nestedAttachmentIds.add(nestedAtt.getId());
                    });
                }
            });

            // 仅保存主邮件的直接附件,排除内嵌邮件中的附件
            attachments.forEach(function(a){
                if (!nestedAttachmentIds.has(a.getId())) {
                    var fileName = a.getName().substring(0,30);
                    folder.createFile(a.copyBlob()).setName(fileName);
                    Logger.log('Saved attachment: ' + fileName);
                } else {
                    Logger.log('Skipped nested attachment: ' + a.getName());
                }
            });
        }
    }
}

代码说明:

  • 识别.eml附件:通过getContentType()判断附件类型是否为message/rfc822(标准.eml格式的MIME类型)
  • 解析内嵌邮件:利用GmailApp.getMessageFromRaw()将.eml的原始内容转换为可操作的GmailMessage对象,从而获取其中的嵌套附件
  • 去重判断:用Set存储嵌套附件的唯一ID,避免重复判断
  • 过滤保存:遍历主邮件附件时,跳过ID在嵌套集合中的附件,只保留主邮件的直接附件

如果需要同时过滤掉.eml文件本身,只需在保存判断中添加a.getContentType() !== 'message/rfc822'的条件即可。

内容的提问来源于stack exchange,提问作者Rcsordas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:56:32