Short answer: To send email from your app without SMTP, call an HTTPS transactional email API from your server (or serverless function) with an API key. With Notify, that is one POST to https://notify.cx/api/email/send with header x-api-key and JSON to, from, subject, message. No mail ports, no EMAIL_HOST, no Nodemailer transport config.
That is the whole answer to How to send email from your app without SMTP for password resets, receipts, magic links, and product notifications.
Why people still reach for SMTP
SMTP is the internet’s mail language. Providers still accept it. Libraries like Nodemailer make it feel easy:
host + port + user + pass + secure flag → sendMail()
The pain shows up later:
- Serverless platforms time out on long SMTP handshakes
- Corporate networks and PaaS hosts block outbound 25/465/587
- You debug TLS and auth failures instead of product bugs
- Bounce/complaint handling is a second project (SNS, webhooks you never wired)
SMTP is not “wrong.” Putting SMTP inside your application servers as the default for new SaaS is usually wrong. Background: SMTP vs email APIs (2026) and why SMTP is no longer the default.
What replaces SMTP in the app
| Old (SMTP in-app) | New (HTTPS API) |
|---|---|
| Open socket to relay | fetch / requests / Http:: |
| AUTH LOGIN / PLAIN | x-api-key (or provider bearer token) |
| MIME assembly in your process | JSON body; provider handles MIME |
| Hope logs exist on the relay | Provider dashboard logs + webhooks |
Your app becomes a client of an email API — same mental model as payments or SMS.
Minimal Notify example (Node)
Works in Express, Next.js Route Handlers, Fastify, Nest, Cloudflare Workers, Supabase Edge Functions — anywhere with fetch and a secret store:
await fetch('https://notify.cx/api/email/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': process.env.NOTIFY_API_KEY!
},
body: JSON.stringify({
from: 'noreply@your-verified-domain.com',
to: 'user@example.com',
subject: 'Your receipt',
message: '<p>Thanks for your purchase.</p><p>Order #1042</p>'
})
});
Python:
import os, requests
requests.post(
"https://notify.cx/api/email/send",
headers={
"Content-Type": "application/json",
"x-api-key": os.environ["NOTIFY_API_KEY"],
},
json={
"from": "noreply@your-verified-domain.com",
"to": "user@example.com",
"subject": "Your receipt",
"message": "<p>Thanks for your purchase.</p>",
},
timeout=15,
)
No SMTP settings file. No package required for the Notify path.
If you were comparing providers without SMTP
Same job, different SDKs — all HTTPS:
Resend (Node SDK sketch)
import { Resend } from 'resend';
const resend = new Resend(process.env.RESEND_API_KEY);
await resend.emails.send({
from: 'noreply@your-verified-domain.com',
to: 'user@example.com',
subject: 'Your receipt',
html: '<p>Thanks for your purchase.</p>'
});
Amazon SES (AWS SDK v3 sketch)
import { SESClient, SendEmailCommand } from '@aws-sdk/client-ses';
const ses = new SESClient({ region: 'us-east-1' });
await ses.send(
new SendEmailCommand({
Source: 'noreply@your-verified-domain.com',
Destination: { ToAddresses: ['user@example.com'] },
Message: {
Subject: { Data: 'Your receipt' },
Body: { Html: { Data: '<p>Thanks for your purchase.</p>' } }
}
})
);
Notify stays a single fetch — no SDK required. Resend wins if you want their SDK/ecosystem. SES wins on raw unit cost at massive scale if you already operate AWS (new accounts often wait on production access). Postmark wins when deliverability reputation is the primary buy. Notify wins when you want a small surface: send, webhooks, logs — Free 1,000/mo, Pro $10 / 10,000, Scale $50 / 100,000.
Architecture that actually ships
- Server only — API key never in the browser or mobile binary
- One helper —
sendEmail({ to, subject, message })used by auth, billing, invites - Verified domain — SPF/DKIM before production custom
from(docs) - Queue when it matters — do not make signup wait on the provider if you have a job runner
- Webhooks later — bounces/complaints into Slack or your DB (webhooks)
You still write the HTML (or let an AI write it). The API delivers it. You do not need an MCP server to wrap one HTTP call.
Migrating off SMTP / Nodemailer
If production already uses Nodemailer → provider SMTP:
- Add the HTTPS send helper beside the old code
- Flip one flow (password reset is a good canary)
- Point bounce handling at provider webhooks
- Delete SMTP env vars when nothing remains
Notify’s migration notes: Migrate from SMTP. Node-focused write-up: without Nodemailer.
What you still need DNS for
Skipping SMTP in the app does not skip DNS. Recipients’ servers still check SPF/DKIM/DMARC on your domain. The provider helps you publish records; you still paste them at your DNS host. That is authentication of the domain, not an SMTP client in your code.
FAQ
How to send email from your app without SMTP?
Use a transactional email API over HTTPS. Authenticate with an API key, POST JSON (or use the provider’s SDK), and keep secrets on the server. Notify’s canonical call is POST https://notify.cx/api/email/send with x-api-key.
Is SMTP dead?
No. Relays and legacy software still use it. New application code should prefer HTTPS APIs unless you have a hard requirement for SMTP.
Can serverless functions send email this way?
Yes — that is one of the main reasons to drop in-app SMTP. Vercel, Cloudflare Workers, Supabase Edge Functions, and Lambda all speak HTTPS cleanly.
Best for / not for Notify?
Best for: transactional product email with a tiny API. Not for: newsletters, marketing automation, or visual template studios.
Next steps
- Quick start
- Pricing
- Stack guides: Next.js, Node, Python
Further Reading
Discover more articles on similar topics across our network
Comments
Loading comments…