从 Zapier 到 SmolAgents:使用 AI 自动处理电子邮件的分步指南

这篇指南面向谁?为什么它很重要?
作为一名数据和 AI 顾问,我定期采访来自各行各业和背景的人。我们一起尝试找出重复性任务——尤其是那些令人烦恼、耗时或高风险的任务。
无论哪个行业,几乎总会提到一项任务:管理收件箱。对许多专业人士来说,这是一场日常的斗争,耗费数小时,增加压力,并打乱注意力。每天,我们都必须筛选无数封电子邮件——识别哪些只是垃圾邮件,哪些我们只是被抄送可以安全忽略,以及哪些需要我们关注,有时甚至很紧急。
在本文中,我们将深入探讨如何利用 AI 来简化您的收件箱——从一个简单的、无代码友好的方法开始,自动使用“推广”、“未读”或“紧急”等标签标记电子邮件。
我还将向您展示如何使用 Hugging Face 的 smolagents 构建您自己的 AI 电子邮件助手——它能够检查您的收件箱并回答以下问题:我是否有新邮件?它们来自哪里?它们是关于什么的?您能总结一下吗?有紧急的吗?
这些教程只需少量代码,为构建更具交互性、更智能的电子邮件伴侣打开了大门。
在我看来,这是电子邮件自动化中最平衡的两种方法。有些人习惯于让 AI 自主处理简单的电子邮件,而另一些人则不愿放弃这种程度的控制。这些小小的第一步提供了一个折衷方案:它们帮助您浮现最重要的消息,将其总结为几行,或者提出相关问题——所有这些都不会代表您采取行动。您的 AI 助手成为一个有用的向导,而不是一个独立的决策者,确保您完全掌控您的收件箱。
这种自动化非常适合任何希望以简单实用的方式将 AI 集成到其工作流程中的人。此外,标记您的电子邮件使分类、删除不必要的电子邮件或处理后归档变得更容易。保留不相关的电子邮件毫无意义——无论是对您的生产力还是对环境而言——因为存储过多的数据会导致不必要的内存消耗。
然而,此代理会读取您的电子邮件内容,因此在授予访问权限时务必小心——尤其是在为共享或生产环境调整代码时。
AI 与 AI 代理?
为了澄清,我们首先区分简单的 AI 模型和 AI 代理。
标准 AI 模型,如聊天机器人或图像分类器中使用的模型,旨在处理数据、生成预测或回答特定问题。然而,这些模型不会自主行动——它们在收到提示时响应,但它们不会自行启动行动或管理工作流程。
另一方面,AI 代理将 AI 能力(如理解或生成文本)与决策和行动能力相结合。这就是它们如此具有变革性的原因。
当我们谈论使用 AI 提高生产力时,我们越来越多地指的是 AI 代理——这些系统不仅能够分类或预测,还能决定下一步要做什么并实际在您的工具和应用程序中执行操作。
例如,AI 代理可以分析您的收件箱,确定哪些邮件是紧急的,并自动在您的收件箱中应用标签——而无需您进行干预。除了电子邮件,代理还可以编写文档、将文件保存到正确的文件夹,甚至在不同的应用程序中触发操作,从而有效地协调复杂的工作流程。
简而言之,AI 代理是一个自主系统,能够感知、决策和行动——它将传统 AI 能力与在您的环境中采取有意义行动的能力相结合。
近年来,无代码和低代码解决方案使得构建简单的 AI 代理变得异常容易——包括用于电子邮件管理等用例。
在本文的第一部分,我们将使用 Zapier,一个原生集成 ChatGPT 的无代码自动化平台,来构建我们自己的迷你代理。实际上,我们将构建一个简单的 AI 自动化,有时被称为“迷你 AI 代理”。虽然它不是一个能够独立决策的完全自主 AI 代理,但它是进入 AI 辅助工作流程世界的完美第一步——所有这些都无需编写一行代码。
其工作原理如下:当收到新邮件时,迷你代理会自动触发。然后,邮件内容会发送给 ChatGPT,ChatGPT 对其进行分析和分类。根据分类(紧急、未读、宣传),迷你代理会直接将相应的标签应用到邮件上。
虽然 AI 处理在幕后进行,但结果——每封邮件上的清晰标签——将是可见的并立即有用,以帮助您优先处理收件箱。
让我们开始构建吧!
第一部分 — 无代码方法:使用 Zapier 自动标记您的电子邮件
第 0 步:开始使用 Zapier — 创建您的账户和第一个 Zap
我们将使用 Zapier,这是一个无代码自动化平台,您可以在这里访问。使用 Zapier,您可以轻松自动化工作流程和重复性任务——我们在此将其呈现为迷你 AI 代理。这是帮助您的团队适应 AI 增强自动化并开始了解 AI 代理潜力的绝佳第一步。
首先,只需点击 Zapier 主页右上角的“注册”按钮,创建您的账户并按照提供的步骤操作。此过程类似于在任何其他平台上注册,登录步骤也相同。
登录后,您就可以开始创建自动化工作流程了——包括我们在这份指南中构建的迷你 AI 代理。在 Zapier 中,这些自动化工作流程被称为 Zap。
您将看到一个像这样的页面,Zapier 徽标下方有一个橙色的“创建”按钮。点击此按钮,您将看到几个选项——第一个是“Zaps”,这是我们创建迷你 AI 代理需要选择的选项。

