Skip to content

Releases

v0.1.0 — QQ Mail / agent email plugin

Choose a tag to compare

@zhengjy01 zhengjy01 released this 16 Sep 07:39

First public release.

QQ Mail — and any IMAP/SMTP mailbox — for DeepSeek Harness: 12 qqmail_* agent tools over IMAP/SMTP with a QQ Mail authorization code (no OAuth, no 2FA redirect), plus a qqmail CLI, a qqmail-mcp stdio MCP server, and a QQ 邮箱 web settings panel. The tool specs are defined once and reused by all three surfaces, so the agent, the CLI and the settings panel cannot drift.

Install

# from npm
dsh plugin --profile web add @zhengjunyao/dsh-qqmail

# from GitHub (this repo carries the `dsh-plugin` topic)
dsh plugin --profile web add github:zhengjy01/dsh-qqmail

Restart dsh web, open Settings → QQ 邮箱, enter your address and the 16-digit authorization code, then run qqmail_status probe: true.

For agents that cannot host a DSH plugin: npx @zhengjunyao/dsh-qqmail qqmail-mcp.

Added

  • Agent tools (qqmail_*): status, config, folders, list, search, read, attachment are always registered; send, reply, mark, move, delete register only when readOnly is off.
  • CLI (qqmail): every tool as a command, with --json for structured output, and QQMAIL_AUTH_CODE / --auth-code - so the authorization code never lands in the process list.
  • MCP stdio server (qqmail-mcp): the same tool definitions exposed over JSON-RPC for other agents, with stdout reserved strictly for the transport.
  • Web settings panel (「QQ 邮箱」): provider preset, address, authorization code, behaviour switches, real connect check, inbox quick-look, compose box.
  • Provider presets: QQ Mail, Tencent Exmail, 163, 126, Gmail, Outlook, plus a fully custom IMAP/SMTP endpoint.
  • IMAP layer: pooled, serialized session per account with idle close; special-folder resolution via SPECIAL-USE with a name-matching fallback; header-only fetches with BODYSTRUCTURE; single-part body previews; flag stores, moves, trash-vs-permanent deletion, and APPEND for the Sent copy.
  • SMTP layer: one MailComposer build reused for both delivery and the Sent append (so both copies share a Message-ID), STARTTLS enforcement on non-secure ports, and explicit size caps.
  • Search semantics: ASCII terms go to the server; non-ASCII terms are filtered over a recent window locally and reported as mode: "local".
  • Tests: 90 unit assertions, 68 end-to-end assertions over real sockets against in-process fake SMTP/IMAP servers, and 37 CLI/MCP assertions.
  • Portability gate: pnpm run verify installs the packed tarball into an isolated DSH_HOME, boots an instance, checks the health route and the client bundle, and watches for late startup failures.

Compatibility

  • DSH: >=0.1.5-rc.1
  • Node: ^22.19.0 || >=24.0.0
  • DSH peer: ^0.1.0-rc.6 || ^0.1.1-rc.1 || ^0.1.2-alpha.1 || ^0.1.5-rc.1

Full changelog: https://github.com/zhengjy01/dsh-qqmail/blob/main/CHANGELOG.md