Gmail邮件分类与自动回复工具

一个基于n8n工作流的智能代理,使用Google Gemini AI自动分类Gmail邮件、应用智能标签,并为求职拒绝邮件生成个性化回复草稿。

  • by KoushikSamudrala
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 KoushikSamudrala/Gmail-Inbox-Agent

使用说明

📬 Gmail收件箱代理——Gemini分类器+拒绝起草器

一个智能的n8n代理工作流程,使用Google Gemini AI自动对您的Gmail收件箱进行分类,应用智能标签,并为拒绝工作的电子邮件起草个性化的反馈回复——所有这些都是免提的,每小时一次。


🎬 演示

https://github.com/user-attachments/assets/4e809ae2-f094-4821-8e6b-a4666fc30359

🤖 克劳德桌面+MCP集成

此工作流程可通过以下方式完全访问 克劳德桌面版 通过与n8n的MCP(模型上下文协议)集成。

通过将n8n的MCP服务器连接到Claude Desktop,您可以:

  • 通过自然语言触发此工作流 --只需让Claude运行您的Gmail收件箱代理
  • 监控工作流执行 在Claude桌面聊天中
  • 列出、搜索和执行 不打开n8n UI的任何n8n工作流

运作原理

Claude Desktop  ──MCP──▶  n8n MCP Server  ──▶  n8n Workflow Engine  ──▶  Gmail + Gemini APIs

设置MCP访问权限在 MCP集成 下面的部分。


📋 目录


🌟 概述

这 Gmail收件箱代理 是一个自主的代理n8n工作流,旨在消除手动收件箱管理。它每小时运行一次,获取最近未处理的电子邮件,并将其发送到 谷歌双子座2.5 Flash 对于人工智能分类,自动应用Gmail标签,并且——特别是对于拒绝工作的电子邮件——起草一份精美的、专业的反馈请求回复。

主要特点

特性 描述
⏰ 每小时自动化 通过时间表触发器每小时运行一次
🤖 AI分类 Gemini 2.5 Flash将电子邮件分为3类
🏷️ 自动标签 动态应用Gmail标签,如果缺少则创建标签
✉️ 草稿回复 自动生成拒绝反馈请求草稿
🔁 MCP可访问 可通过n8n MCP从克劳德桌面完全触发
🚫 自我过滤 跳过自己发送的电子邮件

电子邮件类别

AI将每封电子邮件精确地分为以下几类:

  • Job-Application-Related
  • Action-Needed
  • General-Purpose

🔀 架构与信息流

┌──────────────────────────────────────────────────────────────────────────────┐
│                         GMAIL INBOX AGENT WORKFLOW                           │
└──────────────────────────────────────────────────────────────────────────────┘

  ┌─────────────────┐
  │ ⏰ Run Every    │  Triggers every hour (Europe/Berlin timezone)
  │    Hour         │  Outputs: timestamp metadata
  └────────┬────────┘
           │
           ▼
  ┌─────────────────┐
  │ 📥 Get          │  Gmail API: Fetches all emails matching:
  │    Unprocessed  │  newer_than:1d  -label:processed  -in:draft
  │    Emails       │  Outputs: raw Gmail message objects
  └────────┬────────┘
           │
           ▼
  ┌─────────────────┐
  │ 🔍 Skip Emails  │  Filter: Removes emails where From contains
  │    Sent By Me   │  your own Gmail address
  └────────┬────────┘
           │
           ▼
  ┌─────────────────┐
  │ 🔨 Build Gemini │  Code node: Constructs Gemini API payload.
  │    Payload      │  Extracts: messageId, threadId, from,
  │                 │  subject, snippet → builds classify prompt
  └────────┬────────┘
           │
           ▼
  ┌─────────────────┐
  │ 🤖 Gemini:      │  HTTP POST to Gemini 2.5 Flash API
  │    Classify     │  Returns: category, is_rejection, draft_reply
  │    Email        │  (structured JSON via responseMimeType)
  └────────┬────────┘
           │
           ▼
  ┌─────────────────┐
  │ 🔧 Parse Gemini │  Code node: Parses AI response JSON.
  │    Response     │  Maps: category → labelName (spaces→dashes)
  │                 │  Falls back gracefully on parse errors
  └────────┬────────┘
           │
           ▼
  ┌─────────────────┐
  │ 📋 Get All      │  Gmail API: Fetches full list of existing
  │    Gmail Labels │  labels (id + name) for the account
  └────────┬────────┘
           │
           ▼
  ┌─────────────────┐
  │ 🔎 Check Which  │  Code node: Compares needed labels vs
  │    Labels Exist │  existing labels. Builds labelsToCreate[]
  │                 │  and existingLabelIds map
  └────────┬────────┘
           │
           ▼
  ┌─────────────────────────────────────┐
  │ ❓ New Labels Needed?               │
  │   labelsToCreate.length > 0 ?       │
  └────┬───────────────────────────┬────┘
       │ YES                       │ NO
       ▼                           │
  ┌─────────────┐                  │
  │ 📝 Expand   │                  │
  │    Labels   │                  │
  │    To Create│                  │
  └──────┬──────┘                  │
         ▼                         │
  ┌─────────────┐                  │
  │ 🏷️ Create   │                  │
  │    Missing  │                  │
  │    Label    │                  │
  └──────┬──────┘                  │
         │                         │
         └──────────┬──────────────┘
                    ▼
  ┌─────────────────┐
  │ 🔗 Merge —      │  Code node: Re-merges both branches.
  │    Restore      │  Restores full email context from
  │    Email Context│  "Check Which Labels Exist" node
  └────────┬────────┘
           │
           ▼
  ┌─────────────────┐
  │ 🏷️ Apply        │  Gmail API: Applies the AI-determined
  │    Category     │  category label to the email
  │    Label        │
  └────────┬────────┘
           │
           ▼
  ┌─────────────────────────────────────┐
  │ ❓ Is Job Rejection?                │
  │   is_rejection === true ?           │
  └────┬───────────────────────────┬────┘
       │ YES                       │ NO
       ▼                           ▼
  ┌─────────────┐           ┌─────────────┐
  │ ✉️ Create   │           │ 🏷️ Label:   │
  │    Draft    │           │    Processed│
  │    Feedback │           │   (Normal)  │
  │    Reply    │           └─────────────┘
  └──────┬──────┘
         ▼
  ┌─────────────┐
  │ 🏷️ Label:  │
  │    Draft-   │
  │    Created  │
  └──────┬──────┘
         ▼
  ┌─────────────┐
  │ 🏷️ Label:  │
  │    Processed│
  │  (Rejection)│
  └─────────────┘

