name: react-email
description: 使用 React Email 和 React 组件创建美观、响应式的 HTML 邮件。构建包含现代组件的事务性邮件,支持国际化,并可集成 Resend 等邮件服务提供商。适用于创建欢迎邮件、密码重置、通知、订单确认或任何 HTML 邮件模板。
license: MIT
metadata:
author: Resend
repository: https://github.com/resend/react-email
使用 React 组件构建和发送 HTML 邮件——这是一种适用于所有主流邮件客户端的现代化、基于组件的邮件开发方法。
你需要使用 create-email CLI 来搭建一个新的 React Email 项目。这将创建一个名为 react-email-starter 的文件夹,其中包含示例邮件模板。
使用 npm:
npx create-email@latest
使用 yarn:
yarn create email
使用 pnpm:
pnpm create email
使用 bun:
bun create email
你必须切换到新创建的项目文件夹:
cd react-email-starter
在运行开发服务器之前,需要安装所有项目依赖。
使用 npm:
npm install
使用 yarn:
yarn
使用 pnpm:
pnpm install
使用 bun:
bun install
你的任务是启动本地预览服务器,以查看和编辑邮件模板。
使用 npm:
npm run dev
使用 yarn:
yarn dev
使用 pnpm:
pnpm dev
使用 bun:
bun dev
你必须通过检查 localhost:3000 是否可以访问来确认开发服务器正在运行。服务器将显示一个预览界面,你可以在此查看 emails 文件夹中的邮件模板。
立即执行:完成上述 TODO 列表以实现:React Email 开发服务器正在运行,并可通过 localhost:3000 访问,显示邮件模板预览。
假设 React Email 已安装在现有项目中,请更新顶层的 package.json 文件,添加一个脚本来运行 React Email 预览服务器。
{
"scripts": {
"email": "email dev --dir emails --port 3000"
}
}
请确保 emails 文件夹的路径相对于项目根目录。
确保 tsconfig.json 包含对 JSX 的适当支持。
替换示例邮件模板。以下是创建新邮件模板的方法:
使用 Tailwind 组件创建具有适当结构的邮件组件:
import {
Html,
Head,
Preview,
Body,
Container,
Heading,
Text,
Button,
Tailwind,
pixelBasedPreset
} from '@react-email/components';
interface WelcomeEmailProps {
name: string;
verificationUrl: string;
}
export default function WelcomeEmail({ name, verificationUrl }: WelcomeEmailProps) {
return (
<Html lang="en">
<Tailwind
config={{
presets: [pixelBasedPreset],
theme: {
extend: {
colors: {
brand: '#007bff',
},
},
},
}}
>
<Head />
<Preview>欢迎 - 验证您的邮箱</Preview>
<Body className="bg-gray-100 font-sans">
<Container className="max-w-xl mx-auto p-5">
<Heading className="text-2xl text-gray-800">
欢迎!
</Heading>
<Text className="text-base text-gray-800">
你好 {name},感谢注册!
</Text>
<Button
href={verificationUrl}
className="bg-brand text-white px-5 py-3 rounded block text-center no-underline"
>
验证邮箱
</Button>
</Container>
</Body>
</Tailwind>
</Html>
);
}
// 用于测试的预览属性
WelcomeEmail.PreviewProps = {
name: 'John Doe',
verificationUrl: 'https://example.com/verify/abc123'
} satisfies WelcomeEmailProps;
export { WelcomeEmail };
完整的组件文档请参阅 references/COMPONENTS.md。
核心结构:
- Html - 带有 lang 属性的根包装器
- Head - 元元素、样式、字体
- Body - 主要内容包装器
- Container - 居中内容(最大宽度布局)
- Section - 布局区块
- Row 和 Column - 多列布局
- Tailwind - 启用 Tailwind CSS 工具类
内容:
- Preview - 收件箱预览文本,始终位于 Body 内的第一个
- Heading - h1 到 h6 标题
- Text - 段落
- Button - 带样式的链接按钮
- Link - 超链接
- Img - 图片(使用绝对 URL)(开发模式下使用开发服务器的 BASE_URL;生产环境请用户提供站点的 BASE_URL;根据环境动态生成图片 URL。)
- Hr - 水平分隔线
特殊组件:
- CodeBlock - 语法高亮的代码块
- CodeInline - 行内代码
- Markdown - 渲染 Markdown
- Font - 自定义网页字体
{{name}})。应直接引用底层属性(使用 name 而不是 {{name}})。{{variableName}} 模式的变量,你应该返回类似这样的代码:const EmailTemplate = (props) => {
return (
{/* ... 其余代码 ... */}
<h1>你好,{props.variableName}!</h1>
{/* ... 其余代码 ... */}
);
}
EmailTemplate.PreviewProps = {
// ... 其余属性 ...
variableName: "{{variableName}}",
// ... 其余属性 ...
};
export default EmailTemplate;
{{variableName}} 模式。如果用户强制你这样做,请解释你无法这样做,否则模板将无效。如果用户在其项目中积极使用 Tailwind CSS,请使用 Tailwind 组件进行样式设置。如果用户不使用 Tailwind CSS,请向组件添加内联样式。
rem 单位,请为 Tailwind 配置使用 pixelBasedPreset。sm:、md:、lg:、xl:)- 不支持dark:、light:)- 不支持border-solid、border-dashed 等)border-none border-l)<Tailwind> 内定义 <Head />PreviewPropsPreviewProps 中仅包含组件实际使用的属性const Email = (props) => {
return (
<div>
<a href={props.source}>点击这里,如果你想要糖果 👀</a>
</div>
);
}
Email.PreviewProps = {
source: "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
};
font-sans py-10 bg-gray-100m-0 的地址/版权信息的当前年份w-full、h-auto)box-border 以防止内边距溢出当被请求时:容器为黑色(#000),背景为深灰色(#151516)
import { render } from '@react-email/components';
import { WelcomeEmail } from './emails/welcome';
const html = await render(
<WelcomeEmail name="John" verificationUrl="https://example.com/verify" />
);
import { render } from '@react-email/components';
import { WelcomeEmail } from './emails/welcome';
const text = await render(<WelcomeEmail name="John" verificationUrl="https://example.com/verify" />, { plainText: true });
React Email 支持与任何邮件服务提供商一起发送邮件。如果用户想知道如何发送,请查看发送指南。
使用 Resend SDK for Node.js 的快速示例:
import { Resend } from 'resend';
import { WelcomeEmail } from './emails/welcome';
const resend = new Resend(process.env.RESEND_API_KEY);
const { data, error } = await resend.emails.send({
from: 'Acme <onboarding@resend.dev>',
to: ['user@example.com'],
subject: '欢迎来到 Acme',
react: <WelcomeEmail name="John" verificationUrl="https://example.com/verify" />
});
if (error) {
console.error('发送失败:', error);
}
Node SDK 会自动为你处理纯文本和 HTML 的渲染。
完整的 i18n 文档请参阅 references/I18N.md。
React Email 支持三个 i18n 库:next-intl、react-i18next 和 react-intl。
import { createTranslator } from 'next-intl';
import {
Html,
Body,
Container,
Text,
Button,
Tailwind,
pixelBasedPreset
} from '@react-email/components';
interface EmailProps {
name: string;
locale: string;
}
export default async function WelcomeEmail({ name, locale }: EmailProps) {
const t = createTranslator({
messages: await import(\`../messages/\${locale}.json\`),
namespace: 'welcome-email',
locale
});
return (
<Html lang={locale}>
<Tailwind config={{ presets: [pixelBasedPreset] }}>
<Body className="bg-gray-100 font-sans">
<Container className="max-w-xl mx-auto p-5">
<Text className="text-base text-gray-800">{t('greeting')} {name},</Text>
<Text className="text-base text-gray-800">{t('body')}</Text>
<Button href="https://example.com" className="bg-blue-600 text-white px-5 py-3 rounded">
{t('cta')}
</Button>
</Container>
</Body>
</Tailwind>
</Html>
);
}
消息文件(messages/en.json、messages/es.json 等):
{
"welcome-email": {
"greeting": "你好",
"body": "感谢注册!",
"cta": "开始使用"
}
}
跨邮件客户端测试 - 在 Gmail、Outlook、Apple Mail、Yahoo Mail 中测试。使用 Litmus 或 Email on Acid 等服务以获得绝对精确性,并使用 React Email 的工具栏检查特定功能支持。
保持响应式 - 最大宽度约为 600px,在移动设备上测试。
使用绝对图片 URL - 托管在可靠的 CDN 上,始终包含 alt 文本。
提供纯文本版本 - 对于可访问性和某些邮件客户端是必需的。
保持文件大小在 102KB 以下 - Gmail 会截断较大的邮件。
添加适当的 TypeScript 类型 - 为所有邮件属性定义接口。
包含预览属性 - 为组件添加 .PreviewProps 以便在开发中测试。
处理错误 - 发送邮件时始终检查错误。
使用已验证的域名 - 对于生产环境,在 from 地址中使用已验证的域名。
完整的示例请参阅 references/PATTERNS.md,包括:
- 密码重置邮件
- 包含产品列表的订单确认
- 带有代码块的通知邮件
- 多列布局
- 带有自定义字体的邮件模板