新闻通讯
配置新闻通讯提供商来管理订阅
LaunchSaaS 通过拆分包设计提供新闻通讯支持。核心包 @launchsaas/newsletter 定义接口;每个提供商是独立的包,按需安装。如果未配置提供商,新闻通讯功能则直接禁用。
更新时间:2026-03-22 - 说明广播邮件是通用能力,可由任意服务端工作流触发。
架构
@launchsaas/newsletter ← 接口 + Newsletter 类(始终需要)
@launchsaas/newsletter-resend ← Resend Audiences你只需安装实际使用的提供商包。
新闻通讯功能默认禁用(capabilities.ts 中 newsletter: null)。 安装
@launchsaas/newsletter-resend 并配置提供商即可启用。
设置新闻通讯功能
1. 安装提供商包
在你的应用目录中安装提供商包:
pnpm add @launchsaas/newsletter @launchsaas/newsletter-resend2. 配置环境变量
在 .env 文件中添加:
RESEND_API_KEY="re_..."
RESEND_FROM_EMAIL="[email protected]"
RESEND_AUDIENCE_NEWSLETTER="audience-id-for-newsletter"
# 可选 – 等待列表受众
RESEND_AUDIENCE_WAITLIST="audience-id-for-waitlist"RESEND_API_KEY
与邮件提供商共享。如果你已为事务性邮件设置过,则无需重复设置。
3. 在 src/capabilities.ts 中注册提供商
打开你的应用的 src/capabilities.ts,配置新闻通讯提供商:
// src/capabilities.ts (你的应用 — apps/launchsaas/src/capabilities.ts)
import { ResendNewsletterProvider } from "@launchsaas/newsletter-resend";
export const capabilities = {
// 设为 null 即可禁用新闻通讯功能
newsletter: ResendNewsletterProvider.create(),
// ...其他 capabilities
};4. 创建 Resend Audience
- 在 Resend Dashboard 中前往 Audiences
- 为新闻通讯订阅创建受众
- 将受众 ID 复制到
RESEND_AUDIENCE_NEWSLETTER
如果你正在首次设置环境,完成此步骤后请返回环境设置指南。
使用新闻通讯服务
import { capabilities } from "@/capabilities";
// 检查新闻通讯是否已配置
const newsletter = capabilities.newsletter;
if (newsletter) {
await newsletter.addContact("[email protected]");
}
// 将联系人添加到指定受众
await newsletter?.addContact("[email protected]", "optional-audience-id");
// 移除联系人
await newsletter?.removeContact("[email protected]");
// 向所有订阅者发送广播
await newsletter?.broadcast({
subject: "LaunchSaaS 最新动态",
react: MyEmailTemplate({ ... }),
audienceId: "optional-audience-id", // 未提供时使用默认值
});Newsletter 仅限服务端使用。请在 Server Components、Server Actions 或 Route
Handlers 中使用,不要在客户端组件中使用。
广播邮件
新闻通讯提供商支持一次性向受众中所有订阅者发送广播邮件。这比逐一发送更高效,也可由 Server Actions、Route Handlers 或自定义定时任务触发。
Resend 的 Broadcast API 可处理大型订阅者列表而不会超时。
禁用新闻通讯
将 src/capabilities.ts 中的 newsletter 字段设为 null 即可。当 capabilities.newsletter 为 null 时,所有发送方法会抛出 NEWSLETTER_NOT_CONFIGURED。
自定义新闻通讯提供商
实现 NewsletterProvider 接口并注册:
// packages/newsletter-custom/src/provider.ts
import type {
BroadcastOptions,
NewsletterProvider,
} from "@launchsaas/newsletter";
export class CustomNewsletterProvider implements NewsletterProvider {
readonly name = "custom";
async addContact(email: string, audienceId?: string): Promise<void> {
// 你的实现
}
async removeContact(email: string, audienceId?: string): Promise<void> {
// 你的实现
}
async broadcast(options: BroadcastOptions): Promise<void> {
// 你的实现
}
static create(): CustomNewsletterProvider {
return new CustomNewsletterProvider();
}
}在你的应用的 src/capabilities.ts 中注册:
// src/capabilities.ts (apps/launchsaas/src/capabilities.ts)
import { CustomNewsletterProvider } from "@launchsaas/newsletter-custom";
export const capabilities = {
newsletter: CustomNewsletterProvider.create(),
// ...其他 capabilities
};