LogoLaunchSaaS

新闻通讯

配置新闻通讯提供商来管理订阅

LaunchSaaS 通过拆分包设计提供新闻通讯支持。核心包 @launchsaas/newsletter 定义接口;每个提供商是独立的包,按需安装。如果未配置提供商,新闻通讯功能则直接禁用。

更新时间:2026-03-22 - 说明广播邮件是通用能力,可由任意服务端工作流触发。

架构

@launchsaas/newsletter              ← 接口 + Newsletter 类(始终需要)
@launchsaas/newsletter-resend       ← Resend Audiences

你只需安装实际使用的提供商包。

新闻通讯功能默认禁用capabilities.tsnewsletter: null)。 安装 @launchsaas/newsletter-resend 并配置提供商即可启用。

设置新闻通讯功能

1. 安装提供商包

在你的应用目录中安装提供商包:

pnpm add @launchsaas/newsletter @launchsaas/newsletter-resend

2. 配置环境变量

.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

  1. 在 Resend Dashboard 中前往 Audiences
  2. 为新闻通讯订阅创建受众
  3. 将受众 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.newsletternull 时,所有发送方法会抛出 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
};

参考资料

下一步