前言¶
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