跳到主要内容

电子邮件

Hermes 可以通过标准 IMAP 和 SMTP 协议接收并回复电子邮件。给 agent 的邮箱发邮件,它就会在线程内回复,无需专用客户端或 bot API。适用于 Gmail、Outlook、Yahoo、Fastmail,或任何支持 IMAP/SMTP 的邮箱服务。

无需额外依赖

Email 适配器使用 Python 内置的 imaplibsmtplibemail 模块,不需要额外安装 Python 包或外部服务。


前提条件

  • 为 Hermes agent 准备一个专用邮箱账号(不要使用你的个人邮箱)
  • 该邮箱账号已启用 IMAP
  • 如果使用 Gmail 或其他启用了 2FA 的服务,需要应用专用密码

Gmail 设置

  1. 在 Google 账号中启用两步验证
  2. 打开 App Passwords
  3. 新建一个应用专用密码(选择 “Mail” 或 “Other”)
  4. 复制这串 16 位密码,后续用它替代普通登录密码

Outlook / Microsoft 365

  1. 打开 Security Settings
  2. 如未启用,则开启 2FA
  3. 在 “Additional security options” 下创建一个 App Password
  4. IMAP 主机:outlook.office365.com,SMTP 主机:smtp.office365.com

其他邮箱服务

大多数邮箱服务都支持 IMAP/SMTP。查阅对应文档,确认:

  • IMAP 主机和端口(通常是 993 + SSL)
  • SMTP 主机和端口(通常是 587 + STARTTLS)
  • 是否要求应用专用密码

第 1 步:配置 Hermes

最简单的方式:

hermes gateway setup

在平台列表里选择 Email。向导会提示你填写邮箱地址、密码、IMAP/SMTP 主机以及允许的发件人。

手动配置

~/.hermes/.env 中加入:

# Required
EMAIL_ADDRESS=hermes@gmail.com
EMAIL_PASSWORD=abcd efgh ijkl mnop # App password (not your regular password)
EMAIL_IMAP_HOST=imap.gmail.com
EMAIL_SMTP_HOST=smtp.gmail.com

# Security (recommended)
EMAIL_ALLOWED_USERS=your@email.com,colleague@work.com

# Optional
EMAIL_IMAP_PORT=993 # Default: 993 (IMAP SSL)
EMAIL_SMTP_PORT=587 # Default: 587 (SMTP STARTTLS)
EMAIL_POLL_INTERVAL=15 # Seconds between inbox checks (default: 15)
EMAIL_HOME_ADDRESS=your@email.com # Default delivery target for cron jobs

第 2 步:启动网关

hermes gateway              # Run in foreground
hermes gateway install # Install as a user service
sudo hermes gateway install --system # Linux only: boot-time system service

启动时,适配器会:

  1. 测试 IMAP 和 SMTP 连接
  2. 将当前收件箱里已有的邮件全部标记为“已读”(只处理新邮件)
  3. 开始轮询收取新邮件

工作原理

接收消息