第 1 步:设置触发器
点击“创建 Zap”后,您将被重定向到此页面——这是您自动化流程的草稿。

在本例中,它是一个迷你 AI 代理,您稍后将发布。它可以保持私有,只有您才能访问,但发布它允许您激活 Zap,使其工作并在您收到电子邮件时触发。触发器显示在图片中第一个灰色矩形中。
左键单击“触发器”一词并选择您的邮箱类型。例如,Gmail 和 Outlook 可以与 Zap 一起使用。在我的例子中,我使用的是 Gmail。点击 Gmail 后,我就可以设置触发器了。界面的右侧应如下所示:
在“触发事件”部分,选择“新邮件”。在“账户”下,选择您希望 Zap 使用的电子邮件账户。您需要授权 Zapier 访问此账户才能继续下一步。完成后,点击设置面板底部的“继续”。
在“配置”部分,您可以指定要考虑的电子邮件标签(至少在 Gmail 版本中)。在这里,我们将选择“收件箱”来跟踪收到的电子邮件,同时排除已发送的电子邮件。或者,我们可以根据“垃圾邮件”或“重要”等标签过滤电子邮件,但对于此用例,我们将跟踪所有收件箱电子邮件。
点击“继续”,您将被带到“测试”部分,您可以在其中测试触发器。点击“查找新记录”将在您的电子邮件账户中搜索最近的电子邮件,并将其显示为“电子邮件 A”、“电子邮件 B”等。如果此列表出现并与您的最近电子邮件匹配,则表示触发器已成功设置并正常运行。我们现在可以通过从列表中选择一封电子邮件,点击它,然后选择“继续处理选定的记录”来进入第 2 步。
第 2 步:创建您的标签
我们现在将在我们的邮箱中创建标签。本教程我将使用 Gmail,但 Outlook 也可以,因为它受 Zapier 支持。也就是说,至少对于 Gmail,您将无法通过 Zapier 为此类用例使用默认系统标签。本教程将重点介绍 Gmail,但如果您使用的是 Outlook,可以参考 Microsoft 的文档了解如何创建自定义标签。
在您的 Gmail 收件箱屏幕左侧,您可以找到“标签”一词。

点击“+”按钮创建您的标签。在我的例子中,我将它保持简单,分为三个类别:“紧急”、“待读”和“推广”。当然,您可以根据自己的需要自定义标签的数量和名称,尤其是考虑到大多数邮箱都已经包含基本的垃圾邮件过滤功能。选择标签名称后,您可以跳过可选的设置步骤,直接点击“创建”。
您新创建的标签现在将出现在屏幕左侧的“标签”下。通过点击每个标签旁边的三个垂直点,您还可以为其分配颜色,以帮助您在收件箱中进行视觉区分。
第 3 步:设置操作
现在,让我们回到 Zapier,返回到我们的 Zap 草稿,以设置触发器后要执行的操作。
在步骤 1 结束时,您点击了“继续处理所选记录”,这提示您选择一个平台进行操作。在这种情况下,我们想使用一个聊天机器人,例如 ChatGPT 或 Claude。由于我有 ChatGPT 的高级账户,但没有 Claude 的,所以我将使用 ChatGPT 进行此设置。
接下来,我们需要配置此操作步骤。在“操作”下,为 ChatGPT 选择“对话”或为 Claude 选择“发送消息”。这将把您的请求发送到所选平台。请求本身将在以下步骤的设置过程中定义。

