从Gmail邮件正文提取内嵌图片并保存至Google Drive文件夹
解决Gmail内嵌图片批量提取问题
你的代码仅能提取单张图片的核心问题:
- 正则表达式未启用全局匹配,
exec()仅返回第一个匹配结果 - 所有图片使用同一文件名保存,会覆盖之前的文件
- 未明确指定目标Google Drive文件夹
以下是修改后的完整代码,可提取邮件中所有内嵌图片并保存到指定Drive文件夹:
function GETGMEmails() { // 替换为你的目标Drive文件夹ID或名称 const targetFolder = DriveApp.getFolderById("你的文件夹ID"); // 或用 DriveApp.getFoldersByName("文件夹名称").next(); const label = GmailApp.getUserLabelByName('WHOLESALE REP'); const threads = label.getThreads(); for (let i = threads.length - 1; i >= 0; i--) { const messages = threads[i].getMessages(); for (let j = 0; j < messages.length; j++) { fetchAllInlineImages(messages[j], targetFolder); } } } function fetchAllInlineImages(message, targetFolder) { const body = message.getBody(); // 全局匹配所有img标签,捕获src属性值 const imgPattern = /<img.*?src="([^"]*)"[^>]*>/g; let match; // 遍历所有匹配结果 while ((match = imgPattern.exec(body)) !== null) { let imgUrl = match[1]; const urlPattern = /^https?:\/\/.*$/; // 处理Gmail内部图片链接 if (!urlPattern.test(imgUrl)) { imgUrl = `https://mail.google.com/mail/u/0/${imgUrl}`; } try { // 抓取图片内容(忽略HTTP异常) const response = UrlFetchApp.fetch(imgUrl, { muteHttpExceptions: true }); if (response.getResponseCode() !== 200) { Logger.log(`图片抓取失败:${imgUrl},状态码:${response.getResponseCode()}`); continue; } const blob = response.getBlob(); // 生成唯一文件名,避免覆盖 const fileExt = blob.getContentType().split('/')[1]; const fileName = `${message.getId()}_${Date.now()}_inline_image.${fileExt}`; targetFolder.createFile(blob).setName(fileName); Logger.log(`已保存图片:${fileName}`); } catch (error) { Logger.log(`处理图片出错:${imgUrl},错误信息:${error.message}`); } } }
关键修改说明:
- 全局正则匹配:添加
g标志并通过while循环遍历所有<img>标签 - 唯一文件名:结合邮件ID、时间戳和图片扩展名,彻底避免文件覆盖
- 明确Drive文件夹:通过ID或名称指定目标文件夹,确保图片保存路径正确
- 错误处理:添加异常捕获和HTTP状态码检查,单个图片失败不会中断整个脚本
- URL处理优化:使用
test()替代exec()做协议判断,逻辑更简洁
内容的提问来源于stack exchange,提问作者Tri Le Minh
相关产品推荐
相关产品推荐

