前言¶
在 DeepSeek Harness(DSH)里跑 Agent,常见痛点是:主人不在同一个对话窗口,任务只能通过聊天或侧栏下达,远程异步沟通没有固定入口。把邮箱当「通知渠道」往往又要自己写 IMAP/SMTP 轮询、把新信注入会话、发完还要对账——这些和 Agent 能力无关,却占掉不少胶水代码。
dsh-mail-channel(GitHub:Wang-BinNian/dsh-mail-channel)面向这类需求:它不是邮箱客户端,而是一套给 Agent 用的邮件工具与可预测的到信唤醒通道。传输层在插件进程内用 Node 内置模块完成 IMAP/SMTP,README 写明零运行时依赖、不调用外部脚本。维护者 Wang-BinNian,社区目录分类为工作流;截至资料抓取时仓库星标为 0,npm 包版本为 0.1.0(MIT)。
下面介绍它做什么、怎么装、怎样用对话完成首次配置,以及使用时的渠道规则与安全默认。
这是什么¶
一句话:dsh-mail-channel 把邮箱变成 Agent 与主人之间的常驻通信通道——新开对话也会自带收发信相关工具;主人来信可唤醒绑定的会话,Agent 按「读即认领、发必回查」走完一轮。
资料中的数据流可以概括为:
主人 ──SMTP──> 邮箱 ──IMAP──> 插件 ──fs.watch──> 唤醒绑定对话
▲ │
└── mail_send ◄── 干活 │
是:9 个常驻邮件工具(含首次配置用的 mail_setup)、到信唤醒、本地落盘的地址簿 / 往来检索 / 待办队列 / 发信记录。
不是:没有收件箱 UI、富文本编辑、签名模板;不做多账号 / OAuth2 / POP3(一个 profile 一个邮箱);不替代主人日常用的邮件 App。
核心功能¶
九工具与侧栏开关¶
插件常驻工具包括:mail_inbox、mail_read、mail_send、mail_verify、mail_bind、mail_contacts、mail_history、mail_doctor、mail_setup。侧栏底部有「邮件」按钮,可一键开关自动收信;开启后绑定当前对话,切换对话时按焦点跟随。资料注明:开启时不补唤醒积压。
到信唤醒与处理闭环¶
- 到信唤醒:新信落盘后通过
fs.watch(1.5s 去抖)向绑定会话注入主题、发件人、摘要与处理流程。 - 读即认领:
mail_read读全文的同时写.done,避免重复处理。 - 发必回查:
mail_send发出后由mail_verify按 Message-ID 或自定义头定位;服务商改写 id 时用主题与时间窗兜底;pending不算失败。
安全与可靠性(资料摘要)¶
- 默认仅当发件人地址精确匹配才唤醒(From 头伪造无效);发信受
sendPolicy约束;可选一次性回信令牌或静态口令。 - 启动失败指数退避、断线重连退避、单实例锁、日志按大小轮转。
- 实现仅依赖 Node 内置模块;
package.json要求node >= 22.19,peer 依赖@deepseek-ai/dsh ^0.2.2-rc.1。
安装与启用¶
应用内安装(推荐)¶
侧栏 → 插件 → 添加插件 → 安装第三方插件 → 填写:
dsh-mail-channel
命令行安装¶
桌面 profile 为 desktop;若在 dsh web 等命令行环境,把 desktop 换成 web:
dsh plugin --profile desktop add dsh-mail-channel
装好后重启 DSH;侧栏底部出现「邮件」开关即表示安装成功。
升级或指定版本时,可在插件面板重装,或使用:
dsh plugin --profile desktop add dsh-mail-channel@<version>
然后重启;数据目录与配置会保留。
典型用法:对话里三步跑通¶
资料强调:不需要手改配置文件,首次配置可在对话中用一句话完成。
① 安装并重启¶
按上一节安装 → 重启 → 确认侧栏「邮件」开关存在。
② 对 Agent 说一句话完成配置¶
示例(地址与授权码替换为真实值):
帮我配置邮箱:主人是 owner@example.com,本机是 agent@example.com,授权码是 xxxxxxxx
Agent 会调用 mail_setup,把地址写入 $DSH_HOME/mail-channel/settings.json(未设置 DSH_HOME 时默认为 ~/.dsh/mail-channel),账号与授权码进入 DSH 凭据库(MAIL_CHANNEL_USER / MAIL_CHANNEL_PASSWORD),立即生效,无需重启、也无需改 cordis.patch.yml。
同一句话里还可说明:主人别名、发信署名、IMAP/SMTP 服务器(默认按 QQ:imap.qq.com / smtp.qq.com)、发件箱名、旧数据目录 mailDir 等可选项。
更稳妥的做法是事先通过 DSH 凭据服务、环境变量或 credentialFile 放好凭据,对话里只给两个地址,避免授权码进入对话记录。
③ 打开开关并自检¶
侧栏底部打开「邮件」→ 自动绑定当前对话;对 Agent 说「做一次邮件通道自检」,跑 mail_doctor,确认凭据、收信连接、地址配置、实例锁均通过。
回复渠道规则(重要)¶
插件同时提供工具和自动唤醒,但 README 明确区分渠道:
| 场景 | 做法 |
|---|---|
| 普通对话里下达的任务 | 在对话里汇报结果,不要调用 mail_send,除非主人明确要求发邮件 |
| 由邮件唤醒的回合 | mail_read → 干活 → mail_send → mail_verify |
| 主人明确要求邮件通信 / 远程处理 | 走完整邮件流程 |
判断依据:本轮是否由「MAIL ARRIVED」唤醒,或主人是否明确要求邮件。
高级配置(可选)¶
默认路径已由 mail_setup 写入 settings.json。若需覆盖默认值,可在用户层 cordis.patch.yml 中按 id 覆盖已有 bundle 行,不要用 - insert: 重复插入 mail-channel。
合并顺序为:DEFAULTS < settings.json < profile patch config。
常用字段示例(占位域名,换服务商时改 IMAP/SMTP 与邮箱名):
- id: mail-channel
config:
ownerAddress: owner@example.com
selfAddress: agent@example.com
imapHost: imap.example.com
imapPort: 993
smtpHost: smtp.example.com
smtpPort: 587
receive: true
sendPolicy: confirm
wakeAuth: address
sendPolicy 可取 owner-only | confirm | open;wakeAuth 可取 address | token。完整键说明见仓库 README「配置」一节。
凭据解析优先级(前项覆盖后项):配置里的 user+password → DSH 凭据服务 → 同名环境变量 → credentialFile。
适用场景与注意¶
适合:希望主人用邮件异步下达任务、Agent 在 DSH 内自动认领并回信对账;希望 SMTP/IMAP 与唤醒逻辑集中在插件里、不另起守护脚本。
限制:单邮箱单 profile;无 OAuth;不是日常读信 UI。
安全:插件以当前 DSH 进程权限运行,会访问你配置的邮箱与本地 $DSH_HOME/mail-channel/。安装前建议在 GitHub 仓库 查看源码与 MIT 许可证;凭据优先走凭据服务而非明文出现在对话里。卸载后可选删除 $DSH_HOME/mail-channel/ 清理本地队列与日志(邮箱里的邮件不受影响)。
结尾¶
dsh-mail-channel 把「收信唤醒 → 会话内处理 → 发信回查」收成一套工作流工具与侧栏开关,适合把邮箱当作 Agent 与主人之间的固定通道,而不是再做一个邮件客户端。