私域流量。订阅者名单是你自己的,不会因为平台政策变化说没就没。做自媒体这几年见过不少人,公众号被封、账号被限流,辛辛苦苦积累的用户直接归零。邮件列表不存在这个问题。
打开率高。做得好的 Newsletter 打开率能到 30-50%,当然前提是内容要有价值,不能天天发广告。
变现潜力。积累到一定订阅量,可以接广告、做付费订阅,或者给自己产品导流。很多独立开发者的 Newsletter 都是重要收入来源。
更重要的是国外用户习惯用邮箱,他们日常沟通、接收信息,邮箱是主力。你们看国外的 SaaS 产品,几乎都有 Newsletter 订阅入口。如果做出海站,那邮件订阅基本是标配。
刚给我的导航站 toolcenter.ai 接了一套 Newsletter 系统,用的是 Resend。
为什么选 Resend?
市面上邮件服务很多,SendGrid、Mailchimp、AWS SES 都可以。我选 Resend 主要是这几点:
1、免费额度够用:每月 3000 封,前期项目完全够了
2、API 简单:几行代码就行,配置不复杂
开始对接
整个对接流程,还是老样子,代码让 Claude Code 写。域名验证、DNS 配置这些,自己操作。
第一步:注册账号
访问 注册,支持 Google 或 GitHub 登录。
注册完进到控制台,会引导你发第一封邮件。
第二步:添加域名
点 "Add Domain" 添加你的域名。
这里有个建议用子域名,别用主域名。随便拿一个域名来举例,比如用 mail.ipengtao.com 而不是直接用 ipengtao.com。
因为邮件发送是有信誉这个概念的。万一哪天邮件被投诉多了,影响的是子域名,不会连累你的主域名。
填写域名信息,Region 选离用户近的,亚洲用户选 Tokyo。
第三步:配置 DNS
添加完域名,Resend 会给你一堆 DNS 记录要配置:
| 类型 | 用途 |
|---|---|
| TXT (DKIM) | 邮件签名验证 |
| MX | 发送邮件 |
| TXT (SPF) | 防伪造验证 |
| TXT (DMARC) | 反钓鱼策略 |
如果域名在 DNSPod(腾讯云),直接批量添加:
添加完提交:
第四步:等验证
DNS 记录加完后要等 Resend 验证。快的话几分钟,慢的话几小时,取决于 DNS 传播速度。
验证通过后状态变绿:
第五步:创建 API Key
进 "API Keys" 页面,创建一个密钥:
配置选项:
-
Name:随你定,比如
my-newsletter -
Permission:默认 Full access
-
Domain:可以限制只能用于特定域名
注意:API Key 只显示一次,复制后赶紧存好。
第六步:配置环境变量
把 API Key 放到环境变量里:
# .env.production
RESEND_API_KEY=re_xxxxxxxxxxxxxxxx
EMAIL_FROM=newsletter@mail.yourdomain.com
EMAIL_REPLY_TO=contact@yourdomain.com
关于邮箱地址:
-
EMAIL_FROM:必须用已验证的域名,比如newsletter@mail.ipengtao.com -
EMAIL_REPLY_TO:可以是任意邮箱,用你能收到邮件的真实邮箱就行
这里有个坑,在 Vercel 配置环境变量时,网页粘贴可能会多一个换行符。如果发邮件报 "Invalid from field" 之类的错,多半是这个问题。我已经不止一次遇到了,本来为了省事让cc 操作,反而因为这个错误浪费了一些时间。
可以用命令行添加,避免换行符问题,或者直接去vercel后台添加。
echo -n "re_xxxxx" | vercel env add RESEND_API_KEY production
第七步:代码层面
安装 SDK:
npm install resend
# 或
pnpm add resend
发邮件的核心代码很简单:
// lib/email/resend.ts
import { Resend } from 'resend'
const resend = new Resend(process.env.RESEND_API_KEY)
export async function sendWelcomeEmail(email: string, confirmToken: string) {
const confirmUrl = `${process.env.NEXT_PUBLIC_BASE_URL}/api/newsletter/confirm?token=${confirmToken}`
const { data, error } = await resend.emails.send({
from: process.env.EMAIL_FROM!,
to: email,
replyTo: process.env.EMAIL_REPLY_TO,
subject: '确认订阅工具岛周刊 🎉',
html: getEmailTemplate(confirmUrl), // 你的邮件模板
})
if (error) {
console.error('Failed to send email:', error)
return { success: false, error }
}
return { success: true, data }
}
订阅接口:
// app/api/newsletter/subscribe/route.ts
import { NextRequest, NextResponse } from 'next/server'
import crypto from 'crypto'
export async function POST(request: NextRequest) {
const { email } = await request.json()
// 生成确认 token
const confirmToken = crypto.randomBytes(32).toString('hex')
const unsubscribeToken = crypto.randomBytes(32).toString('hex')
// 保存到数据库(我用的 Supabase)
await supabase.from('newsletter_subscribers').insert({
email,
status: 'pending',
confirm_token: confirmToken,
unsubscribe_token: unsubscribeToken,
})
// 发送确认邮件
await sendWelcomeEmail(email, confirmToken)
return NextResponse.json({ success: true })
}
代码部分我直接让 Claude Code 写的,告诉它要什么功能,很快就搞定了。
第八步:测试
用自己邮箱测试一下完整流程:
1、在网站上填邮箱订阅
2、收到确认邮件
3、点确认,跳到成功页面
4、测试退订流程(邮件底部的退订链接)
几个实践经验
Double Opt-in 很重要
就是用户提交邮箱后,要先发一封确认邮件,用户点了确认才算真正订阅。
为什么?一是确保邮箱是真的;二是减少垃圾邮件投诉;三是为了提高送达率。
退订要方便
每封邮件底部都要有退订链接,而且要一键退订,别弄"请输入您的邮箱确认退订"这种反人类设计。站在用户的角度上考虑这一步挺烦人的。
发送频率
Newsletter 建议每周一次,固定时间。我是每周五发。
别太频繁,一天发好几封,物极必反,太多就成了打扰用户了,很快就会被退订或者标记垃圾邮件。
进阶玩法
对接完基础功能后,还可以做一些进阶的事情。
用户召回:筛选一段时间没活跃的用户,发邮件告诉他们有什么新功能,或者送点回归福利。
优惠码发放:这个是看别人分享学到的。有些用户会打开支付页面但不付款,等着看会不会发优惠码。你可以针对这部分用户发一封邮件,给个小折扣,转化率会提升不少。
💡 AI 工具的爆发,让普通人也能快速做出产品。
但如何做?如何变现?如何真正走向海外市场?
👉 想了解更多 AI 编程 & 出海实战信息
扫码或微信搜索 257735,发送暗号 【美金】
了解详情,加入实战社群。
微信扫一扫,了解更多详情
🚀 我们的出海作品展示平台上线啦!
欢迎访问 Showcase 平台,
这里汇聚了学员的出海实战作品,方便大家获得反馈、积累曝光机会。
我们还会定期举办创作活动与奖励计划,欢迎来逛逛!
🔗 更多教程请访问 ipengtao.com
文章评论