n8n Gmail 邮件摘要自动化:AI 提取待办并写入 Google Sheets
本文聚焦可复用的节点结构、过滤、结构化输出、幂等和错误处理,不使用未经验证的节省比例或成功率。
先给结论
- ✓ 用 n8n 搭建 Gmail 邮件摘要工作流:通过 Gmail Trigger 搜索过滤邮件,调用 AI 提取摘要、优先级和待办,再按 Message ID 去重写入 Google Sheets。
适合谁读
- ● 正在把 n8n / gmail / openai / google-sheets 落到真实项目里的开发者。
- ● 不想只看概念,希望知道取舍、边界、风险和下一步怎么做的独立开发者。
- ● 正在做技术选型、工具链治理、自动化工作流或个人数字资产建设的读者。
本文解决的问题
- ● 如何用 n8n 自动读取 Gmail 新邮件并生成摘要?
- ● 如何把邮件中的待办、优先级和摘要写入 Google Sheets?
- ● 如何按 Gmail Message ID 去重,避免同一封邮件重复写入?
先看结果:这条工作流会做什么
这套 n8n 工作流会定时检查 Gmail 新邮件,先用 Gmail 搜索条件过滤噪声,再让模型提取摘要、待办和优先级,最后按 Message ID 去重写入 Google Sheets。
完整链路如下:
Gmail Trigger
→ Google Sheets 查询 Message ID
→ IF:是否已处理
→ 是:结束
→ 否:AI 提取结构化字段
→ 字段校验
→ Google Sheets 追加新行
→ 可选:高优先级通知
最小可用版本只需要四类节点:
- Gmail Trigger:获取新邮件;
- Google Sheets:查询与写入;
- AI Chat Model + Structured Output Parser:提取结构化字段;
- IF:控制去重和失败分支。
最终写入 Google Sheets 的字段
建议先创建以下表头:
| 字段 | 用途 |
|---|---|
| Date | 邮件收到时间 |
| From | 发件人 |
| Subject | 邮件主题 |
| Summary | 三句话以内的摘要 |
| Action Items | 从邮件中提取的待办 |
| Priority | low / medium / high |
| Status | 手工维护处理状态 |
| MessageID | 幂等去重键 |
MessageID 必须保留。没有它,工作流重试或重复轮询时很容易向表格写入重复行。
第一步:配置 Gmail Trigger
Gmail Trigger 会按照你设置的 Poll Times 检查新邮件。节点本身还支持 Read Status、Search、Sender、Label 和每次轮询数量等过滤参数。
测试阶段先使用最小过滤条件:
is:unread
确认节点能读到邮件后,再逐步增加条件:
is:unread -category:social -category:promotions -from:noreply
这条查询的作用是:
- 只处理未读邮件;
- 排除社交分类;
- 排除推广分类;
- 排除常见的自动通知发件人。
不要一开始就叠加大量过滤条件。Trigger 没有数据时,很难判断是授权失败、轮询设置错误,还是 Search 条件把邮件全部排除了。
Simplify 应该开还是关
Gmail Trigger 默认可以返回简化结果,其中包含 Message ID、标签和常见邮件头字段。只做主题分类时可以开启 Simplify;需要完整正文时,应检查当前节点输出,并在必要时关闭 Simplify 或追加 Gmail 获取消息节点。
第二步:用 Message ID 做幂等去重
Gmail 中每封邮件都有唯一 Message ID。先查询再写入,可以避免以下问题:
- 工作流重试导致重复写入;
- Polling 时间重叠导致同一邮件再次进入;
- 模型节点超时后整条执行重新开始;
- 人工点击重新执行历史任务。
推荐流程:
[Gmail Trigger]
→ [Google Sheets: 按 MessageID 查询]
→ [IF: 是否找到记录]
├─ True → [结束]
└─ False → [AI 摘要] → [追加新行]
IF 判断不要依赖主题或发件人,因为不同邮件可能拥有相同主题。唯一键必须使用 Message ID。
第三步:让模型返回固定结构
不要只在提示词里写“请返回 JSON”。更稳妥的方式是给模型节点连接 Structured Output Parser,并定义字段 Schema。
{
"type": "object",
"properties": {
"summary": {
"type": "string",
"description": "用不超过三句话概括邮件核心内容"
},
"action_items": {
"type": "array",
"items": { "type": "string" },
"description": "收件人需要完成的具体动作,没有则返回空数组"
},
"priority": {
"type": "string",
"enum": ["low", "medium", "high"],
"description": "根据明确的时间、风险和阻塞信号判断优先级"
}
},
"required": ["summary", "action_items", "priority"]
}
推荐提示词:
你是邮件信息提取器。根据发件人、主题和正文提取结构化字段。
规则:
1. summary:不超过三句话,只概括邮件中明确出现的信息。
2. action_items:只提取收件人需要执行的动作;没有则返回空数组。
3. priority:
- high:包含明确的临近截止时间、服务中断、付款风险或客户升级;
- medium:需要处理但没有立即风险;
- low:通知、参考资料或无需回复的信息。
4. 不补充邮件中不存在的日期、责任人和结论。
5. 严格遵守输出 Schema。
第四步:字段校验后再写表格
即使使用结构化输出,也建议在写入前增加 IF 或 Code 节点做最小校验:
const item = $input.first().json;
if (typeof item.summary !== 'string') {
throw new Error('summary must be a string');
}
if (!Array.isArray(item.action_items)) {
throw new Error('action_items must be an array');
}
if (!['low', 'medium', 'high'].includes(item.priority)) {
throw new Error('priority is invalid');
}
return item;
Google Sheets 字段映射可以使用:
Date = 邮件时间
From = 发件人
Subject = 邮件主题
Summary = summary
ActionItems = action_items.join("\n")
Priority = priority
Status = 待处理
MessageID = Gmail Message ID
第五步:给高优先级邮件增加通知
表格是归档层,不适合承担即时提醒。可以在写入前用 Switch 节点按 priority 分流:
high → 即时通知 → 写入 Sheets
medium → 写入 Sheets → 每日汇总
low → 只写入 Sheets
通知节点可以换成团队实际使用的 Slack、Discord、企业微信、飞书或邮件。涉及外部客户、付款和生产操作时,通知只用于提示,不应让模型自动回复或执行不可逆动作。
Error Workflow:失败必须能被发现
主工作流至少要处理三类错误:
- Gmail 授权失效;
- 模型调用超时、限流或输出校验失败;
- Google Sheets 写入超时或权限错误。
可以建立独立 Error Workflow:
Error Trigger
→ 提取 workflow、node、execution URL 和错误消息
→ 写入错误日志
→ 发送告警
主工作流的 Settings 中关联该 Error Workflow。告警内容应至少包含:
- 工作流名称;
- 失败节点;
- 执行时间;
- 错误摘要;
- Execution 链接;
- 是否允许安全重试。
常见问题排查
Gmail Trigger 没有数据
按下面顺序检查:
- 工作流是否已经激活;
- Google OAuth 凭据是否仍然有效;
- Poll Times 是否符合预期;
- Read Status 是否只读取未读邮件;
- Search、Sender 或 Label 是否把测试邮件过滤掉;
- 当前邮件是否在节点开始监听之后到达。
测试时先删除 Search 条件,只保留一封新发的未读邮件。确认链路正常后再恢复过滤。
模型输出无法解析
优先使用 Structured Output Parser,不要依赖正则从自然语言中截取 JSON。仍然失败时记录原始模型响应,并把该次执行送入人工复核或重试分支,不要把不完整字段写入表格。
Google Sheets 重复写入
检查 Lookup 是否发生在模型调用和 Add Row 之前,并确认查询列与写入列使用的是同一个 Message ID。主题、时间和发件人都不能替代幂等键。
Google Sheets 写入超时
为写入节点启用有限次数重试和退避等待。数据量上升后,不要同时并发写入大量行;可以先聚合成批次,或使用数据库作为主存储、Sheets 作为展示层。
自托管 n8n 出现 SQLite 锁
SQLite 适合试验和低并发环境。工作流数量、并发执行和执行历史增长后,应评估 PostgreSQL,并结合 Queue Mode 与 Worker 隔离耗时任务。迁移前必须备份数据库和 N8N_ENCRYPTION_KEY,否则原有凭据可能无法解密。
隐私与权限边界
邮件正文可能包含客户信息、合同、验证码、财务数据和内部链接。上线前至少做以下限制:
- 使用专用 Google 凭据,只授权需要的邮箱;
- Search 条件先过滤明显不应进入模型的邮件;
- 不把附件默认发送给模型;
- 对正文长度设置上限;
- 日志中不保存完整邮件正文;
- 写入表格时限制共享范围;
- 自动回复、转发、删除和付款相关操作必须保留人工确认。
最终检查清单
- Gmail Trigger 能稳定获取测试邮件;
- Search 条件不会误伤需要处理的邮件;
- Message ID 查询发生在模型调用之前;
- 模型输出经过 Schema 和字段校验;
- Google Sheets 已保存 MessageID 列;
- 重复执行不会生成第二行;
- Error Workflow 能发送包含 Execution 链接的告警;
- 邮件正文、附件和日志满足隐私要求;
- 高风险动作没有交给模型自动执行。
继续阅读
- AI Workflow 专题:n8n 自托管、案例与排障路线
- Self-hosted n8n AI Workflow:Docker、Postgres、VPS 与 NAS 部署
- n8n 错误处理、重试、超时与成本监控
- n8n Queue Mode + Redis Worker 实战
- n8n 与 Make 如何选:工作流自动化对比
- n8n Notion 知识库 Agent 实战
继续按 n8n 生产排障链路读
自托管、Queue Mode、Webhook、错误处理和案例文统一沉淀到 Workflow 专题页:部署文做主力页,案例文做长尾页,对比文承接工具选择流量。
下一步阅读
返回专题入口 →n8n AI Workflow 实战:Slack 每日摘要机器人
实战讲解如何用自托管 n8n、OpenAI 和 Slack API 构建每日工作简报智能体。涵盖 Slack 消息批量拉取、短消息与系统通知过滤、多线程上下文关联,以及大模型精准决策提取与自动推送。
Self-hosted n8n 部署指南:Docker Compose、Postgres、VPS 与 NAS 生产基线
自托管 n8n 怎么部署才稳定?本文给出 Docker Compose + Postgres 生产基线,覆盖版本固定、N8N_ENCRYPTION_KEY、WEBHOOK_URL、N8N_EDITOR_BASE_URL、反向代理、备份恢复、NAS 网络和 Queue Mode 升级边界。
n8n Webhook 生产化实战:Header Auth、Raw Body、WEBHOOK_URL 与反向代理排查
系统拆解自托管 n8n Webhook 从测试到生产的关键配置,覆盖 Test URL 与 Production URL、Header Auth、JWT、Raw Body、Respond to Webhook、WEBHOOK_URL、N8N_PROXY_HOPS、反向代理、签名验签、幂等去重和安全排查。
n8n Queue Mode + Redis 实战:什么时候需要把工作流拆到队列里?
实战讲解 n8n Queue Mode、Redis 和 Worker 的生产部署设计,包括什么时候需要从 regular mode 切换到 queue mode,如何拆分 main instance、worker、webhook、Redis 和数据库,以及 AI 工作流高并发、长任务、Webhook 回调和执行超时的处理思路。

小白
Full-Stack AI Engineer
小白,全栈 AI 工程师,持续构建生产级 Agent 系统、产品工具与独立软件资产。
了解小白与 XBSTACK →