前段时间把 resend-hermes-bridge 做成了一个可以独立安装的小服务。这篇文章介绍一下它的新定位:让你和自己的 AI 小助理共用一個域名邮箱。
你可以把它理解为:给本地 AI 助理(比如 Hermes)配一个 [email protected] 的邮箱地址。别人往这个地址发邮件,AI 会读内容、看附件、决定怎么回复;平时收到的非机器人邮件,助理也会整理好通知你。发信则由助理通过 MCP 创建草稿、你确认后统一走 Resend 发出。
效果预览
下面是助理把邮件摘要和自动回复结果推送到不同聊天工具的样子:
| Telegram | |
|---|---|
![]() | ![]() |
为什么需要这个桥接层
邮件是一种很自然的”外部世界 → 本地 AI”通道,但直接让 AI 处理会有几个问题:
- 邮件服务商通过 Webhook 推送事件,需要验签、拉取正文和附件;
- AI 决定回复后,还要调用邮件 API 发出去;
- 中间涉及附件落盘、发信确认、失败恢复、审计日志,混在一起很难维护。
所以我把”邮件边界”拆成一个独立的 FastAPI 服务:AI 只负责决策,bridge 只负责落地。这样 Webhook 验签、Resend API、本地文件系统、Hermes 调用都各自收敛在桥接层,AI 侧只看到一个干净的 MCP 工具集。
核心功能
resend-hermes-bridge 现在主要做四件事:
-
接收 Resend 入站邮件
-
监听
email.receivedWebhook,校验 Svix 签名; -
拉取完整邮件正文、HTML 和附件;
-
命中机器人地址时交给本地 AI 处理,其他邮件仅通知主人。
-
-
让 AI 自动回复邮件
-
解析发件人、主题、正文和附件;
-
通过 prompt 把邮件任务交给 Hermes;
-
AI 返回
action=reply时,bridge 自动生成并发送回复邮件,支持 HTML 和内联图片。
-
-
统一对外发信与草稿确认
-
AI 通过 MCP 创建邮件草稿,真正发送前必须在聊天里确认;
-
确认后由 bridge 调用 Resend API 发信;
-
同时提供本地邮件历史的列表、搜索、查看、删除和标签管理。
-
-
通知与审计
-
支持把邮件通知发到 Telegram、QQ、微信机器人等你已经配置好的 Hermes 目标;
-
SQLite 记录每封邮件的事件、处理步骤、附件和发信结果;
-
启动时自动恢复未处理完成的 Webhook 事件,避免漏信。
-
架构概览
Resend Inbound | | email.received + Svix signature vFastAPI bridge (127.0.0.1:8765) | |-- fetch inbound email and attachments from Resend |-- write state to data/state.db |-- notify owner through Hermes send |-- run Hermes chat for bot-addressed emails |-- send Resend replies when Hermes returns action=reply | vHermes local runtime手动发信走另一条路径:
Hermes MCP resend_email | |-- confirmed=false: create local draft and show preview |-- user confirms in chat |-- confirmed=true + draft_id: bridge validates draft and sends |-- list/search/view/delete/tag local email history vResend outbound email几个设计上的取舍:
- 默认只绑定
127.0.0.1,不直接暴露公网; - Webhook 路径和发信路径分离,反向代理只转发
/webhooks/resend; - 附件严格限制在
data/attachments/和data/generated/下,防止路径遍历; - MCP 发信采用两步确认,先创建草稿,用户确认后再发送,避免 Agent 误操作;
- 通知目标可配置,通过
NOTIFICATION_TARGET指定 Telegram、QQ、微信机器人等; - 界面语言可配置,
BRIDGE_LANGUAGE支持中文或英文通知与邮件列表展示。
快速安装
前提:
- 本机已安装并配置好 Hermes;
- 有一个在 Resend 验证过的发信域名;
- Python >= 3.11。
git clone https://github.com/AnyAstra/resend-hermes-bridge.gitcd resend-hermes-bridge./scripts/install.sh安装脚本会:
- 检查 Hermes CLI 和
~/.hermes/config.yaml; - 检查 Python 版本;
- 创建
.venv并安装依赖; - 从
.env.example交互式生成.env; - 安装 systemd 用户服务并启动;
- 把 MCP server 注册到 Hermes
config.yaml。
主要配置项:
RESEND_API_KEY= # Resend API keyRESEND_WEBHOOK_SECRET= # Webhook 签名密钥RESEND_DOMAIN= # 你的域名,如 yourdomain.comAI_NAME=卡宝 # 通知里显示的 AI 名字NOTIFICATION_TARGET=telegram # 通知目标,也可改成 qqbot、weixin 等BRIDGE_LANGUAGE=zh # zh 或 en检查服务:
systemctl --user status resend-hermes-bridge.servicecurl http://127.0.0.1:8765/health如果 Hermes 会话已经打开,执行 /reload-mcp 重新加载 MCP 工具。
Resend 与 Nginx 配置
在 Resend 控制台:
- 添加并验证发信域名;
- 创建 API key,写入
RESEND_API_KEY; - 创建 Inbound Email Webhook,事件选
email.received; - 复制 Webhook Signing Secret,写入
RESEND_WEBHOOK_SECRET。
Nginx 只暴露 Webhook 路径:
location /your-resend-endpoint { proxy_pass http://127.0.0.1:8765/webhooks/resend; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;}注意不要把 /send、/show-draft 整个服务直接暴露到公网。
修改 .env 配置后,需要重启本项目和 Hermes Gateway 服务才能生效:
systemctl --user restart resend-hermes-bridge.servicehermes gateway restart运维常用命令
查看数据库健康状态:
.venv/bin/python scripts/manage.py status查看失败事件:
.venv/bin/python scripts/manage.py failed --limit 20查看某封邮件的处理步骤:
.venv/bin/python scripts/manage.py steps <email_id>查看 MCP 草稿:
.venv/bin/python scripts/manage.py drafts重新注册 MCP:
.venv/bin/python scripts/manage.py install-mcp查看服务日志:
journalctl --user -u resend-hermes-bridge.service -f安全注意
.env和data/都可能包含敏感信息,不要提交到仓库;- 公网 Webhook 入口只转发到本地
/webhooks/resend,且必须让签名校验继续生效; /send和/show-draft没有设计成公网认证 API,只能放在本机或可信内网;- AI 处理邮件时使用
--yolo,邮件正文和附件都是不可信输入,不要在高权限账户上运行。
总结
resend-hermes-bridge 是我把”邮件”作为 AI 助理外部接口的一次尝试。它没有试图做一个完整的邮件服务,而是专注于让本地 AI 安全地收发域名邮箱,同时把发信确认、附件管理、通知推送、审计日志这些边界问题收敛在一个小服务里。
如果你也在用 Hermes 或其他本地 AI 助理,并且有 Resend 域名,可以试试看。项目开源在 GitHub,MIT 协议,欢迎提 issue 或 PR。


