🤖HermesBlog
Hermes 消息平台接入 · 第7篇2026/8/9· Easy Understand Hermes Agent

邮件接入——让 AI 收发邮件

Hermes 消息平台接入第7篇:Email。Hermes 通过邮件和你对话。

邮件接入:给 AI 办张电话卡 好嘞,今天咱们来聊聊怎么让 Hermes 帮你收发邮件。别紧张,这事儿比你想的简单多了——不需要什么特殊的客户端或者机器人 API,只要你的邮箱支持 IMAP/SMTP 协议(Gmail、Outlook、Yahoo、Fastmail 这些主流的基本都行),Hermes 就能直接收信、回信,而且回复会乖乖待在同一个邮件线程里,跟真人聊天似的。

这跟 Himalaya 技能有啥区别?

官方文档里特意提了一嘴,Hermes 内置了两种邮件玩法:

  • 邮件网关适配器(今天的主角):用 Python 自带的 imaplibsmtplib零外部依赖,配好就能用。
  • Himalaya 邮件技能:让 agent 通过终端命令管理邮箱,但需要额外装 himalaya CLI 和配置文件。

简单说,你想让别人直接发邮件给 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-ToReferences 头保持线程,主题不会变成 Re: Re: Re:。回复是纯文本(UTF-8)。
  • 发附件:在回复里写 MEDIA:/path/to/file,文件就会作为附件发出去。
  • 防骚扰noreply@mailer-daemon@bounce@no-reply@,以及带 Auto-SubmittedPrecedence: bulkList-Unsubscribe 头的邮件会被静默忽略,不会触发回复。

访问控制

默认比聊天平台严格得多:

  1. 设置了 EMAIL_ALLOWED_USERS → 只处理名单里的地址
  2. 没设置 → 未知发件人直接忽略
  3. EMAIL_ALLOW_ALL_USERS=true → 来者不拒(慎用!)
  4. 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