Resend 是面向开发者的电子邮件 API——SDK 轻巧、免费额度慷慨、支持真正的 HTML 模板。只要你接受"最慢的步骤是配置域名 DNS,而不是写代码"这个现实,整个配置过程十分钟就能搞定。
从 Web 应用发送邮件,看起来简单,真正做起来才知道坑在哪里。你写一个小函数,向邮件服务商的 API 发起 POST 请求,测试邮件顺利发出,还落进了 Gmail 收件箱——大功告成。然后流量进入生产环境,邮件开始落进垃圾箱,甚至直接被收件服务器拒绝。代码没有任何改动,问题根本不在代码。
邮件送达率主要取决于三条 DNS 记录——SPF、DKIM 和 DMARC——它们告诉收件服务器:"是的,这个服务商有权代表这个域名发送邮件,以下是验证方式。"没有这些记录,现代收件方(Gmail、Apple Mail、Outlook)轻则把你的邮件扔进垃圾箱,重则直接拒收。配置这些记录之所以麻烦,是因为它们必须挂在你实际用于发件的域名上,也就是说要去域名注册商那里改 DNS,然后等待生效。
Resend 的价值主张是"让这整套流程变得最简单"。仪表板会明确告诉你要添加哪些 DNS 记录,并自动验证。SDK 轻量好用。免费套餐(每月 3,000 封、每日 100 封)足以应对几乎所有独立项目。它的 HTML 邮件模板基于 React 组件,这在邮件服务领域颇为少见,比拖拽 WYSIWYG 编辑器舒服得多。本教程涵盖完整的配置流程;核心原则同样适用于其他现代邮件服务商(Postmark、SendGrid、Loops 等),只是具体操作以 Resend 为准。
邮件应该从你拥有的域名发出——[email protected],而不是 [email protected]。原因有两个:
还没有域名的话,请参阅域名注册教程。你也可以使用专门用于事务邮件的子域名——比如 mail.yourapp.com 或 notifications.yourapp.com——这是个好习惯,因为它能将发件信誉与根域名上的其他业务隔离开来。
注册账号。免费套餐提供每月 3,000 封、每日 100 封的发送量,发件地址是共享的 [email protected]。这足够用来测试 SDK,但不适合对外发给真实用户——因为 resend.dev 发出的邮件看起来不像是来自你的品牌,收件人可能会产生疑虑。
要用自己的域名发件,就需要先添加并验证域名,这就是下一步的内容。
点击 Add Domain,输入你要用于发件的域名(或子域名),点击 Add。Resend 会列出需要添加的 DNS 记录,通常有 3 到 5 条:一条 SPF、两到三条 DKIM(取决于配置)、可选的 DMARC,以及一条 MX 记录(如果你希望退信通知也通过 Resend 接收的话)。
这些记录看起来有些复杂,但你不需要理解背后的密码学原理——只需逐条原样复制到你的 DNS 服务商即可。
对于 Resend 列出的每条记录,前往你的 DNS 服务商(如需了解 DNS 操作,请参阅 DNS 教程),依次添加:
resend,有的需要填 resend.yourdomain.com,保持一致即可。全部添加完成后,在 Resend 中点击 Verify DNS Records。DNS 生效可能需要几分钟到几小时不等。Resend 会自动定期重新检查,所有记录解析正常后会显示"已验证"状态。
_dmarc 处的 TXT)告诉收件方,当 SPF 或 DKIM 验证失败时该怎么办——隔离、拒绝,还是仅上报。三者合力,构成现代邮件"这封邮件是合法的"的完整握手机制。
点击 Create API Key,为密钥命名(例如"production"),选择权限(通常选 Sending access——限制权限比完全访问更安全)。复制密钥(re_…),它只显示这一次。
将其写入后端的环境文件:RESEND_API_KEY=re_…。和往常一样,不要提交到 git。
在项目中安装 SDK:
npm install resend
# or: pip install resend, or: gem install resend
发送一封测试邮件:
import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY);
await resend.emails.send({
from: 'You <[email protected]>',
to: ['[email protected]'],
subject: 'Hello from Resend',
html: '<p>This is the body of the email.</p>',
});
查看收件箱。如果邮件到达,说明配置成功。如果没有收到,打开 Resend 仪表板的 Emails 日志——它记录了每次发送尝试及其状态(已送达、退信、进入垃圾箱等)以及接收方的响应信息。
对于一次性邮件,直接写 HTML 字符串完全够用。但对于需要反复发送的内容(欢迎邮件、收据、密码重置),使用模板会更省心。Resend 官方推荐的方案是 React Email——把邮件写成 React 组件,发送时渲染为 HTML。
import { Resend } from 'resend';
import { ReceiptEmail } from './emails/Receipt';
await resend.emails.send({
from: 'Receipts <[email protected]>',
to: customer.email,
subject: `Receipt for $${amount}`,
react: ReceiptEmail({ customerName: customer.name, amount, items }),
});
React Email 组件提供了邮件安全的原生元素(<Container>、<Text>、<Button>),最终渲染为邮件客户端所要求的基于表格的 HTML。你写现代 JSX,库来处理那些复古的底层标记。
邮件进垃圾箱,通常是以下原因之一:
mail.yourdomain.com 配置了 DKIM,却从 [email protected] 发件,DKIM 签名无法授权这个 From 地址。要么改为从 [email protected] 发件,要么为根域名单独配置 DKIM。mail-tester.com 测试——它会给出评分并解释扣分原因。