MailCheap:Marc Lou 开源的自托管 Newsletter 系统,用 Amazon SES 发信,每千封约 0.1 美元

12次阅读
没有评论

订阅平台按人头收费,订阅者越多越贵;Amazon SES 只按发出去的邮件算钱。MailCheap 把两者之间缺的那一层补上了:编辑器、订阅表单、退订、退信处理和数据统计。

本文介绍 MailCheap 是什么、作者省钱的说法是否站得住,完整的部署步骤(含 SES 沙盒申请和 SPF、DKIM、DMARC 配置),以及它和 Listmonk、Sendy、Mailchimp、Kit 的对比。资料于 2026 年 10 月 11 日查阅 GitHub 仓库、作者 X 帖子和各平台官方定价页。

MailCheap 是什么

MailCheap 是独立开发者 Marc Lou 开源的 Newsletter(邮件简报)系统,MIT 协议,2026 年 10 月 10 日发布,一天多 GitHub 星数约 600。它是一个 Next.js 应用,数据存在 MongoDB,邮件通过你自己的 Amazon SES 账号发送,后台批量发送和定时任务交给 Upstash QStash。

它能写一期简报、发给订阅列表,同时把这期内容发布成公开的网页存档。只有一个管理员,没有团队和套餐,订阅者名单留在你自己的数据库里。

需要提前说明:作者在 README 里写明这是一次性开源发布,不提供支持,Issue 已关闭,Pull Request 也不一定会处理,没有后续更新计划。想用就 Fork 一份,自己维护。

MailCheap:Marc Lou 开源的自托管 Newsletter 系统,用 Amazon SES 发信,每千封约 0.1 美元
后台概览:发送量、送达率、打开率、点击率、退信率、投诉率和订阅者增长曲线(截图来自 MailCheap GitHub 仓库,数据为虚构)

作者的省钱账:从约 4000 美元到不到 300 美元

Marc Lou 在 2026 年 10 月 9 日的 X 帖子里解释了自己做这个项目的原因:他离开 Beehiiv,是因为对方两年内第三次涨价,他第一年的年费是 1,000 美元,按新价格未来要付 4,000 美元;换成 AWS SES 加 MongoDB 之后,他预计每年花不到 300 美元。次日开源时,他又补了一句“比 Beehiiv 便宜 92%(对我来说)”。

MailCheap:Marc Lou 开源的自托管 Newsletter 系统,用 Amazon SES 发信,每千封约 0.1 美元
Marc Lou 公开的年费用数字:Beehiiv 第一年 1,000 美元、涨价后预计 4,000 美元,换成 SES 和 MongoDB 后预计不到 300 美元(根据作者 X 帖子绘制)

这笔账的核心是计费方式不同:订阅平台按订阅者人数按月收费,而 SES 按发出的邮件收费。README 给的例子是 1 万名读者、每月 4 期,一共 4 万封邮件,SES 费用约 4 美元。

我们按官方价格核对了一遍:

  • Amazon SES:官方定价页写明发信每 1,000 封 0.10 美元,附件流量每 GB 另收 0.12 美元。新 AWS 用户还有最多 200 美元的免费试用额度。
  • Upstash QStash:免费版每天 1,000 条消息,超出后每 10 万条 1 美元。MailCheap 一条消息发 50 封邮件,免费额度相当于每天 5 万封。
  • MongoDB Atlas 和 Vercel:README 说免费套餐就够用。

注意,作者不到 300 美元的数字是他自己的预估,包含他的发送量和数据库等开销,你的实际费用取决于订阅人数、发送频率,以及数据库和托管是否超出免费额度。

它解决什么痛点

  • 订阅者越多越贵:主流平台按人头分档计费,不活跃的订阅者也要付钱。
  • 平台涨价没得选:名单在别人那里,迁移成本高,只能接受新价格。
  • 自己直接用 SES 太原始:SES 只负责投递,订阅表单、退订链接、退信和投诉处理、统计报表都得自己写。
  • 不活跃订阅者拖累送达率:一直给不打开邮件的人发信,容易被邮箱服务商判为垃圾邮件。

主要功能

写作和发送

  • 编辑器:左边写、右边实时预览邮件效果,支持斜杠命令、图片上传,也可以直接写 Markdown 或 HTML。
  • 发送前检查:标题、预览文本、退订链接、邮件大小(Gmail 超过 100 KB 会折叠)、实体地址、发信域名是否验证,逐项打勾。
  • 测试、定时和分批发送:通过 QStash 按你设定的速度分批发送,可以先发给最活跃的读者,情况正常再发给更多人。
