dsh-mail-channel:給 DeepSeek Harness 的郵件通道

前言

在 DeepSeek Harness(DSH)裏跑 Agent,常見痛點是:主人不在同一個對話窗口,任務只能通過聊天或側欄下達,遠程異步溝通沒有固定入口。把郵箱當「通知渠道」往往又要自己寫 IMAP/SMTP 輪詢、把新信注入會話、發完還要對賬——這些和 Agent 能力無關,卻佔掉不少膠水代碼。

dsh-mail-channel(GitHub:Wang-BinNian/dsh-mail-channel)面向這類需求:它不是郵箱客戶端,而是一套給 Agent 用的郵件工具與可預測的到信喚醒通道。傳輸層在插件進程內用 Node 內置模塊完成 IMAP/SMTP,README 寫明零運行時依賴、不調用外部腳本。維護者 Wang-BinNian,社區目錄分類爲工作流;截至資料抓取時倉庫星標爲 0,npm 包版本爲 0.1.0(MIT)。

下面介紹它做什麼、怎麼裝、怎樣用對話完成首次配置,以及使用時的渠道規則與安全默認。

這是什麼

一句話:dsh-mail-channel 把郵箱變成 Agent 與主人之間的常駐通信通道——新開對話也會自帶收發信相關工具;主人來信可喚醒綁定的會話,Agent 按「讀即認領、發必回查」走完一輪。

資料中的數據流可以概括爲:

主人 ──SMTP──> 郵箱 ──IMAP──> 插件 ──fs.watch──> 喚醒綁定對話
                                  ▲                    │
                                  └── mail_send ◄── 幹活 │

是:9 個常駐郵件工具(含首次配置用的 mail_setup)、到信喚醒、本地落盤的地址簿 / 往來檢索 / 待辦隊列 / 發信記錄。

不是:沒有收件箱 UI、富文本編輯、簽名模板;不做多賬號 / OAuth2 / POP3(一個 profile 一個郵箱);不替代主人日常用的郵件 App。

核心功能

九工具與側欄開關

插件常駐工具包括:mail_inbox、mail_read、mail_send、mail_verify、mail_bind、mail_contacts、mail_history、mail_doctor、mail_setup。側欄底部有「郵件」按鈕,可一鍵開關自動收信;開啓後綁定當前對話,切換對話時按焦點跟隨。資料註明:開啓時不補喚醒積壓。

到信喚醒與處理閉環

  • 到信喚醒:新信落盤後通過 fs.watch(1.5s 去抖)向綁定會話注入主題、發件人、摘要與處理流程。
  • 讀即認領:mail_read 讀全文的同時寫 .done,避免重複處理。
  • 發必回查:mail_send 發出後由 mail_verify 按 Message-ID 或自定義頭定位;服務商改寫 id 時用主題與時間窗兜底;pending 不算失敗。

安全與可靠性(資料摘要)

  • 默認僅當發件人地址精確匹配才喚醒(From 頭僞造無效);發信受 sendPolicy 約束;可選一次性回信令牌或靜態口令。
  • 啓動失敗指數退避、斷線重連退避、單實例鎖、日誌按大小輪轉。
  • 實現僅依賴 Node 內置模塊;package.json 要求 node >= 22.19,peer 依賴 @deepseek-ai/dsh ^0.2.2-rc.1。

安裝與啓用

應用內安裝(推薦)

側欄 → 插件 → 添加插件 → 安裝第三方插件 → 填寫:

dsh-mail-channel

命令行安裝

桌面 profile 爲 desktop;若在 dsh web 等命令行環境,把 desktop 換成 web:

dsh plugin --profile desktop add dsh-mail-channel

裝好後重啓 DSH;側欄底部出現「郵件」開關即表示安裝成功。

升級或指定版本時,可在插件面板重裝,或使用:

dsh plugin --profile desktop add dsh-mail-channel@<version>

然後重啓;數據目錄與配置會保留。

