
gmail 对单封邮件的收件人总数(含 to/cc/bcc)设定了严格上限:免费账户和大多数基础账户均为 100 人,超限即触发「limit exceeded: email recipients per message」错误——这不是脚本缺陷,而是 google 的底层策略性限制。
gmail 对单封邮件的收件人总数(含 to/cc/bcc)设定了严格上限:免费账户和大多数基础账户均为 100 人,超限即触发「limit exceeded: email recipients per message」错误——这不是脚本缺陷,而是 google 的底层策略性限制。
你遇到的这个错误:
Exception: Limit Exceeded: Email Recipients Per Message
根本原因并非代码写错或网络异常,而是 Gmail 服务端强制执行的硬性配额规则。根据 Google 官方文档,无论你使用 Gmail 网页界面、SMTP(如 smtp.gmail.com)、IMAP,还是 Apps Script 中的 GmailApp.sendEmail(),只要一封邮件中 To + CC + BCC 字段的邮箱地址总数超过 100 个,系统就会立即拒绝发送,并抛出该异常。
⚠️ 注意:这个 100 人限制是「每封邮件」的总计数,与是否使用 CC 无关——即使你把全部 200 个邮箱都塞进 cc 字段(如你的代码所示),依然会失败。BCC 同样计入此总数。
✅ 正确解法:分批发送(Batching),而非堆叠收件人
你需要将大名单拆分为 ≤100 人的子组,逐批调用 GmailApp.sendEmail()。以下是一个安全、可复用的 Apps Script 示例:
function sendMailInBatches(fullname, mailTo, mailCCList, subject, imageId) {
const batchSize = 100; // 每批最多 100 个收件人(含 To + CC)
const allRecipients = [...new Set([mailTo, ...mailCCList])]; // 去重并合并
const chunks = [];
// 拆分成每组 ≤100 人的批次
for (let i = 0; i {
const [first, ...rest] = batch;
const ccString = rest.join(', ');
try {
const img = DriveApp.getFileById(imageId).getAs('image/png');
const logo = { logo: img };
GmailApp.sendEmail(
first,
subject,
'',
{
cc: ccString,
htmlBody: `<p>Hi ${fullname}</p><br><img src="https://drive.google.com/uc?export=view&id=%24%7BimageId%7D?x-oss-process=image/resize,p_40">`
}
);
console.log(`✅ Batch ${index + 1}: sent to ${batch.length} recipients`);
} catch (e) {
console.error(`❌ Batch ${index + 1} failed:`, e.toString());
throw e;
}
});
}
? 关键说明:
- mailCCList 应传入数组(如 ['a@x.com', 'b@y.com', ...']),而非拼接好的长字符串;
- 使用 Set 去重,避免同一邮箱重复触发配额;
- 每封邮件确保 To 为 1 人,其余放入 cc,总人数 ≤100;
- 若需完全隐藏收件人,可统一用 BCC(但 BCC 同样计入 100 限额);
⚠️ 重要提醒:别踩这些坑
升级个人账户 ≠ 解除 100 人/封限制:
升级为 Google Workspace(原 G Suite)企业账号后,日发送总量上限提升至 2000 封/天,但 单封邮件收件人上限仍为 100 人(官方说明)。这是设计使然,无法绕过。不要试图用 Gmail API 批处理(Batch)规避此限制:
Gmail API 的批处理(Batch)仅用于 合并多个独立 API 请求(如发 50 封不同邮件),不改变单封邮件的收件人上限。它不能把 200 人塞进一封邮件里。-
警惕“隐形超限”风险:
你的原始代码中 cc 字符串包含大量重复邮箱(如 nguyenvan5@gmail.com 出现多次)、格式错误(gmai l.com)、甚至 HTML 转义邮箱(),这会导致:- 实际解析失败,收件人计数异常;
- 邮件被标记为垃圾邮件;
- Apps Script 运行时抛出更隐蔽的 Invalid email address 错误。
✅ 最佳实践建议:
- 预清洗邮箱列表:去重、校验格式(可用正则 /^[^\s@]+@[^\s@]+\.[^\s@]+$/)、移除空格/HTML 标签;
- 启用日志与错误捕获:如上例所示,便于定位哪一批次失败;
- 考虑专业工具替代:若高频群发(如客户通知、营销),应迁移到合规邮件服务(如 Mailchimp、SendGrid 或 GMass),它们提供送达率追踪、退订管理、IP 信誉维护等核心能力——而 Gmail 从设计上就不是为此而生。
归根结底:Gmail 是沟通工具,不是邮件引擎。尊重它的边界,才能让自动化真正可靠。