MailCheap:Marc Lou 开源的自托管 Newsletter 系统,用 Amazon SES 发信,每千封约 0.1 美元
编辑器:左侧编辑、右侧实时预览,右上角列出发送前的检查项(截图来自 MailCheap GitHub 仓库)

订阅和名单

  • 多个 Newsletter:一套系统可以运营多份简报,各自设置发件人、回复地址和实体地址。
  • 订阅表单和 API:每份简报的存档页自带订阅表单,也可以用 API Key 从自己的网站添加订阅者。
  • 双重确认:可按简报开启确认订阅,默认关闭;支持欢迎邮件,支持从其他平台导入 CSV。
  • 限流:订阅、登录、退订和 API 默认都有频率限制。

送达率保护

  • 退信和投诉处理:接收 SES 的投递、退信、投诉事件,维护一个所有简报共用的屏蔽名单。
  • 自动暂停:退信率超过 2% 或投诉率超过 0.08% 时,正在进行的发送会自动暂停。
  • 一键退订:邮件头带 RFC 8058 标准的一键退订,Gmail 和 Yahoo 对群发邮件有这个要求。
  • 名单清理:默认关闭。开启后,连续多期没打开的读者会收到一封“还想继续订阅吗”,之后不再给他们发。

存档和统计

  • 公开存档:每期内容自动生成网页,带作者页、分享图和站点地图,可以绑定独立域名。
  • 数据报表:订阅者增长、每小时发送量,以及送达、打开、点击、退信、投诉率;单次发送还能按 Gmail、Outlook、Yahoo、iCloud 等邮箱服务商拆分。
  • 域名页:直接显示 SES 发信域名的 DKIM 和 MAIL FROM 状态,以及需要添加的 DNS 记录。
MailCheap:Marc Lou 开源的自托管 Newsletter 系统,用 Amazon SES 发信,每千封约 0.1 美元
单次发送报告:送达、打开、点击和退信数据,可按邮箱服务商查看(截图来自 MailCheap GitHub 仓库)

部署前要准备什么

服务 用途 费用(README 与官方定价)
MongoDB 订阅者、发送记录、统计 Atlas 免费集群可用,也可以自建
Amazon SES 发信 每 1,000 封 0.10 美元
Upstash QStash 后台分批发送、定时 免费每天 1,000 条消息,超出每 10 万条 1 美元
Vercel 或任意 Node.js 主机 运行应用 Vercel 免费套餐可用
Upstash Redis(可选) 多实例共享限流 免费套餐
Vercel Blob(可选) 编辑器图片上传 免费套餐

本机或服务器需要 Node.js 22 或更高版本。作者估计整个流程大约一小时,大部分时间在等 DNS 生效和 AWS 审批。

部署步骤

1. 创建数据库

在 MongoDB Atlas 建一个免费集群,添加一个有读写权限的数据库用户,网络访问放行 0.0.0.0/0(Vercel 没有固定 IP),然后复制连接字符串,在问号前加上数据库名 mailcheap,这就是 MONGODB_URI。

2. 部署应用

README 顶部有一个 Deploy with Vercel 按钮,点击后填写四个必填变量:

  • MONGODB_URI:上一步的连接字符串。
  • ADMIN_EMAIL 和 ADMIN_PASSWORD:后台登录账号,密码至少 12 位。
  • SESSION_SECRET:至少 32 位随机字符,用下面的命令生成。
openssl rand -base64 48

部署完成后打开 你的项目.vercel.app/login 登录。此时发信功能默认关闭,不会误发。如果打算用自己的域名访问后台,现在就绑定,并把 APP_URL 设成这个域名,因为邮件里的链接都基于它,发出第一封之前要定下来。

3. 配置 Amazon SES

