@zyfgood/dsh-email-notify: Add SMTP email sending and receiving capabilities to DSH agent

前言

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 生效。

配置

凭证和服务器参数分两类,先写凭证再按需改服务器。

  1. 凭证写进 ~/.dsh/.env(Windows:%USERPROFILE%/.dsh/.env),由 loadLayeredEnv 启动注入,密钥不写进任何配置文件:
   SMTP_USER=you@example.com
   SMTP_PASS=SMTP授权码    # 非登录密码;网易/QQ 邮箱的「授权码」对 SMTP/IMAP 同时有效
  1. 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.<域名> 兜底
  1. 用非网易邮箱,或要加默认收件人时,在 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 通知、收件箱汇总这三类需求,可以用现有两个工具直接表达,不需要再写邮件脚本。

需要注意几点:

  1. 插件在当前 DSH 进程权限下运行,发送邮件、读取收件箱都以该进程可用凭证为准,接入前确认 ~/.dsh/.env 的账号与授权码有效。
  2. 安装前建议检查插件源码与许可证(MIT)是否符合自己的使用要求;该插件为社区维护,目录站点与 DeepSeek / 幻方无官方从属关系。
  3. 默认发件域覆盖网易和 QQ/Foxmail,其他域名走 smtp.<域名> 兜底,自建或企业邮箱需自行覆盖 cordis.patch.yml。
  4. 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

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

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

Xiaoye