Resend vs Postmark vs SendGrid 邮件送达率对比:SaaS 真实 30 天评分矩阵

Resend vs Postmark vs SendGrid 在各 5000 封邮件的 30 天并行测试中的真实评分。Resend 在边缘开发体验胜出——来看看为什么。

Huifer
Huifer
May 1, 202611 min read
其他语言:Deutsch · English

本文由 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 风格最佳场景
1Resend现代 REST + React Email 原生边缘开发体验、幂等性、React Email
2Postmark专注交易、成熟稳定纯交易可靠性
3SendGrid营销+交易、重型 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。

服务商SPFDKIMDMARC评分
Resend自动自动自动5
Postmark自动自动自动5
SendGrid自动自动手动4

前两家并列 5 分;SendGrid 需要手动配置 DMARC,因为客户拥有发送域名,SendGrid 无法猜测策略。来源:Gmail Sender Guidelines。

维度 2:收件箱送达率(Gmail + Outlook)

第二个维度是邮件实际落在哪里。如果内容触发垃圾邮件过滤器或量级爬升太快,即使完美的 SPF/DKIM/DMARC 也会输掉送达率。

强类型 Resend 发送包装器

typescript
// 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。

多通道通知分发器

typescript
// 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 收件箱垃圾邮件率评分
Postmark97%94%2%5
Resend96%93%3%5
SendGrid93%90%5%4

收件箱送达率基于 5000 封邮件的 Gmail 和 Outlook 种子收件箱测量。来源:Postmark deliverability stats、Gmail Sender Guidelines。

维度 3:Webhook 可靠性

第三个维度是发送失败时会发生什么。每个服务商都会在 5xx 上重试;问题是你的代码是否在客户端重试、重试是否幂等,以及 3 次失败后会发生什么。Resend 和 Postmark 提供了原生幂等性 key;SendGrid 的批量发送需要更多胶水代码。来源:Cloudflare Queues retry semantics。

幂等邮件队列带重试

typescript
// 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成本模板加权总分
Resend555555.00
Postmark544444.30
SendGrid433333.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-Key header + 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 万封交易邮件,亲测差异。开始使用 →