当前位置:首页 > 技术 > 正文内容

使用React和MJML构建邮件模板的指南

访客 技术 2026年7月21日 1
Mailing 是一个强大的工具,允许开发者使用 React 和 MJML 构建专业的 HTML 邮件模板。本文将介绍如何从零开始使用 Mailing 来创建、测试和发送邮件。

环境准备与安装

首先确保你的开发环境满足以下要求:

  • Node.js 16+
  • macOS 或 Linux 系统(暂不支持 Windows)
  • npm 或 yarn 包管理器
# 使用 npm 安装
npm install --save mailing-core next react react-dom
npm install --save-dev mailing

# 或使用 yarn 安装
yarn add mailing-core next react react-dom
yarn add --dev mailing

初始化项目:

# 初始化项目并启动预览服务器
npx mailing

# 强制使用 TypeScript 模式
npx mailing --typescript

MJML 基础

MJML 是一种专门用于邮件设计的标记语言,解决了传统 HTML 邮件在不同客户端中的兼容性问题。

import React from 'react';
import { Mjml, MjmlBody, MjmlSection, MjmlColumn, MjmlText } from '@faire/mjml-react';

const GreetingEmail = ({ user }) => (
  <Mjml>
    <MjmlBody>
      <MjmlSection>
        <MjmlColumn>
          <MjmlText>Hello {user.name}!</MjmlText>
          <MjmlText>Welcome to our platform.</MjmlText>
        </MjmlColumn>
      </MjmlSection>
    </MjmlBody>
  </Mjml>
);

GreetingEmail.subject = ({ user }) => `Greetings ${user.name}!`;
export default GreetingEmail;

构建第一个邮件模板

接下来,我们创建一个简单的欢迎邮件模板。

// emails/WelcomeTemplate.tsx
import React from 'react';
import { Mjml, MjmlBody, MjmlSection, MjmlColumn, MjmlText } from '@faire/mjml-react';
import BaseLayout from './components/BaseLayout';
import Button from './components/Button';

interface WelcomeProps {
  username: string;
  activationUrl: string;
}

const WelcomeTemplate: React.FC<WelcomeProps> = ({ username, activationUrl }) => (
  <BaseLayout>
    <Mjml>
      <MjmlBody>
        <MjmlSection>
          <MjmlColumn>
            <MjmlText fontSize="20px" color="#333333">
              Hello, {username}!
            </MjmlText>
            <MjmlText fontSize="16px" color="#666666">
              Click the button below to activate your account.
            </MjmlText>
            <Button href={activationUrl}>
              Activate Account
            </Button>
          </MjmlColumn>
        </MjmlSection>
      </MjmlBody>
    </Mjml>
  </BaseLayout>
);

WelcomeTemplate.subject = ({ username }) => `Welcome ${username}!`;
export default WelcomeTemplate;

配置邮件传输服务

你可以选择 SendGrid、Postmark 或 SES 作为邮件传输服务。

import nodemailer from 'nodemailer';
import { buildSendMail } from 'mailing-core';

// SendGrid 配置
const transporter = nodemailer.createTransport({
  host: "smtp.sendgrid.net",
  port: 587,
  auth: {
    user: "apikey",
    pass: process.env.SENDGRID_API_KEY,
  },
});

export const sendMail = buildSendMail({
  transport: transporter,
  defaultFrom: "NoReply ",
});

实时预览与开发模式

启动预览服务器后,访问 http://localhost:3883 可以查看所有邮件模板的实时预览。

# 启动预览服务器
npx mailing preview

发送邮件示例

import sendMail from './emails';
import WelcomeTemplate from './emails/WelcomeTemplate';

async function sendWelcome(userEmail, userName) {
  try {
    await sendMail({
      to: userEmail,
      subject: `Welcome ${userName}!`,
      component: <WelcomeTemplate username={userName} activationUrl={generateActivationLink()} />,
    });
    console.log('Email sent successfully');
  } catch (error) {
    console.error('Failed to send email:', error);
  }
}

单元测试

为确保邮件内容正确,编写单元测试是非常重要的。

import { render } from '@testing-library/react';
import WelcomeTemplate from '../emails/WelcomeTemplate';

describe('Welcome Email', () => {
  it('renders correctly with user name', () => {
    const { getByText } = render(
      <WelcomeTemplate username="Test User" activationUrl="https://test.com" />
    );
    expect(getByText('Hello, Test User!')).toBeInTheDocument();
  });
});

生产环境部署

在生产环境中,请确保禁用预览功能,并设置正确的 API 密钥。

# .env.production
SENDGRID_API_KEY=production_key
DISABLE_PREVIEWS=1
NODE_ENV=production

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。