在“账户”部分,您将被要求连接到 OpenAI 或 Anthropic 以获取 API 密钥,这允许 Zapier 与平台进行交互。按照指导步骤操作,完成后,点击“继续”。然后您需要选择一个特定的 OpenAI 模型。我选择了 gpt-3.5-turbo-instruct。您可以更改模型,但它需要与“发送提示”操作兼容。提示可以根据您的需求进行自定义,但这是我使用的提示:
“你能总结一下所附邮件的主题吗?它是紧急的、纯粹的信息性邮件,还是需要回复?在你的回复中,你只应返回以下标签之一:如果邮件看起来很紧急,则返回 Label_9197795683686362960;如果是新闻简报或类似广告或垃圾邮件,则返回 Label_662747571271887962;如果是工作相关的邮件(例如,客户通信、会议通知或同事的消息),则返回 Label_6307763309029050364。除了标签之外,不要包含任何其他文本。”
将标签 ID 替换为您在上一步中使用的 ID。在此示例中,这些标签对应于 Gmail 类别:Label_9197795683686362960 表示“紧急”,Label_6307763309029050364 表示“待读”,Label_662747571271887962 表示“推广”。换句话说,我们正在指示 ChatGPT 根据邮件内容对其进行分类。
由于提示引用了邮件正文,我们需要将此数据提供给 ChatGPT。为此,请点击提示字段中的“+”图标(见下方截图)并添加以下变量:
- 纯文本正文
- 主题
- 消息 ID
- 所有附件
如截图所示,它们显示在提示的末尾。

通过包含这些元素,ChatGPT 将能够访问每封新邮件所需的信息,从而准确分类消息。
其他参数无需更改此分类类型,因此您可以点击“继续”,然后在“测试”选项卡中点击“测试步骤”。如果没有出现错误消息,您可以点击“发布”,我们将进入最终设置步骤。
最后一步:自动标记您的电子邮件
现在,让我们添加最后一步。我们将使用我们的电子邮件平台——在我的例子中是 Gmail——并选择“给电子邮件添加标签”操作。确保您使用的是与步骤 1 相同的账户,然后点击“继续”进入“配置”部分。
在“标签”下,点击三个垂直点并选择“自定义”。会出现一个“+”按钮——点击它并选择“2. 回复”,这对应于 ChatGPT 对您的提示的回复,并且应该包含一个标签 ID。
接下来,在“消息”字段中,再次点击三个垂直点并选择“自定义”。点击“+”按钮并选择“1. Gmail 上的新邮件”,然后选择“消息 ID”。

点击“继续”,Zapier 将提供测试您的 Zap。只需点击“测试步骤”。如果一切设置正确,您就可以发布您的 Zap 了。
为了确认它正在工作,请检查您在步骤 1 中使用的测试邮件——您现在应该看到正确的标签已自动应用。
最后,点击“发布”以激活您的 Zap。从现在开始,每次您收到邮件时,标签都会自动添加!
总而言之,以下是 Zapier 中工作流程的示意图,包括所有步骤:触发器和接下来的两个操作。

第二部分 — 更进一步:您的下一个收件箱助手,由 “smolagents” 提供支持
这个 Zap 非常适合那些寻求快速设置和轻松自动化的人。它在后台安静运行,根据简单的规则标记电子邮件——无需交互,无需向 ChatGPT 提问。它只是一个有用的助手在幕后完成工作。
但是,如果您准备更进一步,Hugging Face 引入了一个名为“smolagents”的新库。有了它,您可以构建一个代理,该代理可以读取您的电子邮件,告诉您它们的紧急程度,总结它们,或者按需提取特定信息。
设置它确实需要一点好奇心——您需要熟悉 Hugging Face 工具和编写一些 Python 代码。但别担心:它对初学者完全友好,是您尝试智能自动化的绝佳方式。
严格来说,该代理在此阶段不会执行任何强操作,例如删除或自动回复电子邮件。相反,它将选择回答您的查询所需的工具,并进行推理。该代理可以访问原生工具(例如网络搜索以检查“紧急程度”的定义和常见相关术语)和自定义工具——例如我们在此处构建的工具。它可以根据其需求决定使用其中任何一个。
第 0 步:创建您的 Hugging Face 空间
Hugging Face Spaces 允许您直接在您的账户中托管轻量级应用程序。在我们的例子中,我们将使用它来部署一个自定义代理,您可以通过一个简单的可视化界面与它聊天——非常类似于 ChatGPT。不同之处在于?这个代理连接到您的电子邮件账户。您可以询问它邮件的紧急程度,提取特定信息,获取摘要等等。
首先,您需要一个 Hugging Face 账户(如果没有,请创建一个),然后创建一个新的空间。
您可以通过点击右上角的个人资料图标,然后选择“新建空间”来完成此操作,如以下屏幕截图所示。

