Gmail getFrom()返回别名而非真实发件人,求代发邮件发件人获取代码
代发模式下实际发件人读取实现方案
你之前使用的
message.getFrom()方法仅会提取邮件对外展示的From头字段内容,在别名代发场景下,这个字段会固定显示团队通用账号信息,符合Gmail代发的对外展示逻辑。实际提交邮件的团队成员信息,会被Gmail写入标准邮件头Sender字段中,这就是你需要读取的"实际发件人"来源。
核心Apps Script代码
将以下代码粘贴到绑定团队通用账号的Google Sheets脚本编辑器中运行即可完成统计:
function countSentEmailsByMember() { // 拉取团队账号已发送邮件,可按需调整分页参数拉取全量数据 const sentThreads = GmailApp.search("in:sent", 0, 500); // 初始化统计容器 const senderStats = {}; sentThreads.forEach(thread => { // 遍历线程内所有邮件,避免遗漏同线程的多封邮件 thread.getMessages().forEach(message => { // 读取代发场景下实际发件人对应的Sender头字段 const rawSender = message.getHeader("Sender"); // 无Sender头的历史邮件/系统邮件直接跳过 if (!rawSender) return; // 解析Sender字段的标准格式:"姓名<邮箱地址>" 或纯邮箱地址 const emailMatch = rawSender.match(/<([^>]+)>/); const senderEmail = emailMatch ? emailMatch[1].toLowerCase() : rawSender.toLowerCase(); // 提取发件人姓名,如无姓名则留空 const senderName = emailMatch ? rawSender.split("<")[0].trim().replace(/"/g, "") : ""; // 累加统计次数 if (!senderStats[senderEmail]) { senderStats[senderEmail] = { name: senderName, count: 0 }; } senderStats[senderEmail].count += 1; }); }); // 清空当前活动 sheet 原有内容并写入表头 const activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); activeSheet.clear(); activeSheet.appendRow(["成员邮箱", "成员姓名", "已代发邮件数量"]); // 写入统计结果 Object.entries(senderStats).forEach(([email, info]) => { activeSheet.appendRow([email, info.name, info.count]); }); }
注意事项
- 前置配置要求:需要Workspace管理员已开启共享团队账号的「成员代发时自动将已发送邮件同步到团队账号已发送文件夹」设置,否则脚本无法读取到全量代发邮件。
- 权限说明:首次运行脚本时需授权Gmail、Google Sheets的读写权限,授权账号需为该团队通用Gmail账号本身。
- 历史邮件兼容:部分开启代发功能之前的存量邮件可能未写入
Sender头字段,这部分邮件会被自动跳过,可根据实际需求单独补充统计逻辑。 - 批量拉取优化:单页最多可拉取500个邮件线程,若已发送邮件总量超过该阈值,可通过循环调整
GmailApp.search的起始分页参数拉取全量数据,避免触发接口上限。 - 自定义映射扩展:如果需要将成员邮箱对应为内部部门、工号等信息,可提前在Sheets中维护成员对照列表,写入结果时自动匹配替换即可。
内容的提问来源于stack exchange,提问作者Christoph Schmid
相关产品推荐
相关产品推荐

