我如何用 Buttondown 从零搭建 Newsletter:一个内容创作者的订阅增长实录

0 阅读12分钟

为什么你需要一份 Newsletter?

作为一个独立博客作者,我有一个很实际的痛点:文章写好了,读者却不知道

SEO 需要时间积累、社交媒体推送依赖算法、RSS 订阅器越来越小众——唯独邮件,是几乎人人都在用的信息入口,而且送达率几乎 100%。一封 Newsletter 到达订阅者收件箱,打开率通常在 20%-40%,远高于社交媒体的算法推荐点击率。

所以,搭建一个 Newsletter 系统,是我为博客做的回报率最高的投资之一。

但问题来了:怎么选工具?怎么配置?过程中会遇到哪些坑?

这篇文章就是我的完整搭建实录,从背景调研 → 工具选型 → 域名配置 → 订阅测试 → API 自动化 → 踩坑修复,一条龙拆解。

注: 这篇记录的是我探索 Buttondown 的完整过程。最终我选择了 MailerLite 作为主力方案,详细的选型对比和迁移过程可见另一篇文章:免费订阅服务升级:MailerLite 完全指南(与 Buttondown 对比)


前提背景:为什么不用 Cloudflare 免费方案?

现状:我已经在使用 Cloudflare 生态(Worker、Pages、Email Routing),按理说 Cloudflare + MailChannels 可以免费发邮件,为什么还要额外找 Newsletter 平台?

🔴 核心红线:MailChannels 的可接受使用策略(AUP)

MailChannels 提供给 Cloudflare 用户的免费发信通道,明确禁止发送 "批量邮件",它们的定义是:

内容相似、一次发送给多个收件人的非事务性邮件

你的"新文章通知"正好完全踩中这条红线——同样是"文章更新了",同样发给所有订阅者,不是由每个用户单独触发的独特内容。

如果强行用 Worker + MailChannels 做订阅推送,后果是:

  • MailChannels 检测到批量 + 相似内容 → 封禁发信权限,连带你的事务邮件功能也可能被关停
  • 甚至可能影响你的域名信誉,导致正常的邮件也被标记为垃圾

✅ 为什么 Resend / MailerLite / Buttondown 允许?

因为它们定位不同:

  • Resend 虽是开发者邮件 API,条款中明确允许发送双方有明确订阅关系的邮件(如 Newsletter),前提是不垃圾、合规
  • MailerLite 专做 Newsletter / 营销邮件的平台,完全鼓励订阅推送,并提供退订链接等合规工具
  • Buttondown 也是一个专注于 Newsletter 的平台,天然支持订阅推送场景

而 MailChannels 通过 Cloudflare 的集成是完全免费的,但严格限定在"事务"范围内——这个免费的代价就是不能做订阅推送。

💡 方案对比

方案能否做 Newsletter成本风险
Cloudflare + MailChannels❌ 政策禁止免费被封禁
Cloudflare + Resend✅ 允许有免费额度
MailerLite最终选择有免费层
Buttondown✅ 可考虑免费层 1000 订阅
自建邮件服务器✅ 技术上可以高维护成本域名信誉风险

为什么考察 Buttondown?

在对比了 MailerLite、Buttondown、ConvertKit 等主流 Newsletter 平台后,Buttondown 有几个吸引我的点:

Buttondown 的核心优势

  • 最多 1,000 名订阅者 — 免费层对于个人博客早期完全够用
  • 无品牌标志 — 邮件底部不加"由 XXX 提供"之类的广告
  • RSS 转邮件 — 支持自动从 RSS 抓取内容发送,不过这是付费功能(可替代方案:用 API 自行实现)
  • 有完整 API — 可以和你的 Worker 联动,实现自定义自动化
  • 界面极简 — 专注写作本身,没有花哨的营销功能干扰
  • 支持自定义发件人域名 — 搭配 Cloudflare DNS 验证,完全去掉"代发"字样,显得专业

数据流

博客 RSS 更新 → Buttondown 检测到 → 自动发送(需付费版)
或:你的 Worker 调 Buttondown API 触发发送
发信服务器:Buttondown
发件人:noreply@lxpavilion.top(DNS 验证后无 via 标记)

与 MailerLite 的对比考量

对比维度ButtondownMailerLite
免费层订阅数1,0001,000
RSS 自动转邮件⚠️ 付费功能✅ 免费支持
自动化工作流较少丰富(条件分支、触发器等)
界面风格极简写作风功能完整型
品牌标志免费层有品牌标志
API完整完整

最终我选择 MailerLite 的原因主要是:RSS 自动转邮件在免费版中就支持,自动化工作流更丰富,虽然免费层邮件底部有品牌标志,但对我来说功能优先级高于无标。详细的对比分析见:免费订阅服务升级:MailerLite 完全指南(与 Buttondown 对比)


第一步:注册与基础配置

1. 官网注册

进入 Buttondown 官网,使用邮箱注册登录。

2. 控制台基础设置

登录后进入控制台,先配置个人基础信息:

