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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:21:02