🧩 工作流节点——完整分解

1.⏰ 每小时跑步

类型: n8n-nodes-base.scheduleTrigger

按小时计划启动工作流程。已配置为 Europe/Berlin 时区。向下游输出当前时间戳元数据。


2.📥 获取未处理的电子邮件

类型: n8n-nodes-base.gmail (getAll操作)

从Gmail中获取所有匹配的电子邮件:

newer_than:1d -label:processed -in:draft

这确保了只处理新的(过去24小时)未处理的非草稿电子邮件。返回完整的Gmail邮件对象。


3.🔍 跳过我发送的电子邮件

类型: n8n-nodes-base.filter

过滤掉任何电子邮件,其中 From 字段包含您自己的Gmail地址。这会阻止工作流处理您自己发送的电子邮件。

条件: From 做 不 包含 <your-email@gmail.com>


4.🔨 构建Gemini有效载荷

类型: n8n-nodes-base.code (JavaScript)

构造Gemini的请求有效负载。从Gmail邮件中提取关键字段:

  • messageId, threadId, from, subject, snippet

构建详细的分类提示,指示Gemini:

  • 分为3类
  • 检测是否是拒绝工作(is_rejection: true/false)
  • 如果拒绝:在 相同语言 作为电子邮件,不超过150字

用途 responseMimeType: "application/json" 用于结构化输出。


5.🤖 双子座:对电子邮件进行分类

类型: n8n-nodes-base.httpRequest

端点:

POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=YOUR_API_KEY

发送Gemini有效负载,并通过以下方式接收结构化JSON:

{
  "category": "Job-Application-Related",
  "is_rejection": true,
  "draft_reply": {
    "subject": "Re: Your Application",
    "body": "Dear Hiring Team, ..."
  }
}

6.🔧 解析Gemini响应

类型: n8n-nodes-base.code (JavaScript)

分析原始Gemini API响应。提取文本内容,解析JSON,并映射 category 到一个 categoryLabel (空格被破折号替换为有效的Gmail标签名称)。

退路: 如果解析失败,则默认为 General-Purpose, is_rejection: false.


7.📋 获取所有Gmail标签

类型: n8n-nodes-base.gmail (标签→ 列表操作)

获取已验证帐户的现有Gmail标签的完整列表。用于在创建AI确定的标签之前检查其是否已存在。


8.🔎 检查存在哪些标签

类型: n8n-nodes-base.code (JavaScript)

比较所需的标签(categoryLabel + processed)与现有的Gmail标签相比。输出:

  • labelsToCreate[] --需要创建的标签
  • existingLabelIds --地图 name → id 对于所有当前标签

9. ❓ 需要新标签吗?

类型: n8n-nodes-base.if

如果满足以下条件,则路由到标签创建分支 labelsToCreate.length > 0,否则直接跳到合并。