字段建议填法读者在哪里看到
用户名lxpavilion默认网址 buttondown.com/lxpavilion
通讯名称LXPavilion邮件顶部、订阅页标题
作者姓名ppd邮件发件人旁

Timezone 选择 Asia/Shanghai (GMT+8),确保发送时间按照北京时间计算。

image.png


第二步:配置发件人域名(关键步骤)

这是让邮件看起来专业的关键一步。如果你用自己的域名发邮件,收件人看到的是 noreply@lxpavilion.top,而不是 lxpavilion@buttondown.email

场景一:没有自己的域名

如果你没有自己的域名,Buttondown 会使用默认的 buttondown.email 后缀,如 lxpavilion@buttondown.email。这也能正常工作,只是不够个性化。

场景二:有自己的域名(推荐)

这是更专业的做法。我的域名 lxpavilion.top 在 Cloudflare 托管,配置过程如下:

  1. 在 Buttondown 设置页添加你的域名
  2. Buttondown 会自动检测你的 DNS 服务商,并显示需要添加的 DNS 记录
  3. 前往 Cloudflare DNS 管理页,添加这些 DNS 记录

image.png

我的域名使用 Cloudflare 托管,所以在 Cloudflare 中添加相应的 DNS 记录:

image.png

当 DNS 记录显示为绿色即表示配置成功:

image.png

小提示: DNS 记录添加后通常需要几分钟到几小时才能全球生效,但 Cloudflare 的生效速度通常很快,几分钟即可。


第三步:嵌入订阅表单到博客

为了让读者能方便地订阅你的 Newsletter,需要在博客中嵌入订阅表单。

Buttondown 提供官方文档可以参考:Building your subscriber base

下面是我的博客中使用的示例代码:

<form action="https://buttondown.com/api/emails/embed-subscribe/lxpavilion" method="post" style="max-width: 400px; margin: 20px 0;">
  <div style="display: flex; gap: 8px;">
    <input type="email" name="email" placeholder="输入你的邮箱" required style="flex: 1; padding: 10px 14px; border: 1px solid #d1d5db; border-radius: 6px; font-size: 14px; outline: none;">
    <button type="submit" style="padding: 10px 20px; background-color: #2563eb; color: white; border: none; border-radius: 6px; font-size: 14px; font-weight: 600; cursor: pointer;">订阅</button>
  </div>
  <p style="font-size: 12px; color: #6b7280; margin-top: 8px;">新文章直接送达邮箱,可随时退订。</p>
</form>

这段代码生成了一个简洁的嵌入式表单,读者在输入框输入邮箱后点击"订阅"即可。

订阅测试全流程

步骤一:输入邮箱并点击订阅

image.png

步骤二:确认订阅意图

首次订阅时,Buttondown 会要求再次输入邮箱确认,防止误操作或恶意订阅:

image.png

步骤三:邮件确认(Double Opt-in)

此时 Buttondown 会发送一封确认邮件到你的邮箱,点击邮件中的确认链接:

image.png

步骤四:订阅成功

点击确认链接后,会弹出已确认的页面,表示订阅成功:

image.png

步骤五:查看订阅结果

在 Buttondown 后台可以看到订阅者列表:

image.png


第四步:发送测试邮件

配置完成后,发送一封测试邮件验证整个链路是否正常。

在控制台发送:

image.png

在收件箱接收:

image.png

检查要点:

  • 邮件是否正常到达(包括垃圾邮件文件夹)
  • 发件人是否显示为你配置的域名
  • 邮件排版是否正常
  • 退订链接是否可用

🚧 踩坑日记(重要)

在实际配置和测试过程中,我遇到了以下几个坑,希望你能避开:

坑 1:重复订阅触发限制

如果使用同一个设备、同一个 IP 重复订阅多个邮箱,Buttondown 会触发限流机制,无法继续发送订阅请求。

解决方法: 使用浏览器的无痕模式/隐私模式进行测试。

坑 2:登录状态干扰订阅测试

如果你的电脑上已经登录了 Buttondown 账号,此时使用另一个邮箱进行订阅操作会出现异常——因为系统认为你是在用已登录账号操作。

image.png

解决方法: 退出 Buttondown 登录,或者使用其他浏览器进行测试。

坑 3:账号被锁定

测试时可能因为发送了过多测试邮件,或者触发了平台的安全机制,导致账号被锁定。我的账号就在测试阶段被锁定了。

image.png

解决方法: 在控制台主页提交审核信息,说明你的用途,通常很快就能恢复。

坑 4:DNS 记录未生效

添加 DNS 记录后,如果 Buttondown 没有立即显示绿色验证通过,可能是 DNS 还在传播中。使用 dig 或在线 DNS 查询工具检查记录是否已生效。


第五步:API 自动化(重要)

手动发邮件只是基本操作,真正的价值在于自动化——当我发布新博客文章时,自动给所有订阅者发送通知。

虽然 Buttondown 官方支持 RSS 转邮件,但这是付费功能。免费版可以通过 API 自行实现,这也是一个很好的学习机会。

获取 API Key

在 Buttondown 的 API 设置页面创建新的 API Key,默认选项即可:

