使用Google Apps Script无法在Gmail中读取.eml附件求助
排查Google Apps Script无法识别Gmail中.eml附件的问题
问题场景
使用Google Apps Script自动化检索特定主题Gmail里的.eml附件,确认邮件确实包含.eml文件,但脚本定位不到,日志里完全没有.eml相关输出,怀疑是附件过滤或访问逻辑出了问题。
现有代码
function findSpecificEmail() { var threads = GmailApp.search('subject:"Your Email Subject Here"'); // Change the subject to match your email var messages = GmailApp.getMessagesForThreads(threads); for (var i = 0; i < messages.length; i++) { for (var j = 0; j < messages[i].length; j++) { var message = messages[i][j]; var attachments = message.getAttachments(); for (var k = 0; k < attachments.length; k++) { var attachment = attachments[k]; Logger.log('Found attachment: ' + attachment.getName() + ' of type ' + attachment.getContentType()); if (attachment.getName().endsWith('.eml')) { var emlContent = attachment.getDataAsString(); Logger.log('EML Content: ' + emlContent); } } } } }
排查&修复方案
针对你的问题,从几个常见坑点入手调整:
文件名大小写/空格问题
endsWith('.eml')是严格匹配大小写的,如果附件是.EML或者文件名末尾带空格,就会匹配失败。改成统一转小写并去除首尾空格后判断:if (attachment.getName().trim().toLowerCase().endsWith('.eml'))结合Content-Type判断
部分.eml附件的Content-Type会标记为message/rfc822,只靠文件名判断可能漏检,建议同时校验类型:var isEml = attachment.getName().trim().toLowerCase().endsWith('.eml') || attachment.getContentType() === 'message/rfc822'; if (isEml) { // 处理逻辑 }扩大Gmail搜索范围
默认GmailApp.search()只搜索收件箱,如果目标邮件在归档、垃圾邮件或其他标签里,就搜不到。修改搜索语句加上in:anywhere:var threads = GmailApp.search('subject:"Your Email Subject Here" in:anywhere');增加更详细的日志
在遍历消息时记录邮件ID,方便后续单独测试某一封邮件:Logger.log('Processing message ID: ' + message.getId());
修复后的完整代码
function findSpecificEmail() { // 扩大搜索范围到所有邮件位置,替换为你的目标主题 var threads = GmailApp.search('subject:"Your Email Subject Here" in:anywhere'); var messages = GmailApp.getMessagesForThreads(threads); for (var i = 0; i < messages.length; i++) { for (var j = 0; j < messages[i].length; j++) { var message = messages[i][j]; Logger.log('Processing message ID: ' + message.getId()); var attachments = message.getAttachments(); for (var k = 0; k < attachments.length; k++) { var attachment = attachments[k]; var attachName = attachment.getName().trim(); var attachType = attachment.getContentType(); Logger.log('Found attachment: ' + attachName + ' | Type: ' + attachType); // 同时校验文件名和Content-Type var isEml = attachName.toLowerCase().endsWith('.eml') || attachType === 'message/rfc822'; if (isEml) { var emlContent = attachment.getDataAsString(); Logger.log('=== EML Content Start ==='); Logger.log(emlContent); Logger.log('=== EML Content End ==='); } } } } }
额外测试建议
- 先找一封确定有.eml附件的邮件,复制它的ID,用
GmailApp.getMessageById('邮件ID')单独获取这封邮件测试,排除搜索范围的问题 - 查看脚本执行日志时,要选对对应的执行记录(比如最新的一次运行),避免看了旧日志
- 确认脚本有Gmail的授权权限(第一次运行时会弹出授权请求,要允许)
内容的提问来源于stack exchange,提问作者MD ZUBAYER JAMIL
相关产品推荐
相关产品推荐

