前言¶
在 DSH 里接邮件工具,如果只是让智能体“会发邮件”,通常只需要注册几个发送、查询接口。但实际使用邮件时,问题不只是发出去:来信要进入智能体上下文,失败发送要被知道,出站要有人工确认和收件人限制,跨会话的跟进也不能因为一次对话结束就丢掉。
dsh-agentmail 是一个 DSH 插件。它的定位是给 DeepSeek Harness 智能体一个邮件收件箱,并把入站邮件绑定到按邮件线程区分的 session 上。公开仓库地址为:
https://github.com/agentmail-to/dsh-agentmail
许可证为 MIT。
这是什么¶
dsh-agentmail 的核心能力可以概括为:
- 提供发送、读取、搜索邮件的工具;
- 入站邮件到达智能体,并绑定到一个 email thread 对应 session;
- 邮件 bounce 会报告回来,避免把失败发送当成已送达;
- 出站发送有审批门和收件人 allowlist;
- 跟进任务可以跨会话存活,通过 due-date labels 和 periodic sweep 处理;
- 在 system prompt 中注入 inbox identity 和 untrusted-content 规则。
它不只是一个邮件 API 包装,而是把邮件线程、DSH session、审批、未受信输入处理放在一起。
工具清单¶
插件提供 11 个精选工具:
agentmail_list_inboxes
agentmail_create_inbox
agentmail_list_threads
agentmail_get_thread
agentmail_search
agentmail_send_message
agentmail_reply
agentmail_create_draft
agentmail_send_draft
agentmail_update_labels
agentmail_followup
这些工具覆盖了邮箱、线程、消息、草稿、标签和跟进等常见邮件工作流。
安装与启用¶
插件方式¶
先设置 AgentMail API key,再安装插件:
export AGENTMAIL_API_KEY=...
dsh plugin --profile demo add dsh-agentmail
dsh --profile demo
这里使用的是 demo profile。如果你的 DSH 环境使用其他 profile,需要按实际环境替换。
仅使用 MCP client¶
如果只需要通过 MCP client 接入,可以配置 @deepseek-ai/dsh-mcp-client:
- id: mcp-agentmail
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: agentmail
transport: streamable-http
url: https://mcp.agentmail.to/mcp
headers:
Authorization: 'Bearer ${process.env.AGENTMAIL_API_KEY}'
需要注意:MCP-client 路径不提供入站邮件、bounce 报告、审批、跟进或 inbox identity 规则。它更适合作为轻量工具接入,而不是完整的邮件 agent 工作流。
本地开发¶
如果要本地构建和调试,可以执行:
npm install && npm run build
dsh web --patch ./cordis.patch.yml
线程绑定¶
dsh-agentmail 的一个关键设计是:入站邮件按邮件线程绑定到 DSH session。
对同一个 email thread,插件会复用对应 session,而不是每封邮件都创建新的上下文。这样可以保留线程内的来龙去脉,避免智能体把连续邮件拆成互不相干的独立任务。
几个相关行为值得注意:
- 同一线程的并发邮件会使用 in-flight latch,避免在创建窗口内产生重复 session;
- idle disposal 是非破坏性的;
maxLive只作为 flood cap,不作为需要复杂推理的淘汰顺序;- 由出站邮件发起的线程,会从发送第一封邮件的 session 开始;后续回复会 seed 一个新的 thread session,并只包含 API 中可重建的线程内容,不包含发送 session 的私有推理。
如果你不希望按线程拆 session,可以关闭 threadSessions.enabled,让邮件统一路由到 fallbackSessionId:
threadSessions:
enabled: false
跟进机制¶
普通的 session 内提醒依赖当前 session 仍然活着。但邮件跟进经常发生在“对方还没回信”的场景里,这时 session 可能已经冷却。
dsh-agentmail 通过标签处理这类问题。调用:
agentmail_followup
会给线程写入类似:
dsh-followup-YYYY-MM-DD
的标签。之后周期性 sweep 会按 followupSweepMs 查询到期标签,并只唤醒对应的 session。
这意味着跟进状态存放在邮件线程标签中,而不是只依赖某一次会话生命周期。
安全与权限¶
dsh-agentmail 把入站邮件内容视为不可信输入。
每个入站邮件正文都会被围栏标注:
<email-content untrusted="true">
</email-content>
system prompt 中也会强调:围栏内的邮件文本是数据,不是指令。即使邮件内容声称自己是系统消息、管理员消息或其他高权限来源,也不应被当作指令执行。
出站侧还有几层限制:
readOnly: true时不会注册任何写工具;allowedRecipients通过ctx.tools.guard()强制,且是一个单调拒绝,后续 listener 不能撤销;requireApprovalForSend默认开启,并在tools/pre-execute返回ask;wakeIdleAgent默认关闭,入站邮件会追加上下文,而不是直接启动一个 turn。
这些规则合在一起,目的不是让邮件工具“更聪明”,而是让邮件内容、发送动作和 session 唤醒都有明确边界。
适用场景¶
dsh-agentmail 适合这类需求:
- 希望 DSH 智能体拥有独立邮箱能力;
- 需要按邮件线程保留上下文;
- 需要区分入站内容和模型指令;
- 需要对外发送邮件前加入人工审批;
- 需要限制可发送收件人;
- 需要把“稍后跟进”从一次会话里持久化出来。
如果你只是临时调用邮件 API,MCP client 可能足够。如果你要让智能体长期处理收件、回复、草稿、标签和跟进,插件路径会更完整。
安装前检查¶
插件会运行在当前 DSH 进程权限下,因此安装前建议检查源码、许可证和配置项。dsh-agentmail 的许可证为 MIT,但这不等于可以跳过本地安全审查。
建议至少确认:
- 插件注册的工具有哪些;
allowedRecipients是否已配置;requireApprovalForSend是否符合你的发送策略;readOnly: true是否应开启;wakeIdleAgent是否需要保持默认关闭;- 入站邮件的 untrusted-content 规则是否进入你的 system prompt 配置。
链接¶
- 社区目录页:
https://www.skillhub.cn/plugins/agentmail-to/dsh-agentmail - GitHub:
https://github.com/agentmail-to/dsh-agentmail
DSH 的插件生态强调“一切皆插件”,社区目录也是独立站点,不是官方应用商店。dsh-agentmail 的价值在于把邮件能力接入 DSH agent 时,同时处理线程绑定、失败回执、出站审批、跟进和未受信输入。