n8n Gmail 邮件摘要自动化工作流:AI 提取待办并写入 Google Sheets - XBSTACK

n8n Gmail 邮件摘要自动化:AI 提取待办并写入 Google Sheets

Release Date
2026-05-30
Reading Time
7分钟
Content Size
2,767 chars
n8n
gmail
OpenAI
google-sheets
workflow-automation
Xiaobai's Note / 实验室笔记

本文聚焦可复用的节点结构、过滤、结构化输出、幂等和错误处理,不使用未经验证的节省比例或成功率。

先给结论

  • 用 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 追加新行
           → 可选:高优先级通知

最小可用版本只需要四类节点:

  1. Gmail Trigger:获取新邮件;
  2. Google Sheets:查询与写入;
  3. AI Chat Model + Structured Output Parser:提取结构化字段;
  4. IF:控制去重和失败分支。

最终写入 Google Sheets 的字段

建议先创建以下表头:

字段用途
Date邮件收到时间
From发件人
Subject邮件主题
Summary三句话以内的摘要
Action Items从邮件中提取的待办
Prioritylow / 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:失败必须能被发现

主工作流至少要处理三类错误:

  1. Gmail 授权失效;
  2. 模型调用超时、限流或输出校验失败;
  3. Google Sheets 写入超时或权限错误。

可以建立独立 Error Workflow:

Error Trigger
  → 提取 workflow、node、execution URL 和错误消息
  → 写入错误日志
  → 发送告警

主工作流的 Settings 中关联该 Error Workflow。告警内容应至少包含:

  • 工作流名称;
  • 失败节点;
  • 执行时间;
  • 错误摘要;
  • Execution 链接;
  • 是否允许安全重试。

常见问题排查

Gmail Trigger 没有数据

按下面顺序检查:

  1. 工作流是否已经激活;
  2. Google OAuth 凭据是否仍然有效;
  3. Poll Times 是否符合预期;
  4. Read Status 是否只读取未读邮件;
  5. Search、Sender 或 Label 是否把测试邮件过滤掉;
  6. 当前邮件是否在节点开始监听之后到达。

测试时先删除 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 Hub

继续按 n8n 生产排障链路读

自托管、Queue Mode、Webhook、错误处理和案例文统一沉淀到 Workflow 专题页:部署文做主力页,案例文做长尾页,对比文承接工具选择流量。

下一步阅读

返回专题入口 →
小白

小白

Full-Stack AI Engineer

小白,全栈 AI 工程师,持续构建生产级 Agent 系统、产品工具与独立软件资产。

了解小白与 XBSTACK →

喜欢这篇文章?
加入小白实验室的周刊

每期只整理 AI 工程变化、真实故障、可复现实验、值得尝试的工具和 XBSTACK 新资产,不做泛新闻汇总,也不为周更凑数。

Comments