关于 day3
Day3 是面向小型 SaaS 团队的邮件服务,整合营销活动、事务性邮件与投递跟踪。其 MCP 端点可让编码工具在 Day3 中创建可编辑的邮件编辑器内容块。
主要功能
- 01活动草拟与块式编辑器
- 02定时发送及单次发送统计
- 03受众细分与 CSV 导入
- 04带投递状态的事务性邮件
- 05邮件自动化与投递指标
适用场景
- 01通过编码工具草拟邮件活动
- 02准备产品更新和变更日志
- 03发送收据等事务性消息
- 04跟踪投递与互动情况
MCP 相关
MCP 端点可让 Claude Code、Cursor 和 VS Code 草拟活动,并将其作为可编辑内容块放入 Day3。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://go.day3.app/api/mcpclaude mcp add --transport http mopra-day3 https://go.day3.app/api/mcp{"mcpServers":{"mopra-day3":{"type":"http","url":"https://go.day3.app/api/mcp"}}}在 Cursor 中打开{"servers":{"mopra-day3":{"type":"http","url":"https://go.day3.app/api/mcp"}}}在 VS Code 中打开{"mcpServers":{"mopra-day3":{"type":"http","url":"https://go.day3.app/api/mcp"}}}{"mcpServers":{"mopra-day3":{"serverUrl":"https://go.day3.app/api/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
https://go.day3.app/api/mcp需要授权工具
详细介绍
Day3
营销和事务性邮件,按发送量计费。每月 1 美元。没有联系人费用,也不必学习整套营销工具。
可查看源代码,但不开源。 发布此代码是为了提高透明度并供参考。许可条款请参阅 LICENSE。
此仓库就是 Day3 产品本身:位于 go.day3.app 的应用、公共 REST API、webhook 和 MCP 端点,以及负责发送邮件的工作进程。
功能
Day3 是一款专为小型 SaaS 团队打造的精简邮件工具。通过一个经过验证的域名、一份每月额度和一个查看投递情况的平台,向用户发送产品更新和变更日志,并发送应用的事务性邮件(密码重置、收据、免密链接)。
- 营销活动:提供区块编辑器、可选 AI 辅助、定时发送和单次发送统计
- 受众:提供细分群体(已保存的筛选条件)、主题(订阅类别)、CSV 导入和托管注册表单
- 事务性邮件:通过
POST /v1/emails发送,格式兼容 Resend,并提供每封邮件的投递状态 - 自动化:在节点画布上绘制引导和生命周期工作流,以不可变版本发布,所有套餐均不限量
- 默认保障投递能力:验证发送域名、双重确认订阅、一键退订、自动抑制退信和投诉,并在声誉不佳时自动暂停账户
- 指标:投递能力、声誉和参与度指标,以及可搜索的所有已发送邮件日志
- 公共 API v1、签名 webhook 和 MCP 服务,让 Claude Code、Cursor 或 VS Code 能够起草营销活动,并以可编辑区块的形式保存到 Day3
- 按发送量计费,而非按订阅人数计费。 免费账户可以设置域名、构建受众并在沙盒模式下实际发送。付费套餐则提供联系其他所有人的发送额度。
PRODUCT.md 是对 Day3 的定位、定价和各项功能行为的权威说明。阅读代码前请先阅读该文档。
技术栈
| 层 | 技术 |
|---|---|
| Web 框架 | Next.js 16 (App Router),运行于 Vercel |
| UI | React 19、Tailwind CSS 4、基于 Base UI 的 shadcn/ui、react-hook-form、Zod |
| 富文本 | TipTap |
| 数据库 | Postgres (Supabase),通过 Drizzle ORM 和 postgres.js 驱动程序连接 |
| 队列 / 作业 | BullMQ + Redis (ioredis),由 VPS 工作进程处理 |
| 邮件 | AWS SES v2 (eu-north-1) 用于发送,AWS SNS 用于投递事件 |
| 身份验证 / 租户 / 计费 | Clerk(Organizations 是租户边界,并使用 Clerk Billing) |
| 文件存储 | Supabase Storage(用于 CSV 导入) |
| AI(可选) | 通过 Vercel AI SDK 使用 OpenRouter |
| MCP 服务 | 基于 Streamable HTTP 在 /api/mcp 上手写的 JSON-RPC,无状态且仅提供工具 |
| DNS 自动化 | Cloudflare OAuth,可选,用于自动配置 SES 记录 |
| 测试 | 使用 pglite 的 Vitest,每个测试使用一个内存 Postgres |
快速链接
| 网站 | day3.app:介绍 Day3、定价及其优势 | 仓库 |
| 应用 | go.day3.app:登录、撰写营销活动、发送邮件 | 仓库 |
| 文档 | docs.day3.app:API 参考、指南、webhook、MCP | 仓库 |
由 Pradsgaard Labs 构建。同一工作室还开发了 exit1.dev,用于运行时间监控。
本地开发
npm install
# Env: web tier + worker (see "Required environment variables" below)
cp .env.example .env.local
cp .env.worker.example .env.worker
# Database
npm run db:migrate # forward-only, applies un-applied journal entries
npm run db:seed # optional sample data
npm run dev # Next.js on http://localhost:3000
npm run worker # BullMQ worker, in a second terminal
使用 Clerk 登录并创建组织后,即可获得一个租户。活动营销流水线(审核、生成收件人、分批排队发送、统计)可在本地端到端运行。
实用命令:
npm test:使用真实的 Postgres(pglite)运行 vitest。每次运行都会从头应用迁移,并断言 schema、journal 和快照一致。幂等性测试也在这里。npm run typecheck/npm run lint/npm run buildnpm run db:generate:schema 变更后生成新的 Drizzle 迁移npm run db:studio:浏览本地数据库
迁移规范
src/db/schema.ts 是唯一事实来源。migrations/ 下的 SQL 只允许向前迁移,且由工具生成,绝不可手动编辑。迁移的一部分还包括 journal(migrations/meta/_journal.json)和每次迁移对应的 *_snapshot.json 文件,因此务必一起提交。
修改 schema 时的工作流:
- 编辑
src/db/schema.ts。 npm run db:generate会写入下一个NNNN_*.sql、对应快照和 journal 条目。- 检查 SQL(如果差异过于杂乱,可在同一个 PR 中合并或重命名),然后在一次提交中同时提交 SQL 和
meta/变更。 npm test可验证迁移能否从头顺利应用。
CI 会强制执行此规范:重新运行 drizzle-kit generate,如果产生任何差异就会导致构建失败,这表示 schema.ts 与已提交的迁移不一致,或添加迁移时没有附带快照。两位贡献者同时生成迁移时,会在下一个 NNNN 索引上发生冲突。解决方法是基于合并后的 schema.ts 重新生成其中一个迁移,以确保 journal 保持线性。
生产环境中的应用顺序是 drizzle-kit migrate(参见部署检查清单),它会针对 DATABASE_URL 重放尚未应用的 journal 条目,并将其记录在 __drizzle_migrations 表中。切勿使用 db:push,它会比较实时数据库,可能会删除列。
必需的环境变量
两个进程都会在启动时验证环境(src/lib/env.ts),如果缺少必需变量或密钥过短(最少 16 个字符),就会拒绝启动。这样可以避免空密钥故障:例如,未设置 UNSUBSCRIBE_SECRET 时,会使用 "" 对 HMAC 令牌签名(可伪造退订链接和一键链接);未设置 OAUTH_STATE_SECRET 时,则会使 OAuth CSRF 防护失效。Next Web 层会在首次加载服务端模块时验证(instrumentation.ts)。Worker 会在开始消费任务前,于 worker/index.ts 中进行验证。
| 变量 | Web | Worker | 备注 / 生成方式 |
|---|---|---|---|
DATABASE_URL | ✓ | ✓ | Postgres 连接字符串。 |
UNSUBSCRIBE_SECRET | ✓ | ✓ | 用于退订和一键令牌的 HMAC 密钥。两层必须一致。node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" |
OAUTH_STATE_SECRET | ✓ | 用于 Cloudflare OAuth 状态 Cookie(CSRF)的 HMAC 密钥。node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" | |
DNS_TOKEN_ENC_KEY | ✓† | 由 32 个原始字节(AES-256)编码而成的 base64,用于加密静态存储的 Cloudflare DNS 令牌。node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"。†也可使用 DNS_TOKEN_ENC_KEYS + DNS_TOKEN_ENC_ACTIVE_KEY_ID 进行轮换,参见 docs/cloudflare-dns-oauth.md。 | |
CLERK_WEBHOOK_SIGNING_SECRET | ✓ | 用于验证 Clerk Webhook。本地使用至少 16 个字符的占位值。 | |
AWS_REGION | ✓* | ✓* | *仅当 EMAIL_PROVIDER=ses 时必需。 |
完整列表(包括非机密配置:Clerk 可发布密钥和密钥、Redis、Supabase Storage 以及 SES 凭据)请参阅 .env.example(Web)和 .env.worker.example(Worker)。
上线生产(首次部署检查清单)
Web 层运行在 Vercel 上,BullMQ 工作器运行在 VPS 上,Postgres 运行在 Supabase 上。完整的服务提供商操作指南:docs/go-live.md。
- 配置 Supabase Postgres、VPS Redis(
rediss://)和 SES(参见 go-live)。 - 在 Vercel(Web)和
/opt/day3/.env.worker(工作器)上设置环境变量,参照.env.example和.env.worker.example。 - Clerk 控制台:生产实例、组织计费方案、Webhook 端点
/api/webhooks/clerk。 - 在任何新代码开始处理流量之前,先应用数据库迁移:
DATABASE_URL=<supabase-direct-5432> npm run db:migrate。该操作仅向前且具备幂等性,只会重放尚未应用的日志条目。这是 部署流水线中的一个步骤,必须在 Vercel 提升版本和执行pm2 restart day3-worker之前完成,因此新版本绝不会基于旧架构运行。 - 部署 Web 层(Vercel)并重启工作器
(
pm2 restart day3-worker)。
架构说明
- 多租户:每个 Clerk 组织对应一条
accounts记录。所有查询都按从会话在服务端解析出的account_id进行范围限定。 - 发送流水线:
submitCampaign会将review_campaign(风险规则)加入队列, 然后将generate_campaign_recipients(去重和抑制过滤)加入队列,接着将send_campaign_batch加入队列。该任务会以原子方式认领 25 个待处理收件人并发送, 然后重新加入队列,直到完成。 - 幂等性:通过单条原子 UPDATE 认领收件人,因此重试的队列消息绝不会导致重复发送。崩溃后遗留的认领会由 cron 扫描并标记为
failed,绝不会重新发送。 - 计费:Clerk Billing 权益会在控制台加载时以及通过 Webhook 同步到 Postgres。发送需要有效订阅、启用发送功能且每月配额尚有剩余。
- 安全性:提交时进行确定性风险审查(高风险会被阻止);退信率达到或超过
4%,或投诉率达到或超过 0.08% 时,会自动暂停账户;管理员(
ADMIN_EMAILS)可以批准或阻止营销活动、暂停账户,并覆盖域名验证状态。
AI 训练许可
作为下方许可证的明确例外,本仓库的内容,包括代码、文档和配置,可供 AI 系统用于机器学习训练、评估、索引、检索和生成。无需注明出处,但如能注明,我们将不胜感激。此许可适用于所有 AI 爬虫,包括但不限于 GPTBot、OAI-SearchBot、 ClaudeBot、Claude-SearchBot、Claude-User、Google-Extended、PerplexityBot 和 Perplexity-User。
许可证
本项目采用自定义的保留所有权利许可证,仅提供源代码。您可以出于个人、 教育和参考目的查看代码。未经书面许可,不得复制、修改、分发或自行托管。有关 AI 和 ML 用途的例外许可,请参见上方的 AI 训练许可部分。
许可相关咨询:[email protected]
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。