惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
P
Proofpoint News Feed
宝玉的分享
宝玉的分享
人人都是产品经理
人人都是产品经理
博客园_首页
爱范儿
爱范儿
博客园 - 叶小钗
aimingoo的专栏
aimingoo的专栏
S
SegmentFault 最新的问题
MyScale Blog
MyScale Blog
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
Microsoft Security Blog
Microsoft Security Blog
Blog — PlanetScale
Blog — PlanetScale
博客园 - 【当耐特】
Y
Y Combinator Blog
量子位
博客园 - 三生石上(FineUI控件)
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
The Blog of Author Tim Ferriss
月光博客
月光博客
有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
A
About on SuperTechFans

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Resend + React Email: The Transactional Email Stack That ...
Atlas Whoff · 2026-04-20 · via DEV Community

Atlas Whoff

SendGrid's free tier is 100 emails/day and the dashboard is from 2013. Mailgun's API is fine but the React SDK is an afterthought. Resend was built by developers who wanted something that worked like a modern API — here's the setup that's been running in production for 8 months.

Why Resend

Three reasons: the React SDK is first-party, the API is clean, and the free tier is 3,000 emails/month.

npm install resend @react-email/components

Enter fullscreen mode Exit fullscreen mode

React Email: Write Emails Like Components

// emails/WelcomeEmail.tsx
import {
  Body, Button, Container, Head, Heading,
  Html, Preview, Section, Text
} from "@react-email/components"

interface WelcomeEmailProps {
  userName: string
  dashboardUrl: string
}

export function WelcomeEmail({ userName, dashboardUrl }: WelcomeEmailProps) {
  return (
    <Html>
      <Head />
      <Preview>Welcome to whoffagents — your AI toolkit is ready</Preview>
      <Body style={{ backgroundColor: "#f6f9fc", fontFamily: "sans-serif" }}>
        <Container style={{ maxWidth: "600px", margin: "0 auto", padding: "20px" }}>
          <Heading>Welcome, {userName}</Heading>
          <Text>Your AI SaaS Starter Kit is ready. Here's what to do first:</Text>
          <Section>
            <Text>• Connect your Stripe account</Text>
            <Text>• Configure your Claude API key</Text>
            <Text>• Deploy to Vercel with one click</Text>
          </Section>
          <Button
            href={dashboardUrl}
            style={{
              backgroundColor: "#5850ec",
              color: "#fff",
              padding: "12px 24px",
              borderRadius: "6px",
              textDecoration: "none"
            }}
          >
            Open Dashboard
          </Button>
        </Container>
      </Body>
    </Html>
  )
}

Enter fullscreen mode Exit fullscreen mode

JSX emails mean TypeScript types, prop validation, component reuse, and hot-reload previews. No more Handlebars templates or HTML string concatenation.

Sending From a Next.js API Route

// app/api/send-welcome/route.ts
import { Resend } from "resend"
import { WelcomeEmail } from "@/emails/WelcomeEmail"

const resend = new Resend(process.env.RESEND_API_KEY)

export async function POST(req: Request) {
  const { email, name } = await req.json()

  const { data, error } = await resend.emails.send({
    from: "Atlas <hello@whoffagents.com>",
    to: email,
    subject: "Welcome to whoffagents",
    react: WelcomeEmail({
      userName: name,
      dashboardUrl: `https://whoffagents.com/dashboard`
    })
  })

  if (error) {
    return Response.json({ error }, { status: 400 })
  }

  return Response.json({ id: data?.id })
}

Enter fullscreen mode Exit fullscreen mode

The react prop accepts a JSX element directly. Resend renders it to HTML + plain text automatically.

Local Preview Without Sending

npx email dev

Enter fullscreen mode Exit fullscreen mode

Opens a local server at localhost:3000 with a live preview of all emails in your emails/ directory. Hot-reloads on save. Shows both HTML and plain text views.

Webhook Integration for Delivery Events

// app/api/resend-webhook/route.ts
import { Resend } from "resend"

export async function POST(req: Request) {
  const payload = await req.json()

  switch (payload.type) {
    case "email.delivered":
      await db.emailEvents.insert({
        emailId: payload.data.email_id,
        event: "delivered",
        timestamp: new Date(payload.data.created_at)
      })
      break
    case "email.bounced":
      await db.users.update({
        where: { email: payload.data.to[0] },
        data: { emailBounced: true }
      })
      break
    case "email.complained":
      await db.users.update({
        where: { email: payload.data.to[0] },
        data: { unsubscribed: true }
      })
      break
  }

  return Response.json({ received: true })
}

Enter fullscreen mode Exit fullscreen mode

Batch Sending for Transactional Blasts

// Send to multiple recipients without a loop
const { data, error } = await resend.batch.send([
  {
    from: "Atlas <hello@whoffagents.com>",
    to: "user1@example.com",
    subject: "Your weekly report",
    react: WeeklyReport({ userId: "u1", stats: stats1 })
  },
  {
    from: "Atlas <hello@whoffagents.com>",
    to: "user2@example.com",
    subject: "Your weekly report",
    react: WeeklyReport({ userId: "u2", stats: stats2 })
  }
])

Enter fullscreen mode Exit fullscreen mode

Batch API handles up to 100 emails per call with a single HTTP request.

Domain Verification (5 Minutes)

# Add these DNS records to your domain
TXT  resend._domainkey  v=DKIM1; k=rsa; p=<key>
TXT  @                  v=spf1 include:resend.com ~all
CNAME mail              mail.resend.dev

Enter fullscreen mode Exit fullscreen mode

Resend's dashboard walks you through verification. After DNS propagates, emails land in inbox consistently — no more Gmail promotions tab.

vs. The Alternatives

Resend SendGrid Postmark
React SDK ✅ first-party
Free tier 3K/month 100/day 100/month
API quality Modern Legacy Good
Local preview
Price (50K/mo) $20 $15 $57

For Next.js projects, Resend's React-native approach eliminates an entire category of template management problems.


Building a Next.js SaaS? The AI SaaS Starter Kit ships with Resend pre-wired — welcome emails, password resets, and Stripe receipt notifications all working on day one.