邮件接入——让 AI 收发邮件
Hermes 消息平台接入第7篇:Email。Hermes 通过邮件和你对话。
好嘞,今天咱们来聊聊怎么让 Hermes 帮你收发邮件。别紧张,这事儿比你想的简单多了——不需要什么特殊的客户端或者机器人 API,只要你的邮箱支持 IMAP/SMTP 协议(Gmail、Outlook、Yahoo、Fastmail 这些主流的基本都行),Hermes 就能直接收信、回信,而且回复会乖乖待在同一个邮件线程里,跟真人聊天似的。
这跟 Himalaya 技能有啥区别?
官方文档里特意提了一嘴,Hermes 内置了两种邮件玩法:
- 邮件网关适配器(今天的主角):用 Python 自带的
imaplib和smtplib,零外部依赖,配好就能用。 - Himalaya 邮件技能:让 agent 通过终端命令管理邮箱,但需要额外装
himalayaCLI 和配置文件。
简单说,你想让别人直接发邮件给 agent 并收到回复,用网关适配器就对了。
准备工作
- 一个专用的邮箱账号(别拿你个人邮箱折腾)
- 开启 IMAP
- 如果用的是 Gmail 或开了双重验证的邮箱,需要生成应用专用密码(16 位那个,不是你的登录密码)
Gmail 用户去 App Passwords 生成一个就行。Outlook 用户去 Security Settings 里找。其他邮箱就去翻翻提供商的文档,记下 IMAP 和 SMTP 的主机和端口(一般是 993 和 587)。
Proton Mail Bridge / 本地中继
如果你用的是 Proton Mail Bridge(或者自建的本地 MTA 这类中继),它们监听的是回环地址,走 STARTTLS 加自签名证书,所以默认配置(IMAP 993 隐式 TLS、校验证书)是连不上的。需要在 ~/.hermes/config.yaml 里覆盖传输设置:
platforms:
email:
enabled: true
extra:
imap_host: 127.0.0.1
imap_security: starttls # tls (默认) | starttls | plain
imap_tls_verify: false # Bridge 用的是自签名证书
smtp_host: 127.0.0.1
smtp_security: starttls # 默认:465 端口用 tls,其他情况用 starttls
smtp_tls_verify: false
然后在 ~/.hermes/.env 里,配合 Bridge 的凭据一起设置 EMAIL_IMAP_PORT=1143 / EMAIL_SMTP_PORT=1025。*_security 填了无法识别的值会打一条警告,并回退到安全默认值。*_tls_verify 只在回环地址上关闭——如果对非回环主机关闭校验,Hermes 会打警告。
第一步:配置 Hermes
最省事的方式:
hermes gateway setup
选 Email,跟着向导填邮箱、密码、IMAP/SMTP 主机和允许发件人列表就行。
想手动配?打开 ~/.hermes/.env 加上这些:
# 必填
EMAIL_ADDRESS=hermes@gmail.com
EMAIL_PASSWORD=abcd efgh ijkl mnop # 应用专用密码
EMAIL_IMAP_HOST=imap.gmail.com
EMAIL_SMTP_HOST=smtp.gmail.com
# 安全(强烈推荐)
EMAIL_ALLOWED_USERS=your@email.com,colleague@work.com
# 可选
EMAIL_IMAP_PORT=993
EMAIL_SMTP_PORT=587
EMAIL_POLL_INTERVAL=15 # 轮询间隔(秒)
EMAIL_HOME_ADDRESS=your@email.com # cron 任务的默认投递目标
第二步:启动网关
hermes gateway # 前台运行
hermes gateway install # 安装为用户服务
sudo hermes gateway install --system # Linux 开机自启
启动时会自动测试 IMAP/SMTP 连接,把收件箱里已有的邮件标记为“已读”(只处理新邮件),然后开始轮询。
它是怎么工作的?
- 收信:默认每 15 秒检查一次未读邮件。主题行会作为上下文(比如
[Subject: Deploy to production]),回复邮件(Re:开头)不会重复加前缀。附件会缓存到本地——图片能喂给视觉工具,PDF、ZIP 等文档也能直接访问。HTML 邮件会去掉标签提取纯文本。 - 回信:通过 SMTP 发送,自动带上
In-Reply-To和References头保持线程,主题不会变成Re: Re: Re:。回复是纯文本(UTF-8)。 - 发附件:在回复里写
MEDIA:/path/to/file,文件就会作为附件发出去。 - 防骚扰:
noreply@、mailer-daemon@、bounce@、no-reply@,以及带Auto-Submitted、Precedence: bulk或List-Unsubscribe头的邮件会被静默忽略,不会触发回复。
访问控制
默认比聊天平台严格得多:
- 设置了
EMAIL_ALLOWED_USERS→ 只处理名单里的地址 - 没设置 → 未知发件人直接忽略
EMAIL_ALLOW_ALL_USERS=true→ 来者不拒(慎用!)platforms.email.unauthorized_dm_behavior: pair→ 未知发件人会收到配对码
强烈建议用专用收件箱 + 配置 EMAIL_ALLOWED_USERS,别让 agent 乱回陌生邮件。
不想收附件?
在 config.yaml 里加:
platforms:
email:
skip_attachments: true
附件会被跳过,但邮件正文照常处理。
常见问题
| 问题 | 解决 |
|---|---|
| 启动时报 “IMAP connection failed” | 检查 EMAIL_IMAP_HOST 和端口,确认邮箱已开启 IMAP(Gmail 在设置 → 转发和 POP/IMAP 里开) |
搞定!现在你的 Hermes 就能收发邮件了。去试试给它发一封吧,记得用允许列表里的地址哦。
📖 官方文档
本文根据 Hermes Agent 官方文档编写,原文见:官方文档 › user-guide/messaging/email