典型用法:對話裏三步跑通

資料強調:不需要手改配置文件,首次配置可在對話中用一句話完成。

① 安裝並重啓

按上一節安裝 → 重啓 → 確認側欄「郵件」開關存在。

② 對 Agent 說一句話完成配置

示例(地址與授權碼替換爲真實值):

幫我配置郵箱:主人是 owner@example.com,本機是 agent@example.com,授權碼是 xxxxxxxx

Agent 會調用 mail_setup,把地址寫入 $DSH_HOME/mail-channel/settings.json(未設置 DSH_HOME 時默認爲 ~/.dsh/mail-channel),賬號與授權碼進入 DSH 憑據庫(MAIL_CHANNEL_USER / MAIL_CHANNEL_PASSWORD),立即生效,無需重啓、也無需改 cordis.patch.yml。

同一句話裏還可說明:主人別名、發信署名、IMAP/SMTP 服務器(默認按 QQ:imap.qq.com / smtp.qq.com)、發件箱名、舊數據目錄 mailDir 等可選項。

更穩妥的做法是事先通過 DSH 憑據服務、環境變量或 credentialFile 放好憑據,對話裏只給兩個地址,避免授權碼進入對話記錄。

③ 打開開關並自檢

側欄底部打開「郵件」→ 自動綁定當前對話;對 Agent 說「做一次郵件通道自檢」,跑 mail_doctor,確認憑據、收信連接、地址配置、實例鎖均通過。

回覆渠道規則(重要)

插件同時提供工具和自動喚醒,但 README 明確區分渠道:

場景 做法
普通對話裏下達的任務 在對話裏彙報結果,不要調用 mail_send,除非主人明確要求發郵件
由郵件喚醒的回合 mail_read → 幹活 → mail_send → mail_verify
主人明確要求郵件通信 / 遠程處理 走完整郵件流程

判斷依據:本輪是否由「MAIL ARRIVED」喚醒,或主人是否明確要求郵件。

高級配置(可選)

默認路徑已由 mail_setup 寫入 settings.json。若需覆蓋默認值,可在用戶層 cordis.patch.yml 中按 id 覆蓋已有 bundle 行,不要用 - insert: 重複插入 mail-channel。

合併順序爲:DEFAULTS < settings.json < profile patch config。

常用字段示例(佔位域名,換服務商時改 IMAP/SMTP 與郵箱名):

- id: mail-channel
  config:
    ownerAddress: owner@example.com
    selfAddress: agent@example.com
    imapHost: imap.example.com
    imapPort: 993
    smtpHost: smtp.example.com
    smtpPort: 587
    receive: true
    sendPolicy: confirm
    wakeAuth: address

sendPolicy 可取 owner-only | confirm | open;wakeAuth 可取 address | token。完整鍵說明見倉庫 README「配置」一節。

憑據解析優先級(前項覆蓋後項):配置裏的 user+password → DSH 憑據服務 → 同名環境變量 → credentialFile。

適用場景與注意

適合:希望主人用郵件異步下達任務、Agent 在 DSH 內自動認領並回信對賬;希望 SMTP/IMAP 與喚醒邏輯集中在插件裏、不另起守護腳本。

限制:單郵箱單 profile;無 OAuth;不是日常讀信 UI。

安全:插件以當前 DSH 進程權限運行,會訪問你配置的郵箱與本地 $DSH_HOME/mail-channel/。安裝前建議在 GitHub 倉庫 查看源碼與 MIT 許可證;憑據優先走憑據服務而非明文出現在對話裏。卸載後可選刪除 $DSH_HOME/mail-channel/ 清理本地隊列與日誌(郵箱裏的郵件不受影響)。

結尾

dsh-mail-channel 把「收信喚醒 → 會話內處理 → 發信回查」收成一套工作流工具與側欄開關,適合把郵箱當作 Agent 與主人之間的固定通道,而不是再做一個郵件客戶端。

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

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

小夜