# emails.sh blog

Transactional email for developers: framework guides, deliverability, and the failures that only show up in production.

## Transactional and marketing email in one API

30 July 2026 · 4 min read

Running both kinds of mail through one vendor is fine. Running them through one sending reputation is not. Here is what has to be shared and what has to be kept apart.

Read: https://emails.sh/blog/transactional-and-marketing-email-one-api.md

## Send a newsletter from your own app

30 July 2026 · 4 min read

Storing your own list and sending a broadcast from your own code, with the consent, unsubscribe and reputation parts that a loop over your users table gets wrong.

Read: https://emails.sh/blog/send-a-newsletter-from-your-app.md

## A Resend alternative that also runs your lifecycle email

30 July 2026 · 4 min read

Resend has audiences, broadcasts and automations now. Here is what emails.sh does differently, where Resend is still ahead, and what a migration actually costs.

Read: https://emails.sh/blog/resend-alternative-with-automations.md

## How to migrate from SendGrid without changing your code

30 July 2026 · 4 min read

emails.sh serves SendGrid's v3 mail/send wire format, personalizations and all. Two lines of configuration in Node, one in every other language, and the order matters.

Read: https://emails.sh/blog/migrate-sendgrid-without-changing-code.md

## Email automation as code

30 July 2026 · 4 min read

A lifecycle sequence is a program that decides who gets mailed. Here is what it looks like as a YAML file in your repository, reviewed in a pull request and pushed from CI.

Read: https://emails.sh/blog/email-automation-as-code.md

## How to send email in Next.js with the App Router

28 July 2026 · 4 min read

A complete Next.js App Router email setup: a Server Action, a route handler, where the API key lives, and the runtime mistakes that break it in production.

Read: https://emails.sh/blog/send-email-nextjs-app-router.md

## How to send email from Claude Code

21 July 2026 · 3 min read

Give Claude Code everything it needs to add transactional email to your app in one pass: the key, the endpoint, the prompt, and the checks that catch a wrong integration.

Read: https://emails.sh/blog/send-email-from-claude-code.md

## How to send email from Cursor

17 July 2026 · 3 min read

Add transactional email to a Cursor project without the SMTP detour: a rules file, the prompt to use, and how to review what the agent wrote before you ship it.

Read: https://emails.sh/blog/send-email-from-cursor.md

## Resend alternatives, compared honestly

10 July 2026 · 5 min read

What Resend is genuinely good at, when it stops fitting, and how Postmark, SendGrid, Mailgun, SES, Brevo and emails.sh actually differ once you migrate.

Read: https://emails.sh/blog/resend-alternatives.md

## Why nodemailer does not work on Vercel

3 July 2026 · 4 min read

SMTP from a serverless function fails for reasons that have nothing to do with your code. Here is what actually happens, and the HTTPS fix that ends it.

Read: https://emails.sh/blog/nodemailer-vercel.md

## The SendGrid free tier changed: what to do now

26 June 2026 · 5 min read

SendGrid's free sending is no longer the default answer for small projects. What changed in practice, how to decide, and how to migrate without losing deliverability.

Read: https://emails.sh/blog/sendgrid-free-tier-changed.md

## SPF, DKIM, and DMARC explained for developers

19 June 2026 · 5 min read

What each record does, how alignment actually works, the exact DNS entries to publish, and how to move to enforcement without blocking your own mail.

Read: https://emails.sh/blog/spf-dkim-dmarc-explained.md

## Custom email for Supabase Auth

12 June 2026 · 4 min read

Replace Supabase's built-in auth mail with your own sender, either through custom SMTP or a Send Email Auth Hook, and keep the token generation Supabase does for you.

Read: https://emails.sh/blog/supabase-auth-custom-email.md

## Custom SMTP and custom email delivery in Clerk

5 June 2026 · 4 min read

Send Clerk's auth email from your own domain: what custom SMTP covers, when to take delivery over with a webhook, and the code for both paths.

Read: https://emails.sh/blog/clerk-custom-smtp.md

## Why Gmail SMTP fails in production

29 May 2026 · 4 min read

Gmail SMTP works on your laptop and breaks under real load. App passwords, daily limits, spoofed From addresses, and DMARC alignment, explained with the fix.

Read: https://emails.sh/blog/gmail-smtp-production.md

## Transactional email versus marketing email, and why the split matters

22 May 2026 · 4 min read

The difference is not tone, it is consent, reputation, and legal obligation. How to classify a message correctly and how to separate the two streams in DNS.

Read: https://emails.sh/blog/transactional-vs-marketing-email.md

## Building an email verification flow that actually works

15 May 2026 · 5 min read

Token design, expiry, resend limits, the race conditions nobody tests, and the copy that keeps people from giving up. A complete verification flow, end to end.

Read: https://emails.sh/blog/email-verification-flow.md

## Why your password reset email goes to spam

8 May 2026 · 5 min read

Reset mail looks like phishing to a filter: urgent language, a link, a low-engagement sender. The authentication, content, and infrastructure fixes that work.

Read: https://emails.sh/blog/password-reset-email-spam.md

## Sending email from Cloudflare Workers, with no SMTP and no sockets

1 May 2026 · 4 min read

Workers cannot open an SMTP connection, so every mail library fails there. What actually works: an HTTPS API, secrets via wrangler, queues, and cron triggers.

Read: https://emails.sh/blog/send-email-cloudflare-workers.md

## Idempotency keys and retries for transactional email

24 April 2026 · 5 min read

Why retrying a send is dangerous, how to choose a key that is stable across retries, and how to build a retry policy that never mails anyone the same thing twice.

Read: https://emails.sh/blog/idempotency-keys-transactional-email.md

## Bounces, complaints, and suppression lists: what to do with them

17 April 2026 · 5 min read

Hard bounces, soft bounces, and spam complaints need three different responses. How to wire the webhook, what to suppress, and what never to suppress.

Read: https://emails.sh/blog/bounces-complaints-suppression.md

Docs: https://emails.sh/docs.md