dsh-qqmail:在 DeepSeek Harness 里用 12 个原生工具操作 QQ 邮箱

前言

在 DSH 里让模型读信、搜信、发信,常见做法是自建 HTTP 封装或把邮箱当成「外部 API」来回拼。QQ 邮箱侧已有官方 MCP 网关与 OAuth,但若每次都要重新扫码、令牌轮换后两边不同步,智能体会频繁断链。维护者 0Sakura721 的 dsh-qqmail 把 QQ 邮箱接进 Harness:注册 12 个原生工具,覆盖收、发、搜、附件;凭据可复用本机 WorkBuddy 已授权 OAuth 令牌并自动续期,也可手工配置 credentials.json。插件分类为联网工具,许可证 MIT,当前 package.json 版本为 1.0.0,运行环境要求 Node.js ≥ 22。

下面按定位、能力、安装、授权、发信确认与配置说明用法;安装命令与配置字段均出自仓库 README,不凭插件名拼接 CLI。

这是什么

dsh-qqmail 是 DeepSeek Harness 的 bundle 插件,通过 Streamable-HTTP 客户端连接 QQ 邮箱官方 MCP 网关 https://api.mail.qq.com/mcp,在 profile 内注入工具定义与一段系统提示词约定。它不实现 POP3/IMAP 直连,能力边界与网关暴露的 12 个工具一致。

插件以当前 DSH 进程权限运行,会读写本机 ~/.dsh/qqmail/ 下的凭据与日志;安装前应阅读源码与许可证,并确认你愿意让 Harness 代表你调用邮箱读写接口。

核心功能:12 个工具

读信与检索类工具不需要用户二次确认;发信、回复、转发、删信、清空垃圾箱等会触发网关的两阶段确认(见后文)。

工具 作用 需要确认
qqmail_get_me 授权状态、主/附属账号、权限、限额 —
qqmail_list_messages 列邮件(文件夹 / 时间 / 已读 / 附件筛选 + 翻页) —
qqmail_get_message 读单封全文(HTML 自动转纯文本) —
qqmail_search_messages 关键词 / 发件人 / 收件人 / 时间搜索 —
qqmail_list_attachments 列附件元信息 —
qqmail_download_attachment 附件落盘(默认系统下载目录) —
qqmail_send_message 发新信 ✓
qqmail_reply_message 回复(可 reply_all) ✓
qqmail_forward_message 转发(可带原附件) ✓
qqmail_delete_message 移入垃圾箱(30 天可恢复) ✓
qqmail_permanent_delete_message 永久删除 ✓
qqmail_clear_trash 清空垃圾箱 ✓

实现上插件采用懒连接:加载时不建连,首次真正调用工具才 initialize,避免凭据暂时不可用时把整个 profile 拖到 failed。qqmail_get_me 结果缓存 5 分钟,减轻网关「10 次/分钟」限速带来的 alias 查询压力。

附件在本地会先校验:服务端限制以实测为准(README 记载为 3 个附件、单文件 1MB、合计 3MB);批量高频调用仍可能触达网关 200 次/小时等限额。

发信与破坏性操作:两阶段确认

QQ 邮箱 MCP 网关对发信、删信等操作强制两阶段确认,插件不做「替用户点头」的短路。不带 confirmation_token 的请求只会得到 42801 与摘要信息,不会真正执行。

模型
 └─ qqmail_send_message(不带 token)
     └─ QQ 邮箱 MCP 网关 → 42801 + confirmation_token + operation_summary
         └─ 插件把摘要与 token 交给模型
             └─ 模型 ask_user_question → 用户点确认
                 └─ 模型带 token 重发 → 真正发出

因此在典型用法里,模型先发一次不带 token 的 qqmail_send_message,向用户展示 operation_summary,用户确认后再带 confirmation_token 重发。删信、清空垃圾箱同理。

安装与启用

DSH 通过 bundle 机制加载本插件;源码可放在任意工作目录,例如 ~/.dsh/plugins/dsh-qqmail。

# 1. 把本仓库放到一个工作目录,例如 ~/.dsh/plugins/dsh-qqmail
# 2. 安装到 profile(把路径换成你本地实际路径)
plugin_manager install_bundle  action: install_bundle  target: <仓库绝对路径>

也可以手动把依赖写入 profile 的 package.json,并在 dsh.profile.bundles 中挂载,再让 Loader 重载。

装完后插件自动注册 12 个工具,并把使用约定写入系统提示词。插件入口为 index.js,挂载声明在 cordis.patch.yml(inject: [tools, systemPrompt])。

授权:两条路径

路一:从 WorkBuddy 借用(推荐)