10. 📝 展开要创建的标签

类型: n8n-nodes-base.code (JavaScript)

由于IF节点输出单个项目,因此这会拆分 labelsToCreate[] 每个标签对应一个项目,以便下一个节点可以创建每个项目。


11. 🏷️ 创建缺失标签

类型: n8n-nodes-base.gmail (标签→ 创建操作)

创建新的Gmail标签。在中每个标签运行一次 labelsToCreate 阵列。


12. 🔗 合并--还原电子邮件上下文

类型: n8n-nodes-base.code (JavaScript)

在标签创建分支(或旁路)之后,这将从重新获取完整的电子邮件上下文 Check Which Labels Exist 节点。这是必要的,因为标签创建循环会拆分项目,否则上下文将丢失。


13. 🏷️ 应用类别标签

类型: n8n-nodes-base.gmail (添加标签操作)

使用AI确定的类别标签将其应用于电子邮件 messageId.


14. ❓ 工作被拒绝了吗?

类型: n8n-nodes-base.if

检查是否 is_rejection === true 双子座分类。创建草稿的路径(是)或正常处理路径(否)。


15. ✉️ 创建反馈回复草稿 (仅限拒绝路径)

类型: n8n-nodes-base.gmail (草案→ 创建操作)

使用Gemini生成的内容创建Gmail草稿回复:

  • 致: 原寄件人
  • 主题: 从 draft_reply.subject
  • 主体: 从 draft_reply.body
  • 主题: 附在原始电子邮件帖子中

16. 🏷️ 标签:草稿已创建 (拒绝路径)

类型: n8n-nodes-base.gmail (添加标签)

添加a Draft-Created 在电子邮件上贴上标签,这样你就知道已经为它生成了草稿。


17. 🏷️ 标签:已处理(拒收路径)

类型: n8n-nodes-base.gmail (添加标签)

将电子邮件标记为 processed 因此,在下一个小时的跑步中,它不会再被捡起。


18. 🏷️ 标签:已处理(正常路径)

类型: n8n-nodes-base.gmail (添加标签)

与上述相同,但适用于非拒绝电子邮件。标记为 processed 以防止再加工。


📦 先决条件

  • n8n (自托管,建议v1.x或更高版本)-- 安装n8n
  • 谷歌账户 启用Gmail
  • 谷歌云项目 与:
    • Gmail API已启用
    • 生成语言(Gemini)API已启用
  • Node.js v18+(适用于n8n)
  • (可选) 克劳德桌面版 用于MCP集成

🔐 身份验证设置

1.Gmail OAuth2(用于Gmail节点)

  1. 首选 谷歌云控制台
  2. 创建新项目或选择现有项目
  3. 导航至 API和服务→ 图书馆
  4. 搜索并启用 Gmail API
  5. 首选 API和服务→ 凭证
  6. 点击 创建凭证→ OAuth 2.0客户端ID
    • 应用程序类型: Web应用程序
    • 授权重定向URI: https://your-n8n-instance.com/rest/oauth2-credential/callback
  7. 复制 客户端ID 和 客户端密钥
  8. 在n8n中,转到 凭证→ 添加凭据→ Google OAuth2 API
  9. 粘贴您的客户端ID和客户端密码
  10. 点击 使用 Google 登录 并授权访问

⚠️ 请确保启用以下Gmail OAuth作用域:

  • https://www.googleapis.com/auth/gmail.readonly
  • https://www.googleapis.com/auth/gmail.labels
  • https://www.googleapis.com/auth/gmail.modify
  • https://www.googleapis.com/auth/gmail.compose

2.Gemini API密钥(用于HTTP请求节点)

  1. 首选 Google AI 工作室
  2. 点击 创建API密钥
  3. 复制API密钥
  4. 在工作流中,打开 🤖 双子座:对电子邮件进行分类 节点
  5. 在URL字段中,替换 YOUR_API_KEY 使用您的实际密钥:
    https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=YOUR_API_KEY
    

💡 或者,将密钥存储为n8n凭据(HTTP Header Auth),以提高安全性。


3.更新您的电子邮件过滤器

在 🔍 跳过我发送的电子邮件 节点,更新筛选条件:

From does not contain → your-email@gmail.com

替换为您的实际Gmail地址。


📥 安装和导入

步骤1:克隆此仓库

git clone https://github.com/YOUR_USERNAME/gmail-inbox-agent.git
cd gmail-inbox-agent

步骤2:将工作流导入n8n

  1. 打开n8n实例
  2. 点击 工作流→ 从文件导入
  3. 选择 workflow.json 来自此repo
  4. 点击 导入

