介绍利用OpenClaw与Microsoft Graph API搭建的自动邮件分类方案,以解决收件箱邮件混杂、管理繁琐的问题。方案通过Azure AD应用注册获取API权限,使用OAuth授权获取访问令牌,并编写脚本依据发件人域名匹配规则自动将未读邮件归类至对应文件夹,再通过定时任务执行分类并推送通知,从而实现邮件的高效自动化整理。
你的 Outlook 收件箱是不是也像一个无底洞?每天几十封邮件,有用的和没用的混在一起,翻半天找不到想要的那封。今天分享一个用 OpenClaw + Microsoft Graph API 搭建的自动邮件分类方案,让 AI 帮你把收件箱整理得井井有条。
为什么需要自动邮件分类?
先看看这些场景你是不是很熟悉:
📧 典型痛点
- Apple 的账单、Google 的安全提醒、Microsoft 的订阅通知混在一起
- 重要邮件(安全告警、密码重置)淹没在一堆促销邮件里
- 想按公司/项目分类,但手动拖文件夹太累
- 出差几天回来,收件箱几百封未读
理想状态是:邮件一进来就自动归类到对应文件夹,紧急邮件单独标记,你只需要看分类后的结果。
方案架构
整个方案由三部分组成:
1. Microsoft Graph API — 读取和操作 Outlook 邮件的接口
2. 分类脚本 — 按规则匹配发件人域名,决定邮件归类
3. OpenClaw 定时任务 — 每隔几小时自动执行,结果推送到飞书
整体流程:定时触发 → 调用 Graph API 拉取未读邮件 → 按规则匹配分类 → 移动到对应文件夹 → 推送通知。
第一步:Azure AD 应用注册
要访问 Outlook 邮件,需要在 Azure 门户注册一个应用。
1.1 创建应用
打开 Azure 门户 → Azure Active Directory → 应用注册 → 新注册。
⚠️ 关键点:账户类型一定要选「任何组织目录中的帐户和个人 Microsoft 帐户」。如果选了「仅我的组织」,个人 Outlook 账号就无法使用。
1.2 配置 API 权限
在应用的「API 权限」页面,添加以下 委托权限(不是应用程序权限):
Mail.Read— 读取邮件Mail.ReadWrite— 读取和移动邮件(分类必须)
添加后记得点击「授予管理员同意」。
1.3 创建客户端密码
在「证书和密码」页面创建一个新的客户端密码。记下 client_id、client_secret 和 tenant_id,后面脚本会用到。
⚠️ 安全提醒:这些凭据不要硬编码在脚本里,用环境变量或配置文件管理。
第二步:OAuth 授权获取 Token
Graph API 使用 OAuth 2.0 授权码流程。第一次需要手动授权,之后用 Refresh Token 自动续期。
授权流程
Step 1:在浏览器打开授权 URL(替换你的 client_id)
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=http://localhost:3000&scope=Mail.Read Mail.ReadWrite&response_mode=query
Step 2:登录 Outlook 账号并同意授权,浏览器会跳转到 localhost:3000?code=xxx,复制这个 code。
Step 3:用 code 换取 Access Token 和 Refresh Token
curl -X POST https://login.microsoftonline.com/common/oauth2/v2.0/token \
-d "client_id=YOUR_CLIENT_ID" \
-d "client_secret=YOUR_CLIENT_SECRET" \
-d "code=AUTH_CODE" \
-d "redirect_uri=http://localhost:3000" \
-d "grant_type=authorization_code"
返回的 JSON 里有 access_token(有效期约 1 小时)和 refresh_token(有效期 90 天以上)。
💡 提示:Refresh Token 长期不活跃(约 90 天无使用)会过期,需要重新授权。定时任务保持活跃即可避免。
第三步:编写分类脚本
核心逻辑:拉取未读邮件 → 解析发件人域名 → 匹配分类规则 → 移动到目标文件夹。
3.1 分类规则设计
按发件人邮箱域名匹配公司名称:
const classificationRules = [
{ pattern: /apple\.com|icloud\.com/i, folder: "Apple" },
{ pattern: /google\.com|gmail\.com/i, folder: "Google" },
{ pattern: /microsoft\.com|outlook\.com/i, folder: "Microsoft" },
{ pattern: /nvidia\.com/i, folder: "NVIDIA" },
{ pattern: /synology\.com/i, folder: "Synology" },
{ pattern: /paypal\.com/i, folder: "PayPal" },
// 继续添加更多规则...
];
3.2 紧急邮件识别
除了按公司分类,还需要识别紧急邮件。检查邮件主题是否包含关键词:
const urgentKeywords = /security|密码|password|urgent|重要|verification/i;
if (urgentKeywords.test(subject)) {
targetFolder = "Inbox-紧急";
}
3.3 移动邮件
用 Graph API 的 move 端点把邮件移动到目标文件夹:
// 移动邮件
await fetch(
`https://graph.microsoft.com/v1.0/me/messages/${messageId}/move`,
{
method: "POST",
headers: {
"Authorization": `Bearer ${accessToken}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ destinationId: folderId }),
}
);
3.4 自动创建文件夹
如果目标文件夹不存在,先创建:
async function ensureFolder(accessToken, folderName) {
// 先查询是否已存在
const res = await fetch(
`https://graph.microsoft.com/v1.0/me/mailFolders?$filter=displayName eq '${folderName}'`,
{ headers: { "Authorization": `Bearer ${accessToken}` } }
);
const data = await res.json();
if (data.value.length > 0) return data.value[0].id;
// 不存在则创建
const createRes = await fetch(
"https://graph.microsoft.com/v1.0/me/mailFolders",
{
method: "POST",
headers: {
"Authorization": `Bearer ${accessToken}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ displayName: folderName }),
}
);
return (await createRes.json()).id;
}
第四步:配置定时任务
用 OpenClaw 的 cron 功能定时执行分类脚本。建议每 4 小时检查一次。
每次执行完成后,把分类结果(处理了多少封、各文件夹分布)推送到飞书,方便随时了解邮件状态。
Token 自动刷新
脚本每次执行前检查 Access Token 是否过期,如果过期则用 Refresh Token 换取新的:
async function refreshToken(refreshToken) {
const res = await fetch(
"https://login.microsoftonline.com/common/oauth2/v2.0/token",
{
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
client_id: process.env.AZURE_CLIENT_ID,
client_secret: process.env.AZURE_CLIENT_SECRET,
refresh_token: refreshToken,
grant_type: "refresh_token",
}),
}
);
return res.json();
}
实际效果
部署后的效果数据:
- 一次性整理了 500+ 封历史邮件
- 自动创建了 40+ 个按公司分类的文件夹
- 收件箱瞬间清空,只剩下「其他」类的几封
- 紧急邮件(安全告警、密码相关)单独归类,不会错过
✅ 最爽的体验:早上打开邮箱,发现新邮件已经被分类好了,不用自己动手。
常见问题
Q1: 应用注册后个人账号无法访问?
检查 Azure AD 应用的「支持的账户类型」。必须选择「任何组织目录中的帐户和个人 Microsoft 帐户」,选「仅我的组织」会导致个人账号被拒。
Q2: API 返回 403 错误?
确认使用的是 委托权限(Delegated),不是应用程序权限(Application)。个人 Outlook 账号需要委托权限。
Q3: Refresh Token 会过期吗?
有效期通常 90 天以上,但如果长期不活跃(无 API 调用)会被吊销。定时任务保持每 4 小时运行一次,就不会过期。
Q4: 如何添加新的分类规则?
在分类规则数组里加一条正则匹配即可。比如要新增 Amazon 的分类:
{ pattern: /amazon\.com/i, folder: "Amazon" }
总结
通过 Microsoft Graph API + OpenClaw 的组合,可以实现:
- ✅ 自动读取和分类 Outlook 邮件
- ✅ 按发件人公司智能归类到文件夹
- ✅ 紧急邮件单独标记不遗漏
- ✅ 定时执行,无需人工干预
- ✅ 执行结果推送到飞书通知
整个方案不需要额外付费,只需要一个 Azure AD 免费账号和 OpenClaw 即可。如果你也被 Outlook 邮件管理困扰,不妨试试这个方案。

暂无评论
要发表评论,您必须先 登录