WorkBuddy 桌面端把 QQ 邮箱 OAuth 令牌加密存在本地,插件可解密借用并接管续期,首次调用工具时落盘到 ~/.dsh/qqmail/credentials.json(权限 0600)。

涉及文件:

  • ~/.workbuddy/connectors/<userId>/.master.key —— 32 字节主密钥
  • ~/.workbuddy/connectors/<userId>/.credentials.v3.json —— 密文令牌

QQ 邮箱的 refresh_token 为一次性轮换:续期后插件除更新自有 credentials.json,还会按原格式加密回写 WorkBuddy 凭据(lib/seal.js),避免 WorkBuddy 侧 refresh_token 先于插件失效。网关对已失效 refresh 的响应形态为 HTTP 200 + 空 body + LogicRet: -21653,插件会归类为 REFRESH_TOKEN_DEAD 而非泛化网络错误。

路二:手工放置令牌

无 WorkBuddy 时,可将带 refresh_token 的授权结果写入 ~/.dsh/qqmail/credentials.json:

{
  "serverUrl": "https://api.mail.qq.com/mcp",
  "clientId": "<你的 OAuth client id>",
  "accessToken": "<access token>",
  "refreshToken": "<refresh token>",
  "expiresAt": 1794108777023,
  "scope": "alias:read mail:read mail:send mail:delete"
}

clientId 留空时退回内置公共客户端 id。

授权失效时:删除 credentials.json,下次调用会尝试重新从 WorkBuddy 借用;若 WorkBuddy 侧也失效,需在 WorkBuddy 内重新扫码。

可选配置

~/.dsh/qqmail/config.json 示例:

{
  "downloadDir": "~/Downloads",
  "confirmTtlMs": 300000,
  "workbuddyAutoImport": true,
  "workbuddyReseal": true,
  "timeoutMs": 60000,
  "promptSection": true
}

同名键也可写在 cordis.patch.yml 的 config 中(行配置优先于文件)。defaultAlias 可填,一般留空由插件自动取主账号。

状态与日志路径:

  • ~/.dsh/qqmail/credentials.json —— 当前令牌
  • ~/.dsh/qqmail/qqmail.log —— 续期、连接、回封记录(不含明文令牌)

排障与自检

仓库 tools/ 下提供面向真实账号的脚本,需在 profile 目录执行以便包名解析:

cd ~/.dsh/profiles/<你的 profile>

node <仓库>/tools/diag.mjs         # 凭据 + 连接 + 工具清单 + 主账号
node <仓库>/tools/live.mjs         # 走注册后的 wrapped execute 路径
node <仓库>/tools/tools-run.mjs    # 逐个跑读取类工具
node <仓库>/tools/tools-run.mjs --send-to me@example.com   # 额外验证二次确认第一阶段
node <仓库>/tools/check-sent.mjs   # 确认自检信没有真的发出
node <仓库>/tools/dead.mjs         # 用伪造令牌验证 REFRESH_TOKEN_DEAD 分类
node <仓库>/tools/recover.mjs <json>  # 令牌断链后恢复并双向回封

tools/recover.mjs 可在 refresh 断链时,用含 refresh_token 的 JSON 续期一次,并同时写回 credentials.json 与 WorkBuddy 的 .credentials.v3.json。

适用场景与注意

适合谁: 已在 DSH profile 中开发邮件相关智能体、且主要使用 QQ 邮箱官方 MCP 能力的开发者;本机已用 WorkBuddy 完成 QQ 邮箱 OAuth、希望 Harness 与桌面端共用同一套令牌生命周期时,路一授权路径更省事。

务必注意:

  1. 插件依赖 QQ 邮箱官方 MCP 网关与其 OAuth 服务,无网关未暴露的能力。
  2. 破坏性写操作必须经过用户确认,模型侧需配合 ask_user_question 与带 token 的重试。
  3. 网关限速与附件上限以服务端为准,批量自动化需控制调用频率。
  4. 社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;插件星标与传播数据以各站点展示为准(目录线索为联网工具类)。

第一次使用可参阅仓库内 从零开始使用(前提条件、安装路径与授权路径、发信确认卡片说明)。

结尾

dsh-qqmail 把 QQ 邮箱的 12 个 MCP 能力原样注册进 Harness,并用 WorkBuddy 复用与 refresh 回封降低令牌维护成本;读信搜信可直接编排,写操作则遵守网关强制的两阶段确认。查阅与安装线索:

  • 社区目录页:https://www.skillhub.cn/plugins/0Sakura721/dsh-qqmail
  • 源码与 README:https://github.com/0Sakura721/dsh-qqmail
羽毛球分组比赛记分
小程序二维码

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

小夜