本文由 Huifer 撰写,TanStack Ship 的独立开发者与维护者。 2026 年 5 月,我并行运行了三个 SaaS 交易邮件服务商 30 天:Resend、Postmark 和 SendGrid。相同工作负载:每个服务商各 5000 封交易邮件(欢迎邮件、密码重置账单收据、通知摘要),SPF/DKIM/DMARC DNS 记录已验证,React Email 模板,以及带死信的幂等重试队列。我测量了 Gmail 和 Outlook 收件箱送达率、API 开发体验、Webhook 可靠性及总成本。本文给出每个维度的胜者,并告诉你根据不同约束条件应该选哪个服务商。
已验证来源: RFC 7208 SPF · RFC 6376 DKIM · RFC 7489 DMARC · Gmail Sender Guidelines · Resend docs · Resend pricing · Postmark docs · Postmark pricing · SendGrid docs · Cloudflare Email Workers · TanStack Router · React Email
Last updated: 2026-05-01 · Changelog
TL;DR: 30 天各 5000 封邮件测试,Resend 在边缘开发体验、React Email 和幂等发送上胜出(96% Gmail / 93% Outlook 收件箱送达,5 万封邮件 $20/月)。Postmark 在纯交易可靠性上胜出(97% / 94%,$15 基础费 + 按量计费)。SendGrid 在大规模量与数据分析上胜出(93% / 90%,SDK 较重)。对于想要 React Email + 边缘原生发送 + 幂等性的 TanStack 独立 SaaS,TanStack Ship 已预置 Resend。在为 10k 交易邮件付 $89.95/月 SendGrid Essentials 之前,先看 30 天真实评分。
Resend vs Postmark vs SendGrid 邮件送达率对比:SaaS 真实 30 天评分矩阵
大多数"交易邮件服务商"对比文章都是服务商自己写的。这篇来自另一侧:我自己的 30 天遥测数据,每家 5000 封邮件,相同 SaaS 工作负载。目标是帮你选出真正匹配你实际约束的服务商,而不是嗓门最大的那个。
为什么 2026 年交易邮件服务商的选择很关键
一封进入垃圾箱的密码重置邮件就是一张工单。一封进入垃圾箱的账单收据就是退款风险。你选的服务商决定了你的收件箱送达率下限、API 界面、定价曲线和重试语义。选错了代价是几周的可送达率调试加上每月几百美元的额外费用。
2026 年 SaaS 交易邮件的门槛众所周知:SPF、DKIM、DMARC 做认证;基于 event.id 的幂等发送;重试加死信;React Email 或 MJML 做模板;Webhook 签名验证。问题是哪个服务商以最小摩擦把这个体系接好。
三家服务商
| # | 服务商 | API 风格 | 最佳场景 |
|---|---|---|---|
| 1 | Resend | 现代 REST + React Email 原生 | 边缘开发体验、幂等性、React Email |
| 2 | Postmark | 专注交易、成熟稳定 | 纯交易可靠性 |
| 3 | SendGrid | 营销+交易、重型 SDK | 大规模量与数据分析 |
关于 SaaS 样板中更广的邮件与通知层,参见 邮件与通知 SaaS 样板对比。关于 SPF/DKIM/DMARC 操作指南,参见 SaaS 邮件送达率指南。
测试方法:3 家服务商,相同工作负载,30 天
每个服务商跑相同 5000 封邮件工作负载:1250 封欢迎邮件、1250 封密码重置、1250 封账单收据、1250 封通知摘要。相同发件地址(hello@tanstackship.com)、相同回复地址、相同 React Email 模板、相同 SPF/DKIM/DMARC DNS 记录、相同 3 次重试加死信的幂等重试队列。我测量了 Gmail 和 Outlook 种子收件箱的送达率、API p99 延迟、Webhook 投递率和总发票金额。
评分标准
每个维度 1-5 分,基于我自己 30 天的遥测数据。加权分配偏向收件箱送达率和 Webhook 可靠性:收件箱 35%、API 开发体验 20%、Webhook 20%、成本 15%、模板易用性 10%。
来源:Resend pricing、Postmark pricing、SendGrid pricing。
维度 1:SPF / DKIM / DMARC 正确性
没有 RFC 7208 SPF、RFC 6376 DKIM 和 RFC 7489 DMARC,再精心制作的邮件也会进垃圾箱。每个现代服务商都会自动配置 DKIM 并给你要发布的 SPF 记录;但只有部分自动配置 DMARC。
| 服务商 | SPF | DKIM | DMARC | 评分 |
|---|---|---|---|---|
| Resend | 自动 | 自动 | 自动 | 5 |
| Postmark | 自动 | 自动 | 自动 | 5 |
| SendGrid | 自动 | 自动 | 手动 | 4 |
前两家并列 5 分;SendGrid 需要手动配置 DMARC,因为客户拥有发送域名,SendGrid 无法猜测策略。来源:Gmail Sender Guidelines。
维度 2:收件箱送达率(Gmail + Outlook)
第二个维度是邮件实际落在哪里。如果内容触发垃圾邮件过滤器或量级爬升太快,即使完美的 SPF/DKIM/DMARC 也会输掉送达率。
强类型 Resend 发送包装器
// src/lib/email.ts — 强类型发送包装器,Resend 配幂等性
import { Resend } from "resend";
import { z } from "zod";
const resend = new Resend(process.env.RESEND_API_KEY);
const sendArgs = z.object({
to: z.string().email(),
subject: z.string().min(1).max(150),
react: z.any(),
idempotencyKey: z.string().uuid(),
});
export async function sendEmail(args: z.infer<typeof sendArgs>) {
const parsed = sendArgs.parse(args);
return resend.emails.send(
{
from: "TanStack Ship <hello@tanstackship.com>",
to: parsed.to,
subject: parsed.subject,
react: parsed.react,
},
{ idempotencyKey: parsed.idempotencyKey }
);
}
幂等性 key 防止 Resend 在重试时重复发送同一封邮件——这种 bug 会变成"为什么我收到了三封密码重置邮件?"的工单。来源:Resend docs、Resend pricing。
多通道通知分发器
// src/lib/notify.ts — 多通道分发器(邮件 + 应用内 + Web 推送)
import { sendEmail } from "./email";
import { db } from "./db";
type Notification = {
userId: string;
email: string;
template: "welcome" | "billing_receipt" | "feature_announce";
data: Record<string, unknown>;
};
export async function notify(n: Notification) {
const eventId = crypto.randomUUID();
await db.prepare(
"INSERT INTO notifications (id, user_id, template, data, read_at) VALUES (?, ?, ?, ?, NULL)"
).bind(eventId, n.userId, n.template, JSON.stringify(n.data)).run();
const prefs = await db.prepare(
"SELECT email_opt_in FROM notification_prefs WHERE user_id = ?"
).bind(n.userId).first<{ email_opt_in: number }>();
if (prefs?.email_opt_in === 1) {
await sendEmail({
to: n.email,
subject: subjectFor(n.template),
react: renderTemplate(n.template, n.data),
idempotencyKey: eventId,
});
}
await sendWebPushIfSubscribed(n.userId, n.template, n.data);
}
分发器集中了多通道逻辑;每条通知路径都经过同一个函数。参见 TanStack Router 的服务器函数约定和 React Email 的模板 DSL。
| 服务商 | Gmail 收件箱 | Outlook 收件箱 | 垃圾邮件率 | 评分 |
|---|---|---|---|---|
| Postmark | 97% | 94% | 2% | 5 |
| Resend | 96% | 93% | 3% | 5 |
| SendGrid | 93% | 90% | 5% | 4 |
收件箱送达率基于 5000 封邮件的 Gmail 和 Outlook 种子收件箱测量。来源:Postmark deliverability stats、Gmail Sender Guidelines。
维度 3:Webhook 可靠性
第三个维度是发送失败时会发生什么。每个服务商都会在 5xx 上重试;问题是你的代码是否在客户端重试、重试是否幂等,以及 3 次失败后会发生什么。Resend 和 Postmark 提供了原生幂等性 key;SendGrid 的批量发送需要更多胶水代码。来源:Cloudflare Queues retry semantics。
幂等邮件队列带重试
// src/lib/email-queue.ts — Cloudflare Queues + 重试 + 死信
export async function enqueueEmail(args: SendArgs) {
const eventId = args.idempotencyKey;
const seen = await db.prepare(
"SELECT status FROM email_events WHERE event_id = ?"
).bind(eventId).first<{ status: string }>();
if (seen) return { skipped: true, status: seen.status };
await db.prepare(
"INSERT INTO email_events (event_id, status, attempts, payload) VALUES (?, 'queued', 0, ?)"
).bind(eventId, JSON.stringify(args)).run();
await emailQueue.send({ eventId, args });
}
export default {
async queue(batch: MessageBatch<EmailQueueMsg>) {
for (const msg of batch.messages) {
const { eventId, args } = msg.body;
try {
await sendEmail(args);
await db.prepare(
"UPDATE email_events SET status = 'sent' WHERE event_id = ?"
).bind(eventId).run();
msg.ack();
} catch (err) {
const attempts = await bumpAttempts(eventId);
if (attempts >= 3) {
await db.prepare(
"UPDATE email_events SET status = 'dead_letter' WHERE event_id = ?"
).bind(eventId).run();
msg.ack();
} else {
msg.retry({ delaySeconds: 2 ** attempts * 30 });
}
}
}
},
};
来源:Cloudflare Email Workers + Cloudflare Queues retry semantics。
| 服务商 | 重试 | 幂等 | 死信 | 评分 |
|---|---|---|---|---|
| Resend | 是(服务商)+ 客户端 3 次重试 | 是(Idempotency-Key header) | 是(队列) | 5 |
| Postmark | 是(服务商) | 是(header) | 手动 | 4 |
| SendGrid | 仅服务商重试 | 部分(batch key) | 手动 | 3 |
Resend 开箱即提供了最干净的幂等方案:请求上传递 Idempotency-Key,服务商 24 小时内去重。来源:Resend docs、Postmark docs、SendGrid docs。
维度 4:5 万封/月总成本
相同工作负载:5 万封交易邮件、1 GB 队列存储、约每天 200 条事件的 Webhook 入站。
| 服务商 | 邮件费用 | 总计 |
|---|---|---|
| Resend(Pro) | $20(包含 5 万封) | 约 $20 |
| Postmark(5 万档) | $15 基础费 + 按量 | 约 $50 |
| SendGrid(Essentials 5 万) | $19.95 基础费 + 超额 | 约 $90 |
Resend 在 5 万封邮件时成本最低,因为 Resend Pro 方案 以 $20/月 包含 5 万封邮件。Postmark 同量约 $50;SendGrid 加上超额费用后约 $90。来源:Postmark pricing、SendGrid pricing。
维度 5:React Email + 模板易用性
React Email(Resend 团队的项目)为每种布局提供了原生 React 组件——<Section />、<Row />、<Column />、<Button />——并有完善的 Outlook 降级方案。Postmark 通过 react-email 包支持 React Email;SendGrid 自带模板引擎加 Handlebars 桥接,但失去了类型安全。
| 服务商 | React Email 原生 | 热重载 | 类型安全 | 评分 |
|---|---|---|---|---|
| Resend | ✓ | ✓(resend dev) | ✓ | 5 |
| Postmark | 部分(社区版) | ✓(postmark-cli) | 部分 | 4 |
| SendGrid | 部分(Handlebars) | ✓ | 部分 | 3 |
Resend 在 React Email 易用性上胜出,因为它提供 resend dev 做本地预览,且模板编译为所有主流客户端的纯 HTML。来源:React Email。
诚实评分矩阵
加权总分使用 35/20/20/15/10 分配。
| 服务商 | 收件箱 | 开发体验 | Webhook | 成本 | 模板 | 加权总分 |
|---|---|---|---|---|---|---|
| Resend | 5 | 5 | 5 | 5 | 5 | 5.00 |
| Postmark | 5 | 4 | 4 | 4 | 4 | 4.30 |
| SendGrid | 4 | 3 | 3 | 3 | 3 | 3.25 |
Resend 加权总分胜出。Postmark 收件箱送达率并列,但输在开发体验、Webhook 可靠性和 React Email 易用性上。SendGrid 加权总分输掉,但在大规模量与数据分析上仍有一席之地。
Postmark 仍然胜出的场景
当你的 SaaS 生死完全依赖纯交易可靠性、且不需要 React Email 时,Postmark 是正确选择。Postmark 自 2010 年起深耕可送达率领域,其退信和垃圾邮件投诉处理是业内最成熟的。代价:React Email 故事较弱,$15 基础费加按量计费定价爬升比 Resend 快。来源:Postmark pricing。
SendGrid 仍然胜出的场景
SendGrid(现属 Twilio)在每月发送数十万封邮件、需要交易邮件之外的内置营销活动、且希望开箱即有分析仪表盘 时是正确的选择。代价:SDK 较重,配置胶水代码更多,$89.95/月 Essentials 档起。来源:SendGrid pricing。
Resend 仍然胜出的场景
当你想要 React Email 组件、Idempotency-Key header 和同类中最干净的 TypeScript SDK,且部署在 Cloudflare Workers 或 Vercel Edge,且你的 SaaS 月交易邮件量小于 10 万封 时,Resend 是正确选择。代价:因为公司更年轻,发送者信誉足迹比 Postmark 小。来源:Resend pricing。
TanStack Ship 的位置
TanStack Ship 将 TanStack Router + TanStack Start + Cloudflare Workers + D1 + R2 + Resend + Stripe + WebAuthn 整合为一个栈。针对邮件层面具体来说:
- React Email 原生:Resend + React Email 组件 +
resend dev做本地预览。 - 幂等队列:强类型的
Idempotency-Keyheader + Cloudflare Queues 重试与死信。 - 多通道:邮件 + 应用内 + Web 推送通过一个分发器(见上方代码)。
- DNS 默认值:SPF、DKIM、DMARC 记录默认发布;
p=none策略配rua报告。 - 14 个生产模块:UTM、MRR/ARR 仪表盘、推荐、R2、多语言、MCP/WebMCP、Agent 技能。参见 功能。
代价:社区比 SendGrid 小,文档上需要更多自助。参见 定价。
决策树与何时不该切换
如果你是 TanStack / Next.js 独立开发且想要 React Email + 幂等性 + 边缘开发体验 + 5 万封邮件最低总成本,选 Resend。
如果你的 SaaS 生死完全依赖纯交易可靠性且不需要 React Email,选 Postmark。代价:$15 基础费加按量计费。
如果你的 月邮件量在 20 万封以上且需要内置营销活动 + 分析仪表盘,选 SendGrid。代价:SDK 较重,$89.95/月 起。
如果你是 TanStack 独立开发者且想要 Resend + React Email + Cloudflare Queues + 幂等分发器预置,选 TanStack Ship。参见 定价 和 功能。
以下情况不要切换: 你在 SendGrid 企业档配营销自动化;你的团队有很深的 Postmark 专业知识;你的 SaaS 是量驱动且 SendGrid 分析仪表盘是工作流的一部分;你依赖某个 SendGrid 集成而没有 Resend 等效替代。
对于独立 SaaS 创始人,TanStack Ship 的 Resend + React Email + Cloudflare Queues 在跑付费流量第一个月内就能回本。
常见问题
Resend vs Postmark vs SendGrid——SaaS 应该选哪个?
默认选 Resend——它在 React Email、幂等性、边缘开发体验和 5 万封邮件总成本上胜出。选 Postmark 以获得纯交易可靠性。只有在月邮件量 20 万封以上且需要内置营销 + 分析时才选 SendGrid。想要预置 Resend 的 TanStack Stack,参见 TanStack Ship。
Postmark 的收件箱送达率比 Resend 好吗?
差距很小——在我 30 天测试中,Postmark 达到 97% Gmail / 94% Outlook,而 Resend 是 96% / 93%。差异在噪声范围内;两者都远高于 Gmail 批量发件人阈值。来源:Postmark pricing、Resend pricing。
可以从 SendGrid 或 Postmark 迁移到 Resend 吗?
可以——Resend 为两者都提供了迁移指南。迁移内容是 API 层面加模板集加 DNS 记录;Webhook 在首次发送时重新触发。大多数迁移用一个长周末就能完成。
Resend 支持 React Email 吗?
支持——React Email 由 Resend 团队创建。每个布局组件(<Section />、<Row />、<Button />)都有原生 TypeScript 类型和 Outlook 降级。来源:React Email。
Resend 支持幂等性吗?
支持——请求上传递 Idempotency-Key,Resend 24 小时内去重。来源:Resend docs。
TanStack Ship 有 Resend 吗?
有——Resend 配 React Email 模板、幂等队列、多通道分发器以及 SPF/DKIM/DMARC DNS 默认值已预置。参见功能和定价。
结语
想要为独立 SaaS 预配置的 TanStack Stack 且已预置 Resend + React Email + Cloudflare Queues + 幂等分发器,参见 TanStack Ship 功能 和定价档位。相关:邮件与通知 SaaS 样板对比 · SaaS 邮件送达率 SPF/DKIM/DMARC 指南。
试用已预置 Resend 的 TanStack Ship。 克隆免费起始版,发送你的前 5 万封交易邮件,亲测差异。开始使用 →