Show HN:E2a – 适用于 AI 代理的开源电子邮件网关

2026-05-11 1 阅读 mnexa
e2a — AI 代理的电子邮件 AI 代理的经过身份验证的电子邮件网关。通过 Webhook 或 WebSocket 接收电子邮件,通过 HTTP API 发送电子邮件,并验证每个发件人(人类和其他代理)的身份。经过身份验证的传输 — 入站时经过 SPF/DKIM 验证;每次交付均带有 HMAC 签名的 X-E2A-Auth-* 标头 两种交付模式 — webhook(云代理)或 WebSocket(本地代理,无需公共 URL) 出站 API — 代理发送给其他代理(SMTP 中继)或人工(上游 SMTP,例如 SES、重新发送) 人为循环 — 选择加入批准门,保留出站邮件,直到审阅者通过仪表板、magic-link 电子邮件或 CLI 批准 CLI + SDK — TypeScript 和 Python SDK,以及用于日常代理操作的 e2a CLI e2a-demo-1080p-v2.mp4 使用它 您可以使用托管实例或自托管实例。托管 — 在 e2a.dev 注册。包括共享的agents.e2a.dev域,用于基于slug的即时登录(无DNS设置)、仪表板和托管交付能力。自托管 — 请参阅快速入门和部署。每个功能的工作原理都是一样的;共享域 slug 快捷方式只需要您将邮件域指向中继并在 config.yaml 中设置共享域。工作原理 人类 (Gmail/Outlook) │ ▼ SMTP ┌────────────┐ │ e2a 中继 │ ← 您的代理域的 MX 记录点在此处 │ │ │ 1. 验证 │ ← SPF/DKIM 检查入站邮件 │ 2. 签名 │ ← HMAC 签名的 X-E2A-Auth-* 标头 │ 3. 传送 │ └────────────┘ │ ├──▶ 云模式代理:HTTPS webhook POST │ └──▶ 本地模式代理:存储 + WebSocket 通知 │ ▼ e2a 监听 (CLI) 或 client.listen() (SDK) 入站流:SMTP → SPF/DKIM 检查 → 代理查找 → HMAC 签名身份验证标头 → webhook 或 WebSocket 交付。出站流:API 调用 → 可选的 HITL 保留 → SMTP 中继(代理到代理)或上游 SMTP(代理到人员)。快速入门需要 Docker。 git clone https://github.com/Mnexa-AI/e2a.git cd e2a docker compose up -d Postgres 首先出现(迁移自动运行),然后是 API 服务器,然后是仪表板。三个主机端口: :8080 — HTTP API :2525 — SMTP 中继 :3000 — 仪表板(Caddy + Next.js,代理 /api/* 到 API 服务器) 健康检查:curl http://localhost:8080/api/health # {"status":"ok"} 在浏览器中打开 http://localhost:3000 以查看仪表板。登录需要在 config.yaml 中配置 Google OAuth 凭据;对于仅 API 的冒烟测试,您可以跳过仪表板并使用下面的引导流程。创建您的第一个用户和 API 密钥(不需要 OAuth): docker compose exec e2a e2a -config /etc/e2a/config.yaml -bootstrap-email you@example.com # User: you@example.com (id=...) # API key: e2a_... 保存密钥 - 它只显示一次。注册代理并确认其工作: KEY=e2a_...curl -X POST http://localhost:8080/api/v1/agents \ -H " Authorization: Bearer $KEY " -H " Content-Type: application/json " \ -d ' {"slug":"my-bot","agent_mode":"local"} ' curl -H " Authorization: Bearer $KEY " http://localhost:8080/api/v1/agents 要接收真正的入站邮件,请将域的 MX 记录指向您的中继主机: A : your-domain.com → 服务器 IP MX : your-domain.com → your-domain.com (优先级 10) 然后通过 API 注册并验证域(请参阅域 )。如果没有 DNS,API 仍然可以用于测试 - 但外部电子邮件将无法到达您的中继。升级和迁移。 compose 文件将 migrations/ 挂载到 Postgres 的 init 目录中,该目录仅在首次启动时运行(当数据卷为空时)。当您升级 e2a 并拉取新的架构迁移时,必须手动应用它: docker compose exec postgres sh -c \ ' for f in /docker-entrypoint-initdb.d/*.sql;执行 psql -U e2a -d e2a -f "$f" -v ON_ERROR_STOP=1;完成'迁移文件是幂等的(CREATE TABLE IF NOT EXISTS,ALTER TABLE ... ADD COLUMN IF NOT EXISTS),因此重新运行它们是安全的。概念 代理模式 代理以两种模式之一运行,在注册时通过 agent_mode 设置: 模式 交付 需要公共 URL?云(默认) HTTPS webhook POST 到 webhook_url 是 本地 WebSocket 通知 + REST 获取 否 本地模式代理在断开连接时累积“未读”消息;重新连接时,服务器将它们作为 WebSocket 通知耗尽。两种模式都可以通过 REST API 轮询消息。身份验证标头 通过 e2a(webhook 或 WebSocket 获取)传送的每封电子邮件都带有签名标头: 标头 描述 X-E2A-Auth-Verified 如果域级身份验证(SPF 或 DKIM)通过则为 true X-E2A-Auth-Sender 已验证的发件人电子邮件或代理域 X-E2A-Auth-Entity-Type 人员或代理 X-E2A-Auth-Domain-Check SPF/DKIM 结果字符串(例如spf=pass; dkim=none ) X-E2A-Auth-Delegation agent={id}; human={id} 如果存在活动委托绑定 X-E2A-Auth-Timestamp RFC3339 时间戳 X-E2A-Auth-Message-Id 此传递用于 X-E2A-Auth-Body-Hash 原始消息字节的十六进制 SHA-256 X-E2A-Auth-Signature基于上述规范字符串的 HMAC-SHA256 签名涵盖:已验证\n 发送者\n 实体_类型\n 域_检查\n 委