适配器会按可配置的时间间隔(默认 15 秒)轮询 IMAP 收件箱中的 UNSEEN 邮件。对每一封新邮件:

  • 邮件主题会作为上下文加入(例如 [Subject: Deploy to production]
  • 回复邮件(主题以 Re: 开头)会跳过主题前缀,因为线程上下文通常已经建立
  • 附件会缓存在本地:
    • 图片(JPEG、PNG、GIF、WebP)→ 可供视觉工具使用
    • 文档(PDF、ZIP 等)→ 可供文件访问
  • 纯 HTML 邮件会先去标签再提取纯文本
  • 自己发给自己的邮件会被过滤,防止形成回复回路
  • 自动邮件 / noreply 发件人会被静默忽略,如 noreply@mailer-daemon@bounce@no-reply@,以及带有 Auto-SubmittedPrecedence: bulkList-Unsubscribe 头的邮件

发送回复

回复通过 SMTP 发送,并正确维护邮件线程:

  • 使用 In-Reply-ToReferences 头保持线程关系
  • 主题会保留并带上 Re: 前缀(不会出现重复的 Re: Re:
  • Message-ID 使用 agent 所在域名生成
  • 回复以纯文本(UTF-8)发送

文件附件

agent 可以在回复中发送附件。在响应里包含 MEDIA:/path/to/file,该文件就会作为附件加入发出的邮件。

跳过附件

如果你想忽略所有入站附件(例如为了防恶意软件或节省带宽),可在 config.yaml 中加入:

platforms:
email:
skip_attachments: true

启用后,附件和内联部分会在解码前被直接跳过,但邮件正文仍会正常处理。


访问控制

Email 平台与其他 Hermes 平台保持一致:

  1. 设置了 EMAIL_ALLOWED_USERS → 仅处理这些地址发来的邮件
  2. 未设置 allowlist → 未知发件人会收到配对码
  3. 设置 EMAIL_ALLOW_ALL_USERS=true → 接受任意发件人(请谨慎使用)
注意

务必配置 EMAIL_ALLOWED_USERS 否则,只要知道 agent 的邮箱地址,任何人都可以给它发送命令,而 agent 默认拥有终端访问能力。


故障排除

ProblemSolution
启动时出现 “IMAP connection failed”检查 EMAIL_IMAP_HOSTEMAIL_IMAP_PORT 是否正确;确认邮箱已启用 IMAP。Gmail 用户需在 Settings → Forwarding and POP/IMAP 中打开。
启动时出现 “SMTP connection failed”检查 EMAIL_SMTP_HOSTEMAIL_SMTP_PORT;确认密码正确(Gmail 应使用 App Password)。
收不到邮件检查 EMAIL_ALLOWED_USERS 是否包含该发件人;同时查看垃圾邮件文件夹,部分服务商会把自动回复判为垃圾邮件。
“Authentication failed”Gmail 必须使用 App Password,不能用普通密码;且前提是先开启 2FA。
重复回复确认只运行了一个 gateway 实例;可检查 hermes gateway status
响应很慢默认轮询间隔为 15 秒;可改为 EMAIL_POLL_INTERVAL=5 以更快响应,但 IMAP 连接次数也会增加。
回复没有串在线程里适配器会设置 In-Reply-To 头,但部分邮件客户端(尤其某些 Web 邮箱)对自动消息的线程识别并不稳定。

安全

注意

使用专用邮箱账号。 不要用你的个人邮箱,因为 agent 会把密码保存在 .env 中,并且通过 IMAP 拥有完整收件箱访问权限。

  • 优先使用 App Password,不要使用主密码(尤其是 Gmail + 2FA)
  • 设置 EMAIL_ALLOWED_USERS 来限制谁能与 agent 交互
  • 密码保存在 ~/.hermes/.env 中,请妥善保护此文件(例如 chmod 600
  • 默认情况下,IMAP 使用 SSL(993 端口),SMTP 使用 STARTTLS(587 端口),连接本身是加密的

环境变量参考

VariableRequiredDefaultDescription
EMAIL_ADDRESSYesagent 使用的邮箱地址
EMAIL_PASSWORDYes邮箱密码或应用专用密码
EMAIL_IMAP_HOSTYesIMAP 服务器主机(如 imap.gmail.com
EMAIL_SMTP_HOSTYesSMTP 服务器主机(如 smtp.gmail.com
EMAIL_IMAP_PORTNo993IMAP 服务器端口
EMAIL_SMTP_PORTNo587SMTP 服务器端口
EMAIL_POLL_INTERVALNo15收件箱轮询间隔(秒)
EMAIL_ALLOWED_USERSNo逗号分隔的允许发件人地址
EMAIL_HOME_ADDRESSNocron 任务默认投递目标
EMAIL_ALLOW_ALL_USERSNofalse允许所有发件人(不推荐)