我们现在将使用 smolagents 库——一个来自 Hugging Face 的新工具,旨在帮助您构建可以实际执行操作的 AI 代理。您可以将它们连接到自定义工具,集成 RAG 管道,以及更多。
接下来的步骤将直奔主题,引导您完成让电子邮件代理正常运行的基本要素。也就是说,本指南基于 Hugging Face AI 代理课程中的概念,该课程对塑造这个项目非常有帮助。
如果您对幕后工作原理感到好奇,或者您正在考虑为不同的用例构建代理,我强烈推荐您查看该课程!
第 1 步:通过自定义工具让您的代理访问您的电子邮件
现在我们来编写 `tools.py` 文件,它将包含定义自定义工具类的 Python 代码。在此示例中,我们将重点介绍如何连接到 Gmail 账户,基于下面链接的教程。但是,您可以对其进行调整,使其适用于其他电子邮件提供商,例如 Outlook,只要您能够为您的代理创建 API 连接(您可以在网上找到针对每个特定服务的教程)。
链接的指南会引导您完成激活和配置 Gmail API 所需的一切,并提供了我们将在自定义工具类中重用的核心代码。因此,这里不再重复,我们将直接介绍最终的类。
以下是 `tools.py` 的完整代码,后面将对其工作原理进行详细说明。
from smolagents import Tool
import os.path
import email
import base64
from google.auth.transport.requests import Request
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
# If modifying these scopes, delete the file token.json.
SCOPES = ["https://www.googleapis.com/auth/gmail.readonly"]
class Mail_retriever(Tool):
name = "unread_mails"
description = "Fetches new and unread mails from gmail."
inputs = {
"user_cred": {
"type": "string",
"description": "The name of the user whose emails are being retrieved."
}
}
output_type = "string"
def forward(self, user_cred: str):
creds = None
if os.path.exists("token.json"):
creds = Credentials.from_authorized_user_file("token.json", SCOPES)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file("credentials.json", SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open("token.json", "w") as token:
token.write(creds.to_json())
try:
# Call the Gmail API
service = build("gmail", "v1", credentials=creds)
results1 = service.users().messages().list(userId="me", labelIds=["INBOX", "UNREAD"]).execute()
messages = results1.get("messages", [])
if not messages:
print("No unread mails")
return
print("Messages:")
for mail in messages:
result = service.users().messages().get(userId="me", id=mail["id"], format="raw").execute()
mail_content = email.message_from_bytes(base64.urlsafe_b64decode(result["raw"]))
message_main_type = mail_content.get_content_maintype()
if message_main_type == "multipart":
for part in mail_content.get_payload():
if part.get_content_maintype() == "text":
result = part.get_payload()
elif message_main_type == "text":
result = mail_content.get_payload()
return f"{user_cred}, you have new mails: {result}."
except HttpError as error:
# TODO(developer) - Handle errors from gmail API.
print(f"An error occurred: {error}")
此代码基于我们之前链接的教程,该教程解释了如何将 Python 连接到 Gmail。但是,它已进行了调整,以适应 smolagents 库所需的结构。
其工作原理如下:我们定义了一个继承自 Tool 的类,这向库表明它是一个代理可以使用的自定义工具。我们为该工具命名并提供描述——两者都很重要,因为它们有助于代理理解该工具的功能以及何时使用它。
我们还定义了预期的输入格式——在此例中,它是一个字符串形式的用户姓名。这是可选的,但可以帮助代理个性化其响应。输出类型也已指定,这使得代理能够正确处理结果并自主行动。
该工具的核心是 `forward` 方法——这是 `smolagents` 框架中必需的方法名称。在其中,我们编写了读取凭据文件(如果它已经存在)或创建它(如果它不存在)的逻辑。
一旦代理连接到您的收件箱,它就会检查新消息——通过标签 ID 过滤,您可以在 `results1 = service.users().messages().list(userId=”me”,labelIds=[“INBOX”,”UNREAD”]).execute()` 这一行自定义。当检测到新邮件时,该工具会返回邮件的完整文本内容。这是对原始 Gmail API 教程的关键改进,因为原始教程只检索元数据——不足以进行摘要或紧急程度检测。
第 2 步:定义您的项目依赖项
与任何项目仓库一样,您将在主文件夹中创建 `requirements.txt` 文件,列出代码中使用的所有库。在我们的例子中,此文件包含以下几行,您可以直接复制粘贴:
smolagents google.auth google_auth_oauthlib google-api-python-client
smolagents 是用于配置您的自主代理并为其配备自定义工具的核心库。它最初由 Hugging Face 引入并推广,旨在保持代理的轻量化、模块化和易于组合。
要将您的代理连接到 Gmail,您需要一些与 Google 相关的库:google-auth、google-auth-oauthlib 和 google-api-python-client。
这些库处理身份验证(通过 OAuth 2.0)和对 Gmail 收件箱的 API 访问——允许代理读取、分析和回复电子邮件。
对于用户界面,此项目使用 Gradio,它提供了一种快速构建基于 Web 的前端的方法。大多数 Hugging Face Spaces 默认都包含 Gradio,但如果它不存在,您可以通过在 `requirements.txt` 中添加一行简单的代码来添加它。
gradio
无论何时修改或添加代码文件,请确保所有必要的依赖项都已正确列出。一个快速的手动方法是检查每个文件顶部的导入语句,并验证每个相应的库是否已包含在 `requirements.txt` 中。完成后,将文件保存到项目目录的根目录——Hugging Face 将在部署期间自动使用它。
第 3 步:在 app.py 中整合所有内容
app.py 文件是您应用程序的主要入口点。它定义了您的代理,集成了任何自定义工具,选择了要使用的语言模型,并启动了 Gradio 界面。
该文件通常遵循标准结构:
import gradio as gr
from smolagents import GradioUI, CodeAgent, HfApiModel
# Import our custom tools from their modules
from tools import Mail_retriever
# Initialize the Hugging Face model
model = HfApiModel("Qwen/Qwen2.5-Coder-32B-Instruct", max_tokens=10000)
# Initialize the weather tool
mail_tool = Mail_retriever()
# Create Alfred with all the tools
alfred = CodeAgent(
tools=[mail_tool],
model=model,
add_base_tools=True, # Add any additional base tools
planning_interval=3 # Enable planning every 3 steps
)
if __name__ == "__main__":
GradioUI(alfred).launch()
它导入所有必需的库和模块,包括来自 tools.py 的自定义工具——在此例中是 Mail_retriever。
语言模型使用 Hugging Face API 进行初始化。在此示例中,我们直接通过 Hugging Face hub ID 使用 Qwen2.5-Coder-32B-Instruct 模型。
接下来,我们实例化我们的工具——这里是一个简单的电子邮件检索工具——并配置代理。我们称之为 Alfred,为其配备自定义工具、语言模型和一些可选参数,如规划频率。
最后,我们初始化并启动 Gradio UI,使应用程序具有交互性并准备好部署。
此布局为构建和扩展您的 AI 代理提供了清晰的模块化基础。您可以在未来的迭代中轻松添加新工具、更换模型或扩展逻辑。
就这样,您完成了。
一旦您将更改提交到您的空间,应用程序就会启动并显示您的聊天机器人界面。您现在可以尝试一个提示,例如:
“你好,我叫 Cindy,我想知道我的 Gmail 上是否有新邮件。如果有,它们看起来紧急吗?请使用你唯一的自定义工具。”
代理将处理您的请求,显示每个推理步骤以及在此过程中使用了哪些工具。
以下是几张截图,展示了助手如何处理我自己的提示。它分析的电子邮件是我在注册培训计划后收到的一封自动邮件。我被要求回复并填写会员简报——如果我想确保我的名额,这当然是紧急的。








下一步是什么?迈向真正智能的 AI 代理(改进机会)
这些迷你代理仍然相当简单。例如,自动回复尚未实现,紧急性的概念可能会因上下文或提示措辞而异——这些都是未来改进的领域。也就是说,这个原型提供了一个很好的第一步,以轻量级、低代码的方法进入自动化和基于代理的工作流程世界。
smolagent 库的一个关键优势是透明性:您可以跟踪代理推理过程的每一步。这使得调试变得容易得多——如果出现问题,您将确切地看到在哪里以及为什么。
只需几行代码和一个自定义工具,我们就创建了一个像人类一样开始推理的电子邮件助手。还有很长的路要走——但基础就在这里。试一试,想象一下您自己的智能代理能做什么。