🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

外贸获客台 shine-233/dsh-waimao

DeepSeek Harness
shine-23353 天前有提交已提供中文文档扫描:含敏感能力

从谷歌搜客到邮件成交,一站式跑通外贸获客全流程

30/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

自动兼容检查有告警:未发布到 npm registry,仅可从源码安装。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add shine-233/dsh-waimao
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · other
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已在 dsh 0.2.1-rc.5 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/11/03·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 53 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →

可信度证据

安装兼容性检查⚠ 装前注意

未发布到 npm registry,仅可从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包dsh-waimao(未发布到 npm,仅可源码安装)
✓Node 引擎要求 >=22.13 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/8 06:35:07

安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件发起外部网络请求
查看扫描证据(共 105 处,展示前 97 条)
  • 读取本地文件
    dsh/index.js:177
    index = Number(readFileSync(stateFile, 'utf8').trim()) || 0;
  • 写入本地文件
    dsh/index.js:188
    mkdirSync(EXPORT_DIR, { recursive: true });
  • 写入本地文件
    dsh/index.js:189
    writeFileSync(stateFile, String((index + i + 1) % accounts.length), { mode: 0o600 });
  • 写入本地文件
    dsh/index.js:281
    mkdirSync(EXPORT_DIR, { recursive: true });
  • 写入本地文件
    dsh/index.js:282
    writeFileSync(previewFile, `To: ${to}\nSubject: ${finalSubject}\n${inReplyTo ? `In-Reply-To: ${inReplyTo}` : ''}\n\n${finalBody}`, { mode: 0o600 });
  • 写入本地文件
    dsh/index.js:388
    mkdirSync(dirname(file), { recursive: true });
  • 写入本地文件
    dsh/index.js:392
    writeFileSync(file, content, { mode: 0o600 });
  • 读取本地文件
    dsh/index.js:1203
    if (existsSync(resolved) && allowed.some((dir) => resolved.startsWith(dir))) {
  • 读取本地文件
    dsh/index.js:1204
    const base64 = readFileSync(resolved).toString('base64');
  • 读取本地文件
    dsh/index.js:1211
    if (existsSync(resolved)) {
  • 读取本地文件
    dsh/index.js:1815
    return JSON.parse(readFileSync(file, 'utf8'));
  • 读取本地文件
    dsh/index.js:1850
    bytes = statSync(file).size;
  • 发起网络请求
    dsh/index.js:2335
    const response = await fetch(`${config.deepseek.baseURL.replace(/ +$/, '')}/chat/completions`, {
  • 写入本地文件
    dsh/audit.js:11
    mkdirSync(DATA_DIR, { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/audit.js:20
    appendFileSync(FILE, `${JSON.stringify(entry)}\n`, { mode: 0o600 });
  • 读取本地文件
    dsh/audit.js:31
    raw = readFileSync(FILE, 'utf8');
  • 写入本地文件
    dsh/config.js:148
    mkdirSync(WAIMAO_DIR, { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/config.js:149
    mkdirSync(DATA_DIR, { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/config.js:150
    mkdirSync(EXPORT_DIR, { recursive: true, mode: 0o700 });
  • 读取本地文件
    dsh/config.js:170
    raw = readFileSync(CONFIG_PATH, 'utf8');
  • 读取本地文件
    dsh/config.js:194
    if (lstatSync(CONFIG_PATH).isSymbolicLink()) {
  • 写入本地文件
    dsh/config.js:204
    writeFileSync(tmp, `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
  • 写入本地文件
    dsh/config.js:206
    renameSync(tmp, CONFIG_PATH);
  • 删除本地文件
    dsh/config.js:209
    unlinkSync(tmp);
  • 写入本地文件
    dsh/config.js:216
    chmodSync(CONFIG_PATH, 0o600);
  • 读取本地文件
    dsh/crm.js:19
    const parsed = JSON.parse(readFileSync(FILE, 'utf8'));
  • 写入本地文件
    dsh/crm.js:27
    mkdirSync(dirname(FILE), { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/crm.js:29
    writeFileSync(tmp, JSON.stringify(db, null, 1), { mode: 0o600 });
  • 写入本地文件
    dsh/crm.js:30
    renameSync(tmp, FILE);
  • 读取本地文件
    dsh/crm.js:461
    return existsSync(FILE);
  • 读取本地文件
    dsh/cron.js:11
    return JSON.parse(readFileSync(STATE_FILE, 'utf8')) ?? {};
  • 写入本地文件
    dsh/cron.js:18
    mkdirSync(DATA_DIR, { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/cron.js:20
    writeFileSync(tmp, JSON.stringify(state, null, 1), { mode: 0o600 });
  • 写入本地文件
    dsh/cron.js:21
    renameSync(tmp, STATE_FILE);
  • 写入本地文件
    dsh/cron.js:265
    mkdirSync(dir, { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/cron.js:267
    writeFileSync(file, content, { mode: 0o600 });
  • 发起网络请求
    dsh/draft.js:27
    const response = await fetch(`${config.deepseek.baseURL.replace(/ +$/, '')}/chat/completions`, {
  • 发起网络请求
    dsh/evolution.js:29
    response = await fetch(url, {
  • 读取本地文件
    dsh/evolution.js:108
    const parsed = JSON.parse(readFileSync(BROADCAST_STATE, 'utf8'));
  • 写入本地文件
    dsh/evolution.js:116
    mkdirSync(dirname(BROADCAST_STATE), { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/evolution.js:118
    writeFileSync(tmp, JSON.stringify(state, null, 1), { mode: 0o600 });
  • 写入本地文件
    dsh/evolution.js:119
    renameSync(tmp, BROADCAST_STATE);
  • 发起网络请求
    dsh/evolution.js:294
    const response = await fetch(url, {
  • 读取本地文件
    dsh/kb.js:16
    const parsed = JSON.parse(readFileSync(FILE, 'utf8'));
  • 写入本地文件
    dsh/kb.js:24
    mkdirSync(dirname(FILE), { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/kb.js:26
    writeFileSync(tmp, JSON.stringify(db, null, 1), { mode: 0o600 });
  • 写入本地文件
    dsh/kb.js:27
    renameSync(tmp, FILE);
  • 读取本地文件
    dsh/leads.js:37
    raw = readFileSync(LEADS_FILE, 'utf8');
  • 写入本地文件
    dsh/leads.js:61
    mkdirSync(DATA_DIR, { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/leads.js:62
    appendFileSync(LEADS_FILE, `${JSON.stringify(run)}\n`, { mode: 0o600 });
  • 发起网络请求
    dsh/mail/compose.js:20
    const response = await fetch(`${config.deepseek.baseURL.replace(/ +$/, '')}/chat/completions`, {
  • 发起网络请求
    dsh/mail/replies.js:46
    const response = await fetch(`${config.deepseek.baseURL.replace(/ +$/, '')}/chat/completions`, {
  • 读取本地文件
    dsh/monitor.js:16
    const parsed = JSON.parse(readFileSync(FILE, 'utf8'));
  • 写入本地文件
    dsh/monitor.js:24
    mkdirSync(dirname(FILE), { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/monitor.js:26
    writeFileSync(tmp, JSON.stringify(db, null, 1), { mode: 0o600 });
  • 写入本地文件
    dsh/monitor.js:27
    renameSync(tmp, FILE);
  • 发起网络请求
    dsh/score.js:69
    const response = await fetch(`${config.deepseek.baseURL.replace(/ +$/, '')}/chat/completions`, {
  • 读取本地文件
    dsh/sop.js:25
    const parsed = JSON.parse(readFileSync(FILE, 'utf8'));
  • 写入本地文件
    dsh/sop.js:33
    mkdirSync(dirname(FILE), { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/sop.js:35
    writeFileSync(tmp, JSON.stringify(db, null, 1), { mode: 0o600 });
  • 写入本地文件
    dsh/sop.js:36
    renameSync(tmp, FILE);
  • 读取本地文件
    dsh/store.js:12
    const parsed = JSON.parse(readFileSync(FILE, 'utf8'));
  • 写入本地文件
    dsh/store.js:20
    mkdirSync(dirname(FILE), { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/store.js:22
    writeFileSync(tmp, `${JSON.stringify(list, null, 1)}`, { mode: 0o600 });
  • 写入本地文件
    dsh/store.js:23
    renameSync(tmp, FILE);
  • 读取本地文件
    dsh/store.js:91
    return existsSync(FILE);
  • 读取本地文件
    dsh/suppress.js:12
    const parsed = JSON.parse(readFileSync(DOMAIN_FILE, 'utf8'));
  • 写入本地文件
    dsh/suppress.js:20
    mkdirSync(dirname(DOMAIN_FILE), { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/suppress.js:22
    writeFileSync(tmp, JSON.stringify(list, null, 1), { mode: 0o600 });
  • 写入本地文件
    dsh/suppress.js:23
    renameSync(tmp, DOMAIN_FILE);
  • 读取本地文件
    dsh/suppress.js:62
    const parsed = JSON.parse(readFileSync(FILE, 'utf8'));
  • 写入本地文件
    dsh/suppress.js:70
    mkdirSync(dirname(FILE), { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/suppress.js:72
    writeFileSync(tmp, JSON.stringify(list, null, 1), { mode: 0o600 });
  • 写入本地文件
    dsh/suppress.js:73
    renameSync(tmp, FILE);
  • 读取本地文件
    dsh/track.js:27
    const parsed = JSON.parse(readFileSync(FILE, 'utf8'));
  • 写入本地文件
    dsh/track.js:35
    mkdirSync(dirname(FILE), { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/track.js:37
    writeFileSync(tmp, JSON.stringify(db, null, 1), { mode: 0o600 });
  • 写入本地文件
    dsh/track.js:38
    renameSync(tmp, FILE);
  • 读取本地文件
    dsh/warmup.js:27
    const parsed = JSON.parse(readFileSync(FILE, 'utf8'));
  • 写入本地文件
    dsh/warmup.js:35
    mkdirSync(dirname(FILE), { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/warmup.js:37
    writeFileSync(tmp, JSON.stringify(db, null, 1), { mode: 0o600 });
  • 写入本地文件
    dsh/warmup.js:38
    renameSync(tmp, FILE);
  • 请求外部主机api.deepseek.com
    dsh/warmup.js:143
    const response = await fetch(`${String(config.deepseek.baseURL ?? 'https://api.deepseek.com').replace(/ +$/, '')}/chat/completions`, {
  • 发起网络请求
    dsh/warmup.js:143
    const response = await fetch(`${String(config.deepseek.baseURL ?? 'https://api.deepseek.com').replace(/ +$/, '')}/chat/completions`, {
  • 读取本地文件
    dsh/templates.js:12
    const parsed = JSON.parse(readFileSync(FILE, 'utf8'));
  • 写入本地文件
    dsh/templates.js:20
    mkdirSync(dirname(FILE), { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/templates.js:22
    writeFileSync(tmp, JSON.stringify(list, null, 1), { mode: 0o600 });
  • 写入本地文件
    dsh/templates.js:23
    renameSync(tmp, FILE);
  • 发起网络请求
    dsh/content.js:42
    const response = await fetch(`${config.deepseek.baseURL.replace(/ +$/, '')}/chat/completions`, {
  • 读取本地文件
    dsh/emailintel.js:87
    const parsed = JSON.parse(readFileSync(CACHE_FILE, 'utf8'));
  • 写入本地文件
    dsh/emailintel.js:95
    mkdirSync(dirname(CACHE_FILE), { recursive: true, mode: 0o700 });
  • 写入本地文件
    dsh/emailintel.js:97
    writeFileSync(tmp, JSON.stringify(db), { mode: 0o600 });
  • 写入本地文件
    dsh/emailintel.js:98
    renameSync(tmp, CACHE_FILE);
  • 发起网络请求
    dsh/proxy.js:64
    const response = proxy ? await requestThroughProxy(target, init, proxy) : await fetch(target, init);
  • 发起网络请求
    dsh/proxy.js:83
    const req = http.request(
  • 发起网络请求
    dsh/proxy.js:103
    const connect = http.request({
  • 发起网络请求
    dsh/proxy.js:119
    const req = https.request(
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
涉及外部主机:api.deepseek.com

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 谷歌三层搜客
  • WhatsApp客服审核
  • 邮件触达闭环

外贸获客插件 for DeepSeek Harness (dsh): Google 三层搜客 + WhatsApp 客服审核台 + 邮件触达闭环 (ICP 评分/跟进序列/CRM/报价PDF), 零依赖

README

由 DeepSeek 最新模型翻译生成
dsh-waimao 🌐💬 DeepSeek Harness (dsh) 外贸获客插件:从「搜到链接」到「成交回款」的完整流程,全部装进你的 dsh。 设置ICP画像 → 三层搜索 → 提取联系方式 → 规则过滤 → AI评分(判断是否对口) → 邮箱验证 → 开发信(dry-run,线程头,spintax,日上限) → 人工审批 → 触达(邮件/WhatsApp) → IMAP回复扫描+AI分类 → 跟进序列 → CRM管线 → 官网监控(意图信号) → 报价PDF → 结案复盘 → 效果统计 功能总览(50 个对话工具 + 5 个网页) | 模块 | 能力 | | 🎯 ICP 画像 | icp_set 一句话设置"卖什么+找什么买家";评分判断线索是否对口(对口/沾边/不对口+理由),写开发信自动带上产品 | | 🌐 谷歌获客 | 三层公式(基础搜索/LinkedIn职位定向/采购信号)、18个市场预设、逐层去重、引擎自动 failover、Google Maps 商家数据源(serpapi)、CSV导出 | | 🧪 线索加工 | 抓页提取邮箱/WhatsApp/电话/社媒、规则引擎过滤(同行/B2B平台/黄页/招聘/社媒一眼排除)、AI评分0-12分(🔴极高/🟠高/🟡中/🟢低+开发建议)、自动入CRM去重合并 |
展开完整文档(README 剩余 1 节)
dsh-waimao 🌐💬

DeepSeek Harness (dsh) 外贸获客插件:从「搜到链接」到「成交回款」的完整流程,全部装进你的 dsh。

设置ICP画像 → 三层搜索 → 提取联系方式 → 规则过滤 → AI评分(判断是否对口) → 邮箱验证 → 开发信(dry-run,线程头,spintax,日上限) → 人工审批 → 触达(邮件/WhatsApp) → IMAP回复扫描+AI分类 → 跟进序列 → CRM管线 → 官网监控(意图信号) → 报价PDF → 结案复盘 → 效果统计

功能总览(50 个对话工具 + 5 个网页)

| 模块 | 能力 |
| 🎯 ICP 画像 | icp_set 一句话设置"卖什么+找什么买家";评分判断线索是否对口(对口/沾边/不对口+理由),写开发信自动带上产品 |
| 🌐 谷歌获客 | 三层公式(基础搜索/LinkedIn职位定向/采购信号)、18个市场预设、逐层去重、引擎自动 failover、Google Maps 商家数据源(serpapi)、CSV导出 |
| 🧪 线索加工 | 抓页提取邮箱/WhatsApp/电话/社媒、规则引擎过滤(同行/B2B平台/黄页/招聘/社媒一眼排除)、AI评分0-12分(🔴极高/🟠高/🟡中/🟢低+开发建议)、自动入CRM去重合并 |
| 📧 邮箱发现验证 | 35+模式猜测 + MX记录 + SMTP RCPT探测 + catch-all检测(hunter.io 开源平替) |
| ✉️ 开发信 | DeepSeek 个性化生成(带知识库引用)/ 三语模板兜底(英/西/葡)、零依赖SMTP客户端、dry-run 总闸默认开、首触审批闸、回复线程头、退订脚注、Spintax 变体、三层日上限(全局 / 每邮箱业务 / 每邮箱业务+预热总顶) |
| 📬 回复检测闭环 | IMAP 扫描买家回复 → 正则先过滤(免费) → 模糊回复才调 AI,12 类细分(感兴趣/约会议/询价/提问/拒绝/已离职/转介同事/休假/退订/退信)→ 自动改 replied + 停序列;退订进抑制列表、退信整域名拉黑 |
| 🛡️ 合规 | 抑制列表(地址+域名两级,发送强制拦截)、退订提示行(认 STOP/ALTO/PARAR)、全量审计日志 |
| 📤 标准导出 | CRM/搜索结果一键导出 Instantly/Smartlead 标准列(email/first_name/company/reason...),免映射导入;reason 字段带"为什么选这条线索" |
| 📅 跟进序列 | Day 0/3/7/14 四步自动跟进(挂原邮件线程)、回复即停、cron 定时执行 |
| 📊 CRM 管线 | 状态机(新→评估→触达→回复→报价→成交/流失)、客户档案、跟进活动、跨搜索去重合并、CSV导出 |
| 🔐 SOP 阶段机 | 八阶段服务端强制顺序(agent 不可跳步)、人工审批门(哈希绑定,改动即失效) |
| 📚 知识库 | 产品/报价政策/案例/市场规则,检索带 citation,AI 回复客户有据可依 |
| 🕵️ 公司背调 | RDAP WHOIS(域名年龄,新站标警)+ 技术栈指纹(Shopify/Woo等)+ 业务信号(招聘=扩张) |
| 👀 意图监控 | cron 盯客户官网变化,命中 new product/hiring 等信号词=触达时机 |
| ⏰ 定时任务 | WA收件箱轮询、序列执行、回复扫描、官网监控、每日管线日报、停跟进提醒 |
| 💬 WhatsApp | 客服审核台(AI草稿+人工审核)、媒体消息(发报价PDF)、受控群发(随机间隔+每日上限+3连败熔断) |
| 📄 报价 | 英文报价单 PDF(零依赖手写生成)、自动关联CRM |
| 📈 效果统计 | 漏斗转化、分层回复率、市场分布、回复分类、触达量、打开率/点击率 |
| 📬 打开/点击追踪 | 发信自动注入像素+链接包裹(HTML替身),公网反代模式,防开放重定向 |
| 🔥 邮箱预热池 | 多收件箱互为预热池(主账号+smtp.accounts 按天轮换配对):每邮箱独立爬坡限额(第1周5封/天,每周+5)、自动回复/标星已读、误入垃圾箱自动挪回 INBOX、可选 DeepSeek 生成自然内容;业务发送由 smtp.dailyCap / accounts[].dailyCap 单独保护 |
| 🚀 Instantly 直连 | instantly_push_leads 把 CRM 高分对口线索批量推进 Instantly 活动(标准字段映射+≤500/批+dry_run 预览)、instantly_campaign_list 查活动/账号;官方 OpenAPI v2 对齐 |
| 🩺 送达率体检 | SPF/DKIM/DMARC/MX DNS检查 + 修复建议,首封开发信前必跑 |

安装

npx -y @deepseek-ai/dsh plugin --profile web add github:shine-233/dsh-waimao
本地开发:add link:C:\path\to\dsh-waimao

重启 dsh web,浏览器打开:

- http://127.0.0.1:3080/waimao/leads —— 谷歌获客(搜索→提取→评分→入CRM)
- http://127.0.0.1:3080/waimao/crm —— CRM 管线(AI开发信/序列/状态流转)
- http://127.0.0.1:3080/waimao/review —— WhatsApp 客服审核台
- http://127.0.0.1:3080/waimao/templates —— 模板(邮件模板库 + 报价默认条款)
- http://127.0.0.1:3080/waimao/settings —— 设置(全部配置+连通性测试+WhatsApp扫码)

快速上手(对话里说人话即可)

我卖电吹风,找欧美批发商 → icp_set 存好画像(第一次用先做这个)

帮我开发墨西哥电吹风买家 → sop_create → lead_search → lead_enrich → lead_score → email_compose
→ [人工审批] → email_send → 结案报告

看看这些线索质量怎么样 → lead_enrich → 按 🔴🟠🟡🟢 分层汇报,附对口判断、联系方式和开发建议

给这个客户报1000台FOB价 → kb_search(报价政策) → quote_pdf → wa_send_media / email_send

配置

~/.waimao/config.json(推荐直接用设置页,带测试按钮): jsonc {
"icp": { "product": "professional hair dryers 1800-2400W", "buyers": "wholesalers, beauty supply distributors" },
"serp": {
"engine": "ddg", "serpapiKey": "", "perLayer": 10,
"proxy": "http://127.0.0.1:7890", // 大陆网络必填
"chain": ["ddg", "serpapi"] // failover 链
},
"evolution": { "baseURL": "http://127.0.0.1:8080", "apiKey": "", "instance": "" },
"deepseek": { "baseURL": "https://api.deepseek.com", "apiKey": "", "model": "deepseek-chat" },
"smtp": {
"host": "smtp.gmail.com", "port": 465, "secure": true,
"user": "", "pass": "", "from": "", "fromName": "Sales",
"dryRun": true, // ⚠️ 总闸:确认能跑通后再改 false "dailyCap": 300, // 每日真实发送上限-全局,新域名建议 20-30 "mailboxTotalCap": 50, // 每邮箱每日总上限(业务+预热合计),新域名建议 50 "allowColdSendWithoutApproval": false, // 首触冷邮件审批闸:false=智能体必须走 SOP 审批 "plainText": false, // 纯文本模式:不注入追踪,投递率更好 "sendWindow": true // 序列发送时间窗:收件人当地时间工作日 9-19 点之外顺延 },
"cron": { "enabled": true, "waSyncEveryMin": 30, "sequenceCheckEveryMin": 60, "dailyReportAt": "09:00", "staleDays": 7 },
"wa": { "dailyBroadcastCap": 200, "minDelaySec": 20, "maxDelaySec": 90 },
"webhookToken": "随机字符串" }

追踪与预热(需要公网入口)

dsh 只绑 127.0.0.1,收件人的邮件客户端打不到本机。要启用打开/点击追踪,给插件一个公网入口:
bash
方式一:cloudflared 隧道(无需公网IP) cloudflared tunnel --url http://127.0.0.1:3080 方式二:同机 caddy/nginx 反代 track.example.com → 127.0.0.1:3080

然后 config.track.publicBaseUrl 填该域名。未配置时追踪静默关闭。安全设计:像素/点击端点用 24 位随机 ID(不可枚举),点击只 302 到发送时登记过的 URL(防开放重定向),响应零数据。

邮箱预热(新域名/新账号必做,否则必进垃圾箱): jsonc
"warmup": {
"enabled": true,
"maxPerDay": 30,
"partners": [{ "host": "smtp.partner.com", "user": "b@partner.com", "pass": "***", "imapHost": "imap.partner.com" }]
}

cron 每天自动跑一轮预热池互动:池内邮箱按天轮换配对互发(主账号 + smtp.accounts 都参与,warmup:false 可退出),每邮箱独立爬坡第1周限5封/天、每周+5;收件侧自动回复+标星+已读,误入垃圾箱的预热邮件尽力挪回 INBOX。smtp.dry_run=true 时预热同样不真实发送。发信前先 deliverability_check 体检 SPF/DKIM/DMARC。

安全设计

- 所有网页/API 只接受回环+同源请求;webhook 必须带 token
- API key/邮箱密码只存本机,浏览器永远拿不到
- 邮件 dry-run 总闸默认开;首触冷邮件需人工审批(SOP 已批准草稿或网页手动发送,对齐 Instantly"激活"模式);走 SOP 流程的发送强制使用批准稿(哈希绑定)
- 群发默认 dry_run,真实发送有频控+熔断;全部动作进审计日志(audit_query 可查)

兼容性

基于 @deepseek-ai/dsh 0.1.0-rc.7 插件面(bundle patch / tools.register / webServer.register)。零 npm 依赖,Node ≥ 22.13。

免责声明

搜索请遵守引擎条款;邮件营销请遵守 CAN-SPAM/GDPR,提供退订方式;WhatsApp 自动化遵守其服务条款,控制频率防封号。Evolution API 为第三方开源网关。

License

MIT
预览分享卡片长什么样 ↓shine-233/dsh-waimao
分享 · DeepSeek Harness Hub
shine-233/dsh-waimao

从谷歌搜客到邮件成交,一站式跑通外贸获客全流程

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部