image.png

有了 API Key,你就可以通过代码管理邮件和订阅服务了。

Python 示例 1:创建邮件草稿

import requests

API_KEY = "你的API_KEY"  # 替换为你的真实 API Key
BUTTONDOWN_URL = "https://api.buttondown.email/v1/emails"

headers = {
    "Authorization": f"Token {API_KEY}",
    "Content-Type": "application/json"
}

# 测试邮件内容
payload = {
    "subject": "[测试] 来自 Buttondown API 的问候",
    "body": """
        <h2>这是一封测试邮件</h2>
        <p>如果你看到这封邮件,说明 Buttondown API 配置成功。</p>
        <p>发件人地址:mail@lxpavilion.top(无代发字样则 DNS 验证通过)</p>
        <p><a href="https://lxpavilion.top">访问博客</a></p>
    """
}

response = requests.post(BUTTONDOWN_URL, json=payload, headers=headers)

if response.status_code == 201:
    print("✅ 邮件发送成功!请检查收件箱(包括垃圾邮件)。")
    print("邮件 ID:", response.json()["id"])
else:
    print(f"❌ 发送失败,状态码:{response.status_code}")
    print("错误信息:", response.json())

image.png

Python 示例 2:定时发送邮件

from datetime import datetime, timedelta, timezone
import requests

API_KEY = "你的API_KEY"
BUTTONDOWN_URL = "https://api.buttondown.email/v1/emails"

headers = {
    "Authorization": f"Token {API_KEY}",
    "Content-Type": "application/json"
}

# 设置发送时间为 1 分钟后
future_utc = (datetime.now(timezone.utc) + timedelta(minutes=1)).strftime("%Y-%m-%dT%H:%M:%SZ")

payload = {
    "subject": "[测试] 来自 Buttondown API 的问候",
    "body": """
        <h2>这是一封测试邮件</h2>
        <p>如果你看到这封邮件,说明 Buttondown API 配置成功。</p>
        <p>发件人地址:mail@lxpavilion.top(无代发字样则 DNS 验证通过)</p>
        <p><a href="https://lxpavilion.top">访问博客</a></p>
    """,
    "status": "scheduled",
    "publish_date": future_utc    # 必须是将来的时间
}

response = requests.post(BUTTONDOWN_URL, json=payload, headers=headers)

if response.status_code == 201:
    print("✅ 邮件已创建并进入发送队列,1 分钟后发出。")
    print("邮件 ID:", response.json()["id"])
else:
    print(f"❌ 发送失败,状态码:{response.status_code}")
    print("错误信息:", response.json())

用 API 替代 RSS 自动转邮件

因为 Buttondown 官方 RSS 转邮件是付费功能,免费用户需要用 API 曲线救国——但这也给了你更大的灵活性。假如你选择用 API 方案实现自动化推送,思路如下:

  1. 在博客的构建流程(或 Cloudflare Worker)中监听新文章发布
  2. 通过 Buttondown API 自动创建邮件并发送
  3. 邮件内容自定义包含文章摘要和原文链接

不过就我的最终选择而言,MailerLite 免费版原生支持 RSS 自动转邮件,省去了自己维护这套流程的成本。如果你也是免费用户且重视 RSS 自动推送,MailerLite 在这方面更有优势。


一些运营建议

搭建完 Newsletter 只是开始,如何让它真正发挥作用,这里分享几点经验:

  1. 不要频繁发送 — 每周 1 封是比较合理的频率,太频繁会导致退订率上升
  2. 内容要有差异化 — Newsletter 不只是"文章推送",可以添加一些博客上没有的补充内容或个人思考
  3. 优化订阅入口 — 把订阅表单放在博客的显眼位置(侧边栏、文章末尾、导航栏)
  4. 关注打开率 — 通过 Newsletter 后台分析打开率,如果低于 20% 需要优化标题和内容
  5. 善用欢迎邮件 — 设置自动发送的欢迎邮件,让新订阅者第一时间了解你和你的博客

结语

从最初纠结于"能不能用 Cloudflare 免费方案",到先后体验 Buttondown 和 MailerLite,整个过程让我意识到:有时候花最小的成本(甚至免费)使用专业的 SaaS 服务,远比强行 DIY 要明智。MailChannels 的 AUP 不是想限制你,而是商业产品必须有明确的边界。

最终我选择了 MailerLite 作为博客的 Newsletter 主力方案——免费版原生支持 RSS 自动转邮件、自动化工作流更丰富,虽然邮件底部有品牌标志,但功能优先级对我来说更高。但探索 Buttondown 的过程同样收获颇丰:它的极简界面、API 设计、DNS 自定义域名配置等经验,放在任何 Newsletter 平台上都是通用的。

整个搭建探索过程配置下来不超过两小时,而带来的读者留存和互动效果的思考,远远超出了投入的时间成本。

延伸阅读:

如果你也在搭建自己的 Newsletter,或者在选型中遇到了类似的问题,欢迎交流分享。🚀


🌐 欢迎关注我的其他平台:

📧 联系我:mail@lxpavilion.top