dsh-mail-channel: Mail channel for DeepSeek Harness

前言

在 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 与主人之间的固定通道,而不是再做一个邮件客户端。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye