沙盒
功能完整的本地演示环境,端到端运行实际发送、回复、打开、点击和邮箱预热,并提供完整的历史记录与分析数据集。
沙盒将本地服务栈变成持续活动的产品演示。它创建示例组织“Sunrise Labs”,其中邮箱会真实发送和同步;再回填完整历史与分析数据,让所有控制台界面首次加载时就有内容;随后运行模拟器扮演互联网:将捕获的邮件投递到收件人邮箱,加载跟踪像素,点击跟踪链接,并以示例联系人身份回复。营销活动统计不断增长,统一收件箱出现带会话关系的回复,预热互动得到验证,控制台实时更新;这些都通过生产代码路径执行。唯一模拟的是人。
快速入门
一条命令启动全部组件:
make sandbox它启动基础设施 postgres、redis、nats、mailpit 和 dovecot,执行迁移,创建示例组织,以容器启动实时及跟踪服务,无需主机安装 Elixir 或 cargo,然后在该终端一起运行后端、消费者、工作节点、控制台、管理端和模拟器。Ctrl-C 停止应用,基础设施继续运行,供下次使用。
然后在 http://localhost:5173 登录:
| 字段 | 值 |
|---|---|
| 邮箱 | [email protected] |
| 密码 | password123 |
| 组织 | Sunrise Labs,专业版套餐 |
填充的历史已让控制台内容完整。实时活动稍后开始:观察 make sandbox 输出中持续出现的 delivered / opened / clicked / replied 行,并在 http://localhost:18025 的 Mailpit 查看每封实际传输邮件。
另外两个入口:
make sandbox SEED=false使用已有数据运行服务栈,不重新填充。make sandbox-seed创建或重置示例组织后退出,不启动应用或模拟器。
会载入哪些示例数据
make sandbox-seed 是幂等的,可安全重跑。它会配置:
- 先加载完整
internal/seed示例,包括套餐、工作节点和演示组织,因此也可用于全新数据库。 - 拥有活跃专业版订阅的 Sunrise Labs 组织,所有者为
[email protected];另有第二位团队成员 Marco Diaz,角色为管理员,以及一条待接受邀请和一个有效开发者 API 密钥。 - AI 积分:套餐每月额度加上购买的 5,000 积分补充额度,让助手和所有其他 AI 功能开箱可用;重新填充会补满两个积分池。
- 20 个
@sunrise.test发件邮箱,按控制台自身覆盖指标形成健康预热池,分配给make sandbox运行的工作节点,覆盖完整预热生命周期:七个已完成递增数周、拥有完整约每天 50 封冷邮件量的成熟发件人,八个正在递增,三个刚连接,一个暂停预热,一个健康度下降且有未解决服务商警告。每个账户都回填匹配的预热递增统计和每日发送计数,并有不同的池健康分、个人签名,以及 VIP、Agency 或 Cold 标签。发送节奏适合演示,最短间隔 45 秒,上限每天 100 封。 - 各个列表分类中的营销活动:两个活跃活动,“Sunrise Q3 launch outreach”有三步骤、48 位联系人,“Agency partnerships”有两步骤、24 位联系人;另有一个暂停、一个完成和一个草稿。全部启用跟踪,每一步明确连接到下一步,因为调度器只沿显式步骤连接执行;20 个发件人全部参与轮换,并有分布在三周内、符合实际漏斗形态的发送、打开、点击、回复和退信时间戳。
- 实例面板中的六个投递位置种子邮箱,使用自己的域名
gmail-seeds.test、workspace-seeds.test、m365-seeds.test、outlook-seeds.test和yahoo-seeds.test,各自标明所模拟的服务商,让任意 Sunrise 邮箱的投递位置测试都有接收目标。 - 活跃的统一收件箱:多个发件人收到归入会话的回复,包括会议请求、休假自动回复、不感兴趣回复和退信通知,混合已读与未读。
- 五阶段 CRM 销售管道,五个分布在不同阶段的交易,以及任务、联系人备注和逐联系人活动时间线。
- 送达能力和报告视图背后的分析表:打开、点击、回复、退信、投诉和退订事件,回复意图分类、禁止发送名单,以及已解决和未解决邮箱错误。
- 组织审计轨迹,包括营销活动创建和启动、邮箱连接、成员邀请、交易创建和密钥创建,使审计日志具有历史深度。
- 回复模板、通知,其中部分未读,以及所有应出现标签的位置:文件夹 Outbound 和 Nurture,邮箱标签 VIP、Cold、Agency,工作区标签 Lead、Customer、Churn risk,并关联营销活动、发件人、多个联系人和收件箱会话。
- 数据库中每个
smtp_imap账户的可用凭据,包括旧的make seed示例;它们由CREDENTIALS_ENCRYPTION_KEY密封,使工作节点能够解密并使用。 - 一个顾问演示,见下文;填充结束时运行一次评估,让你登录前就有建议。
Advisor 演示
顾问只有面对存在问题的工作区才有建议,因此数据填充器会刻意给 Sunrise Labs 设置几个问题。其他方面会先归一化为管理良好的基线:每个发件人使用每天 50 封安全上限、各自已验证的跟踪域名,SPF、DKIM 和 DMARC 均通过。这样剩余发现具有针对性,而不是同一张卡片重复二十遍。
所有预置问题定义在 internal/sandbox/advisor.go:
[email protected]有一个月真实发送记录,即 1,600 个已完成任务,包含 72 次退信和一次投诉,退信率为4.5%,投诉率为0.06%。两者来自真实tasks和deliverability_events行,因此顾问数字与送达能力页面一致,不会相互矛盾。它的上限也被提高到每天 120 封。[email protected]有 SPF 和 DKIM,但没有 DMARC,发送间隔为 90 秒。[email protected]六天前连接,直接使用每天 50 封完整上限,并暂停了预热。- “Q4 outbound (first draft)”是一个暂停活动,呈现典型初稿问题:只有一封邮件、没有跟进,关闭一键退订,主题像喊话且会截断,正文 246 词、四个链接,使用群发式措辞,还有
{{if}}却没有{{end}},这不会让发送失败,而是悄悄退化为字面文本。其 160 位联系人中,四分之一为共享收件箱,三分之一缺少正文称呼所需的名字。
这些设置不会阻止沙盒发送:上限提高而非降低,间隔变短,身份验证列仅用于观察;刻意粗糙的营销活动始终暂停,因此不会向模拟名单发送。
填充结束时会运行一次评估并打印发现,因此单独执行 make sandbox-seed 就能确认整条路径工作。预计约二十项发现,分数在三十多分。
工作原理
真实邮件服务器代替互联网邮件基础设施:
- Mailpit 是 SMTP 接收器。每个邮箱的出站服务器都指向它,因此所有营销活动和预热发送都会被捕获,并可在界面查看。
- Dovecot 承载邮箱收件箱,接受任意用户名和密码
sandbox,首次使用时自动创建 maildir。工作节点真实的 IMAP 同步每分钟轮询一次。
模拟器连接两者,并扮演所有人。它还为种子邮箱扮演垃圾邮件过滤器:内容检查低于 70 分的投递位置副本会进入 Junk,其他邮件也有固定比例进入;Microsoft 和 Yahoo 种子的比例更高,带跟踪的内容还会更高,因此测试及其跟踪对比都能看到分布:
- 轮询 Mailpit API 获取新邮件,以已读标志作为游标。
- 发给托管邮箱的邮件,例如池成员之间的预热邮件,会追加到该用户的 Dovecot 收件箱。收件人的工作节点同步读取它,验证预热令牌,并在真实 IMAP 文件夹上执行互动操作。
- 发给示例联系人的邮件会触发对应角色:经过模拟真人的延迟后,多数联系人向本地跟踪服务加载像素,部分点击跟踪链接,部分回复。回复带正确的
In-Reply-To会话关系,并追加到发件邮箱收件箱;如果回复地址指向另一个沙盒邮箱,则写入该邮箱,模拟邮件客户端按Reply-To回复。因此回复归因、回复分类器、EMAIL_REPLIED实时事件和统一收件箱都与生产行为一致。部分回复为带Auto-Submitted邮件头的休假自动回复,也能看到分类限制的效果。
角色由联系人地址的哈希派生,因此重启后行为仍稳定,无需额外状态:约 92% 打开,打开者中 57% 点击、45% 回复;回复语气分为感兴趣、提问、不感兴趣和休假。为使演示保持活跃,这些比例有意高于真实外联。
涉及的组件
| 组件 | 作用 |
|---|---|
cmd/sandbox | 数据填充器和模拟器二进制,支持 -seed-only、-simulate-only |
internal/sandbox | 数据填充、历史和分析样例、Mailpit 客户端、角色及 IMAP 投递 |
dovecot Compose 服务 | 沙盒收件箱的 IMAP 主机,端口 10143/10993,属于 sandbox 配置组 |
mailpit Compose 服务 | SMTP 接收器及捕获 API,端口 11025/18025 |
CREDENTIALS_ENCRYPTION_KEY | 密封静态存储的邮箱凭据,Makefile 提供固定开发值 |
MAIL_TLS_INSECURE=true | 仅工作节点使用的开发开关:跳过 TLS 验证并允许无 TLS 的 Mailpit;生产环境绝不可设置 |
环境变量
make sandbox 会配置默认服务栈所需的一切。手动运行 cmd/sandbox 时使用:
| 变量 | 默认值 | 含义 |
|---|---|---|
PRIMARY_DB | :15432 上的开发 Postgres | 数据填充和目录查询使用的数据库 |
MAILPIT_URL | http://localhost:18025 | Mailpit API 基础地址 |
TRACKING_URL | http://localhost:3000 | 接收像素和点击访问的跟踪服务 |
DOVECOT_IMAP_ADDR | localhost:10993 | 模拟器追加邮件的位置 |
DOVECOT_PASSWORD | sandbox | Dovecot 固定密码 |
SANDBOX_SMTP_HOST / SANDBOX_SMTP_PORT | localhost / 11025 | 填充为邮箱出站服务器,工作节点连接此地址 |
SANDBOX_IMAP_HOST / SANDBOX_IMAP_PORT | localhost / 10993 | 填充为邮箱入站服务器,工作节点连接此地址 |
CREDENTIALS_ENCRYPTION_KEY | 由 Makefile 设置 | 必须与后端密钥一致 |
SANDBOX_VENDOR_ADDR | 127.0.0.1:18099 | 模拟邮箱供应商 API 的监听地址 |
SANDBOX_VENDOR_LATENCY_MS | 1200 | 模拟供应商的响应延迟,模拟真实 API;0 表示立即响应 |
模拟邮箱供应商
模拟器还扮演两个邮箱供应商,因此无需真实供应商账户,也能连接供应商账户、导入邮箱并管理域名。make sandbox 启动它,并通过 MAILVENDOR_SANDBOX_URL=http://127.0.0.1:18099 将后端指向它。如果只想在自己的后端旁运行模拟服务,使用 go run ./cmd/sandbox -vendors-only,并以相同变量启动后端。除非 APP_ENV 为 dev,否则后端忽略此变量。
在添加账户 > 邮箱供应商中使用任意 API 密钥即可连接两者。InboxKit 模拟器有两个工作区,因此邮箱会显示各自所属工作区:
| 供应商 | 邮箱 | 域名 |
|---|---|---|
| InboxKit | 八个 Google Workspace 邮箱,分别位于“Sunrise Outbound”工作区的 sunrise-outbound.test 和“Sunrise Trials”工作区的 trysunrise.test。与真实 API 一样,只返回密码;.test 没有邮件服务器,因此对应行会要求服务器设置。点击行上的修复,可指向沙盒 Mailpit localhost:11025 和 Dovecot localhost:10993 | 支持转发和 DNS 写入,因此发送域名可一键设置根域名转发和跟踪记录 |
| Mailforge | sunrisehq.test 上的四个邮箱,托管在沙盒 Mailpit 和 Dovecot,因此能够真正导入并连接 | 仅支持转发 |
模拟服务在内存保存状态,因此重启后每个域名恢复初始状态。
演示脚本
以下演示流程展示平台端到端工作:
- 控制台:进入概览即有完整内容。尚未发生任何实时发送时,整体统计、热门营销活动、近期活动、账户健康和每日趋势图就已由历史数据填满。
- 营销活动:活跃、暂停、完成和草稿四类都有内容。打开 Sunrise Q3 launch 活动;调度器在二十个邮箱间按节奏真实发送,发送计数不断增长,打开、点击和回复继续累加到预置漏斗上。
- 统一收件箱:回复通过工作节点的 IMAP 同步到达,带完整正文并归在原邮件下。休假自动回复会显示,但不计为真人回复。
- 邮件送达能力与分析:送达能力视图显示退信、投诉和退订及其比例;回复意图和禁止发送名单已有数据;邮箱显示一个已解决错误和一个未解决错误。
- 邮箱:各发件人显示不断递增的预热活动,预热池在账户之间交换已验证邮件。
- Mailpit,地址为
http://localhost:18025:查看原始传输内容,包含平台发送的每封邮件、预热令牌和跟踪重写。 - 顾问:账户、营销活动、联系人和送达能力各显示其后紧急发现的数量。先打开账户查看三个问题发件人,再到营销活动打开“Q4 outbound (first draft)”,查看文案和名单问题。对某项点击修复,例如
erik.lund的预热暂停,查看修改前后预览,应用后也可从卡片撤销。 - 实时更新:打开第二个浏览器窗口,观察计数和收件箱行无需刷新即更新。在一个窗口应用顾问修复,另一个窗口中的卡片也会消失。
故障排查
启动后不久仍没有发送。 检查后端日志中的营销活动协调器记录,并确认工作节点正在运行且已加载账户,日志为 email account added to worker。后端和工作节点都启动后,工作节点会在一分钟内通过后端协调器获知邮箱。
发送因 TLS 错误失败。 工作节点必须设置 MAIL_TLS_INSECURE=true,make worker 已设置。生产配置绝不能使用它。
统一收件箱没有回复。 确认模拟器和消费者都在运行:投递链路为模拟器、Dovecot、工作节点 IMAP 同步、事件总线、消费者。
打开和点击不计数。 跟踪服务必须运行;make sandbox 以容器运行它,安装 cargo 后也可通过 make tracking 原生运行。消费者将跟踪事件处理到营销活动统计。
从头开始。 make db-wipe && make sandbox 会重新完整填充。可以先执行 docker compose -p warmbly rm -sf dovecot mailpit,再执行 make sandbox,清空 Dovecot 和 Mailpit 状态。