步骤3:配置凭据

  • 分配您的 谷歌OAuth2 所有Gmail节点的凭据
  • 设置您的 Gemini API密钥 在HTTP请求节点URL中
  • 在筛选器节点中更新您的电子邮件地址

步骤4:激活

将工作流切换到 活跃的 --现在它将每小时自动运行一次。


🔌 MCP与Claude Desktop的集成

此工作流是通过以下方式构建和积极管理的 克劳德桌面版 使用n8n的MCP(模型上下文协议)服务器。这允许您通过Claude中的自然语言与n8n工作流进行交互。

安装说明

1.在n8n中启用MCP

在n8n实例设置中,启用MCP服务器功能并在以下项下生成API令牌:

Settings → API → Create API Token (with MCP scope)

2.配置克劳德桌面

编辑您的Claude Desktop配置文件:

  • 窗户: %APPDATA%\Claude\claude_desktop_config.json
  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

添加以下内容 mcpServers 块:

{
  "mcpServers": {
    "n8n-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "supergateway",
        "--streamableHttp",
        "http://localhost:5678/mcp-server/http",
        "--header",
        "authorization:Bearer YOUR_N8N_API_TOKEN"
      ]
    }
  }
}

替换 YOUR_N8N_API_TOKEN 其中令牌是在步骤1中生成的。

3.在启动Claude Desktop之前启动n8n

始终确保您的n8n实例在以下时间完全运行 http://localhost:5678 在打开Claude Desktop之前。MCP连接在启动时建立。

4.重新启动克劳德桌面

完全退出并重新打开Claude Desktop。现在,您应该看到n8n被列为已连接的工具。

使用Claude运行此工作流

连接后,您可以直接从Claude Desktop触发此工作流:

"Execute my Gmail inbox agent workflow"
"Run the Gemini email classifier"
"List my n8n workflows"
"Search for my job application workflow"

Claude将调用n8n MCP工具,执行工作流程,并在聊天中向您报告结果。


⚙️ 配置

设置 位置 默认值 描述
电子邮件回顾窗口 📥 Get Unprocessed Emails → 查询 newer_than:1d 取回电子邮件的时间有多远
您的电子邮件地址 🔍 Skip Emails Sent By Me → 过滤器 your-email@gmail.com 要排除的电子邮件
Gemini模型 🤖 Gemini: Classify Email → URL gemini-2.5-flash 必要时更改型号
计划间隔 ⏰ Run Every Hour → 规则 每1小时一次 代理多久运行一次
时区 工作流设置 Europe/Berlin 调整到您的时区
草稿回复最大字数 🔨 Build Gemini Payload → prompt 150字 AI生成草稿的最大长度

🚀 如何使用

一旦激活,工作流每小时都会完全自主运行。事情是这样的:

  1. 每小时,工作流会唤醒并检查Gmail
  2. 新电子邮件 最近24小时(尚未标记 processed)已取回
  3. 每封电子邮件 被Gemini AI归为一类
  4. 标签已应用 自动——如果需要,会动态创建新标签
  5. 拒绝工作 获取在“草稿”文件夹中创建的反馈请求答复草稿
  6. 所有已处理的电子邮件 被标记 processed 避免再加工

你将在Gmail中看到什么

运行几次后,您的Gmail将具有:

  • Job-Application-Related 相关电子邮件上的标签
  • Action-Needed 需要您注意的电子邮件标签
  • General-Purpose 在其他所有东西上贴标签
  • Draft-Created 在起草草稿的拒绝电子邮件上贴上标签
  • processed 所有已处理电子邮件上的标签
  • 准备好回复草稿以供审查并发送以拒绝工作

🛠️ 故障排除

问题 可能原因 修复
工作流未显示任何电子邮件 所有已标记的电子邮件 processed 删除 processed 从某些电子邮件中添加标签以重新处理
Gemini分类失败 API密钥无效或过期 在重新生成密钥 AI 工作室 并更新URL
Gmail身份验证错误 OAuth令牌已过期 在n8n凭据中重新授权
标签未创建 Gmail范围不足 使用上面列出的完整范围重新授权
Claude Desktop找不到n8n 在Claude启动之前n8n未运行 始终先启动n8n,然后重新启动Claude Desktop
Claude Desktop中的MCP超时 n8n响应时间过长 请检查n8n的运行状况 http://localhost:5678
用错误的语言起草回复 Gemini默认为英语 提示指示使用相同的语言回复——检查电子邮件片段质量

📁 仓库结构

gmail-inbox-agent/
├── README.md          ← You are here
└── workflow.json      ← n8n workflow export (import this into n8n)

📄 许可证

MIT许可证——可以自由分叉、修改和共享。


🙏 致谢


建于❤️ 并通过Claude Desktop+n8n MCP集成实现自动化