前言¶
DSH 的 agent 在跑定时任务、长任务或批处理时,往往需要一个能把结果送出去的通道。已有做法是自己写脚本调邮件 SDK,或让插件直接管一套邮件配置,前者重复,后者把密钥留在配置文件里。下面介绍的 @zyfgood/dsh-email-notify 是社区维护者 zyfgood 的 DeepSeek Harness 插件,注册两个模型工具,让 agent 自己发信、收信,凭证走环境变量引用而不落盘。
这是什么¶
@zyfgood/dsh-email-notify(GitHub 仓库 zyfgood/dsh-email-notify)是一个 DSH 插件,从 feishu-bot 项目中把邮件能力隔离出来单独维护。它针对的痛点很具体:agent 完成任务后需要发一封结果邮件、定时任务需要通知、需要定期读收件箱做汇总——这些如果靠手写脚本,每次都要重新处理 SMTP/IMAP 细节和凭证。
插件用 SMTP 发信、IMAP 收信,凭证(user/pass,即邮箱「授权码」)SMTP 与 IMAP 共用,不存进任何配置文件。
两个模型工具¶
插件注册两个模型工具:
email_send:发送邮件。参数subject、content、to(默认取配置,未配置则发给SMTP_USER自己)、html。email_check:通过 IMAP 收取邮件。参数limit(1-10,默认 3,取最新 N 封)、unseen_only、mailbox(默认 INBOX)、mark_read、max_chars(每封正文 200-8000,默认 2500)。返回发件人/主题/正文摘要与附件名,按新到旧排列。
email_check 在未读模式下走「先扫 flags 再取正文」两阶段,不依赖各服务器对 SEARCH 行为不一的差异。插件依赖 imapflow、mailparser、nodemailer,需要 Node.js >= 20。
安装¶
插件以 bundle 形态发布,用一条命令加入 profile:
dsh plugin --profile <name> add @zyfgood/dsh-email-notify
CLI 会把本包加入 profile 的 bundle 栈;随包的 cordis.patch.yml 自动注入 email-notify 插件行(package.json 声明了 dsh.bundle.patch),重启 DSH 生效。
配置¶
凭证和服务器参数分两类,先写凭证再按需改服务器。
- 凭证写进
~/.dsh/.env(Windows:%USERPROFILE%/.dsh/.env),由loadLayeredEnv启动注入,密钥不写进任何配置文件:
SMTP_USER=you@example.com
SMTP_PASS=SMTP授权码 # 非登录密码;网易/QQ 邮箱的「授权码」对 SMTP/IMAP 同时有效
- SMTP 服务器按发件域名在随包 patch 中配置,默认
smtp.yeah.net:465:
| 发件域 | host |
|---|---|
| yeah.net | smtp.yeah.net |
| 163.com | smtp.163.com |
| 126.com | smtp.126.com |
| qq.com / foxmail.com | smtp.qq.com |
| 其他 | smtp.<域名> 兜底 |
- 用非网易邮箱,或要加默认收件人时,在 profile 自己的
cordis.patch.yml里按id: email-notify覆盖。profile patch 在 bundle patch 之后合并;config 为整键替换,覆盖时需带上全部键:
- id: email-notify
name: '@zyfgood/dsh-email-notify'
config:
host: smtp.qq.com # IMAP 自动推导为 imap.qq.com
port: 465
secure: true
user: 'env:SMTP_USER'
pass: 'env:SMTP_PASS'
to: someone@example.com # 可选,默认收件人
IMAP 主机默认从 host 推导(smtp.yeah.net → imap.yeah.net:993),可用 imapHost 覆盖。
开发与自测¶
插件源码提供构建和三层测试,改完代码可以本地先跑:
npm run build # tsc → lib/
npm test # tests/smoke.mjs 冒烟测试(mock,不联网)
node tests/send-live.mjs [收件人] # 真实 SMTP 发送冒烟(读 ~/.dsh/.env)
node tests/receive-live.mjs 3 [--unseen] [--mark-read] # 真实 IMAP 收取冒烟
npm test 是离线冒烟,接真实邮箱前可以先跑;后两条会真实收发邮件,建议用测试邮箱和明确收件人。
适用场景与注意¶
适合用 DSH 跑定时任务、批处理或长任务的开发者:任务结果邮件、cron 通知、收件箱汇总这三类需求,可以用现有两个工具直接表达,不需要再写邮件脚本。
需要注意几点:
- 插件在当前 DSH 进程权限下运行,发送邮件、读取收件箱都以该进程可用凭证为准,接入前确认
~/.dsh/.env的账号与授权码有效。 - 安装前建议检查插件源码与许可证(MIT)是否符合自己的使用要求;该插件为社区维护,目录站点与 DeepSeek / 幻方无官方从属关系。
- 默认发件域覆盖网易和 QQ/Foxmail,其他域名走
smtp.<域名>兜底,自建或企业邮箱需自行覆盖cordis.patch.yml。 email_check的正文摘要长度由max_chars控制(200-8000),长邮件只取摘要,需要全文要另行处理。
小结¶
@zyfgood/dsh-email-notify 把 agent 的邮件收发收敛成 email_send 与 email_check 两个模型工具,凭证走环境变量引用,配置按域名分档,适合需要任务通知和收件汇总的 DSH 工作流。
目录页:https://www.skillhub.cn/plugins/zyfgood/dsh-email-notify
GitHub:https://github.com/zyfgood/dsh-email-notify
npm:@zyfgood/dsh-email-notify