如何用Google Apps Script获取Gmail主邮件专属附件
解决方案
要过滤掉内嵌.eml邮件中的附件,只保留主邮件的直接附件,可通过以下逻辑实现:
- 识别主邮件中的.eml格式附件(MIME类型为
message/rfc822) - 解析每个.eml附件,提取其中嵌套附件的唯一ID
- 遍历主邮件附件时,仅保存不在嵌套附件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
相关产品推荐
相关产品推荐

