@zyfgood/dsh-email-notify:給 DSH agent 加上 SMTP 郵件收發能力

前言

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

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

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

小夜