以下操作都在同一个 AWS 区域完成(README 示例用 us-east-1):

  1. 验证发信域名:在 SES 控制台创建域名身份,建议用子域名(如 mail.example.com),这样即使发信出问题也不影响主域名的邮件。保留 Easy DKIM(RSA 2048),把 SES 给出的 3 条 CNAME 记录加到 DNS。
  2. 设置自定义 MAIL FROM 域名:填 bounce.mail.example.com,按提示添加 MX 和 TXT 记录,让 SPF 与你的域名对齐。
  3. 添加 DMARC:如果根域名还没有,在 _dmarc.example.com 加一条 TXT 记录,内容先用 v=DMARC1; p=none;。Gmail 和 Yahoo 要求群发邮件的发件人必须有 DMARC。
  4. 申请退出沙盒:新账号默认在沙盒里,每天最多发 200 封,而且只能发给验证过的地址。在 Account dashboard 里点 Request production access,用途选 Marketing,说明订阅者都是主动订阅的、退信和投诉会自动屏蔽、每封邮件都有一键退订。README 说 AWS 通常一天内答复。
  5. 创建配置集:例如命名为 mailcheap,SES 自带的打开和点击追踪保持关闭,MailCheap 会在你自己的域名上统计。
  6. 创建 SNS 主题并接收事件:建一个标准主题(如 mailcheap-ses-events),把签名版本改成 2(SHA256),在配置集的事件目标里勾选硬退信、投诉、送达、延迟、拒绝和渲染失败,发送到这个主题。
  7. 创建专用 IAM 用户:只授予发信和读取身份信息的最小权限(README 给出了完整的策略 JSON),然后生成访问密钥。
  8. 填写变量并订阅事件:在 Vercel 加上 SES_REGION、SES_ACCESS_KEY_ID、SES_SECRET_ACCESS_KEY、SES_CONFIGURATION_SET、SES_SNS_TOPIC_ARN 后重新部署;再在 SNS 主题里创建 HTTPS 订阅,地址填你的应用域名加 /api/webhooks/ses,MailCheap 会自动确认。

修改 SNS 签名版本的命令:

aws sns set-topic-attributes --topic-arn <你的主题ARN> --attribute-name SignatureVersion --attribute-value 2

完成后,MailCheap 的 Domains 页面会显示域名的 DKIM 和 MAIL FROM 状态。

4. 配置 QStash

在 Upstash 控制台复制 QSTASH_TOKEN、QSTASH_CURRENT_SIGNING_KEY 和 QSTASH_NEXT_SIGNING_KEY,填进 Vercel 后重新部署。QStash 要从公网回调你的应用,所以应用必须能被外网访问。

5. 打开发信开关

在后台创建一份 Newsletter,发件地址必须在已验证的域名下,实体地址会出现在每封邮件页脚(反垃圾邮件法规要求)。然后把 SENDING_ENABLED 设为 true 并重新部署,写一期内容,先给自己发测试邮件,再正式发送。

新域名怎么预热

新域名直接给几千人群发,很容易进垃圾箱。README 的送达率建议总结如下:

  • 用子域名发信:出问题只影响子域名。
  • 三项认证都配好:DKIM 用 Easy DKIM,SPF 通过自定义 MAIL FROM 域名对齐,根域名配 DMARC。
  • 只发给主动订阅的人:不要导入买来或爬来的名单;表单被机器人刷时打开双重确认。
  • 逐步放量:先发给最活跃的读者,几周内逐次扩大发送量。MailCheap 的“分批发送”和报告页的“发给更多人”就是为这个设计的。
  • 盯住投诉和退信:投诉率控制在 0.1% 以下,退信率在 2% 以下;把域名加入 Google Postmaster Tools 查看 Gmail 那边的垃圾邮件率。
  • 邮件控制在 100 KB 以内:否则 Gmail 会折叠正文,退订链接也被藏起来。

能不能部署在自己的 VPS 上

可以,这是 README 里写明的选项:除了 Vercel,任何 Node.js 主机都能跑,只要提供同样的环境变量并放在 HTTPS 后面,同时手动设置 APP_URL。MongoDB 也可以在同一台服务器上用 Docker 运行。

git clone https://github.com/marclou/mailcheap.git && cd mailcheap
npm ci && npm run build && npm start

放在 VPS 上有几点要知道:

  • QStash 仍然需要:后台发送依赖 Upstash QStash 从公网回调你的服务器,VPS 方案并不能完全脱离第三方服务。
  • 图片上传需要 Vercel Blob 令牌:不配置的话编辑器上传图片关闭,但 Markdown 和 HTML 里可以引用任何外链图片。
  • 限流更简单:README 说没有 Redis 时限流计数存在每个实例的内存里;单台 VPS 只有一个进程时,这个问题基本不存在。
  • 运维自己负责:Nginx 或 Caddy 反向代理、HTTPS 证书、进程守护和数据库备份都要自己做。

如果已经有一台在跑其他服务的 VPS,顺手部署很合适;内存建议 2 GB 起(这是经验值,Next.js 构建和 MongoDB 都比较吃内存)。常见的选择有 RackNerd 和 CloudCone 这类低价美国 VPS,以及更看重线路质量的 搬瓦工 和 DMIT。如果只是想省事,Vercel 免费套餐加 MongoDB Atlas 免费集群就够了,不必专门买服务器。

用法

用 API 添加订阅者

在 API keys 页面创建密钥后,就能从自己的网站或其他应用添加订阅者:

curl -X POST https://你的域名/api/v1/contacts \
  -H "Authorization: Bearer $MAILCHEAP_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"newsletter":"weekly","email":"[email protected]","source":"website"}'

同一个访客 IP 每 10 分钟最多订阅 5 次,每个密钥每小时最多 600 次。API 还能创建草稿和列出已发送的期数,但正式发送仍然要在后台手动点击。

公开存档

每期发送后,存档页会自动更新。设置 ARCHIVE_HOSTS 可以把存档放到独立域名上,README 说这样更安全,因为存档页的 HTML 不会和后台共用同一个域。

MailCheap:Marc Lou 开源的自托管 Newsletter 系统,用 Amazon SES 发信,每千封约 0.1 美元
公开存档页:每期简报自动发布成网页,带订阅表单(截图来自 MailCheap GitHub 仓库,数据为虚构)

优缺点

优点:

  • 发得越多越划算:按邮件计费,订阅者多、发送频率低的简报最省钱。
  • 送达率功能齐全:自动屏蔽、阈值暂停、一键退订、名单清理和按服务商拆分的报表都有。
  • 名单在自己手里:数据在你的 MongoDB 里,支持 CSV 导入,迁移没有门槛。
  • MIT 协议:可以随意修改,作者也鼓励 Fork 后用 AI 改成自己想要的样子。

缺点:

  • 没有任何支持:作者明确不维护、不答疑,出了问题只能自己看代码。
  • 配置步骤多:AWS、SNS、IAM、DNS、QStash 一样不能少,没接触过 AWS 的人会花不少时间。
  • SES 需要审核:退出沙盒要人工审批,有被拒的可能。
  • 只有一个管理员:没有团队协作、付费订阅、自动化营销序列等功能。
  • 项目非常新:发布才一天多,没有经过长期生产验证。

适合谁

  • 订阅者几千到几万、正在为按人头计费发愁的独立开发者和内容创作者。
  • 熟悉 AWS 或愿意花一两个小时配置的技术用户。
  • 想把订阅名单、存档和数据都握在自己手里的人。

如果你需要付费订阅、推荐网络、广告变现,或者完全不想碰 DNS 和 AWS,Beehiiv、Kit 这类托管平台更省心。

和同类方案对比

对比项 MailCheap Listmonk Sendy Mailchimp / Kit
类型 开源自托管(Next.js) 开源自托管(单个二进制) 商业自托管(PHP) 托管平台
软件费用 免费,MIT 免费,AGPLv3 一次性 69 美元 按订阅人数月付
发信通道 Amazon SES 任意 SMTP 等 Amazon SES 平台自带
运行环境 Vercel 或 Node.js 主机 自己的服务器 PHP 主机 无需部署
维护 作者不维护 社区活跃,GitHub 约 2.4 万星 官方提供支持 官方维护

托管平台的价格(官方定价页,2026 年 10 月 11 日,均会随订阅人数增加):

  • Kit(原 ConvertKit):免费版最多 1 万订阅者,但功能有限;Creator 套餐按 1,000 订阅者计每月 33 美元(年付)。
  • Beehiiv:有免费版;Lite 套餐每月 49 美元起(年付)。
  • Mailchimp:按联系人数分档,有 Free、Essentials、Standard、Premium 套餐;官网显示 Standard 套餐最低档前 12 个月每月 20 美元起,联系人越多越贵。

简单说:想零成本、愿意自己折腾,又要成熟社区的,选 Listmonk;不想写代码、接受一次性付费并要官方支持的,选 Sendy;想要界面现代、开箱就有送达率保护,并能接受“作者不维护”的,MailCheap 值得一试。

项目信息

项目 信息
名称 MailCheap
作者 Marc Lou
GitHub marclou/mailcheap
开源协议 MIT
技术栈 Next.js 16、Tailwind CSS、shadcn/ui、MongoDB(Mongoose)
依赖服务 Amazon SES、Upstash QStash、MongoDB
运行要求 Node.js 22 以上
发信成本 Amazon SES 每 1,000 封 0.10 美元
维护状态 一次性发布,不提供支持
GitHub 星数 约 600(2026-10-11)

资料来源

正文完
 0
liujiana
版权声明:本站原创文章,由 liujiana 于2026-10-11发表,共计6829字。
转载说明:本文由(baffox.com)根据项目官网、开源社区及公开资料整理。工具的功能、价格、授权与服务条款可能随时间调整,请以官方最新页面为准。合理引用请注明出处并保留本页链接;如发现内容错误、版权或侵权问题,请通过联系邮箱进行反馈,我们将第一时间核实处理。
评论(没有评论)
验证码