MailKite
Get your API key
All guides Sending email

Send email with Resend

Transactional email is the mail your app sends one recipient at a time — receipts, password resets, magic links, notifications. This guide sends one through Resend, over both the API and SMTP, then shows the same send on MailKite.

What you'll need

  • A domain you control, with access to its DNS records.
  • An API key from your Resend account — the same key works for the API and SMTP.

Part 1 — Send with Resend

1. Authenticate your domain

So your mail passes authentication and lands in the inbox, add your domain under Domains in Resend and publish the records it shows you. Resend puts sending records on a send subdomain — an MX for bounce and complaint feedback, an SPF TXT, and a DKIM TXT:

DNS — yourdomain.com
Type   Name                          Value                                  Priority
MX send.yourdomain.com feedback-smtp.us-east-1.amazonses.com 10
TXT send.yourdomain.com v=spf1 include:amazonses.com ~all
TXT resend._domainkey.yourdomain.com p=… (DKIM public key from your dashboard)

Resend shows the exact per-domain DKIM value in the dashboard — copy it from there.

2. Send over the API

POST to Resend's /emails endpoint with your API key. The from address must be on the domain you just authenticated:

send
curl -X POST https://api.resend.com/emails \
-H "Authorization: Bearer $RESEND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "MyApp <hello@yourdomain.com>",
"to": ["ada@example.com"],
"subject": "Your invoice #1042",
"html": "<p>Thanks! Your receipt is attached.</p>"
}'
response
200 OK
{ "id": "49a3999c-0ce1-4ea6-ab68-afcd6dc2e794" }

Or with the SDK — same fields, in your language:

send.js
import { Resend } from "resend";

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

const { data, error } = await resend.emails.send({
from: "MyApp <hello@yourdomain.com>",
to: ["ada@example.com"],
subject: "Your invoice #1042",
html: "<p>Thanks! Your receipt is attached.</p>",
});

3. Or send over SMTP

Prefer SMTP? Point your app at Resend's relay. The username is resend and the password is your API key:

smtp
Host:      smtp.resend.com
Port: 587 # STARTTLS (also 465/2465 SMTPS, 25/2587)
Username: resend
Password: re_... # your API key
From: hello@yourdomain.com

That's a transactional send on Resend: authenticate the domain, then call the API or the SMTP relay.

Part 2 — The same, on MailKite

When we built sending into MailKite, we wanted three things to be true: one set of DNS records, one API key that works for both HTTP and SMTP, and a body you don't have to nest. Here's the same message.

1. Authenticate your domain

Publish three TXT records — SPF, a MailKite DKIM key, and DMARC. The same domain also receives mail once its MX points at MailKite:

DNS — yourdomain.com
Type   Name                              Value
TXT yourdomain.com v=spf1 include:mailkite.dev ~all
TXT mailkite._domainkey.yourdomain.com v=DKIM1; k=rsa; p=…
TXT _dmarc.yourdomain.com v=DMARC1; p=none;

The exact DKIM value is shown in the dashboard; MailKite verifies the records for you over DNS.

2. Send over the API

One POST /v1/send with a flat from/to/ subject/html body. A 202 means it's queued:

Pick your language in the card — the dashboard and the AI assistant do the same send, and every SDK takes the same fields:

send
import { MailKite } from "mailkite";

const mk = new MailKite(process.env.MAILKITE_API_KEY);

const { id, status } = await mk.send({
from: "hello@myapp.ai",
to: "ada@example.com",
subject: "Your invoice #1042",
html: "<p>Thanks! Receipt attached.</p>",
});
Install Docs →
response
202 Accepted
{ "id": "msg_2Hk9…", "status": "queued" }

3. Or send over SMTP

The same key is your SMTP password — no separate credential to generate:

smtp
import nodemailer from "nodemailer";

const tx = nodemailer.createTransport({
host: "smtp.mailkite.dev",
port: 587, // STARTTLS · use 465 for implicit TLS
auth: {
user: "mailkite", // any username works
pass: process.env.MAILKITE_API_KEY, // your mk_live_… key
},
});

await tx.sendMail({
from: "hello@myapp.ai", // an address on a verified domain
to: "ada@example.com",
subject: "Your invoice #1042",
html: "<p>Thanks! Receipt attached.</p>",
});

See Send API and SMTP relay for the full reference — attachments, headers, and delivery events.

A little about MailKite

MailKite is programmable email for developers and AI agents. One API key and one set of DNS records cover both directions: send with a single POST (or the SMTP relay), and the same verified domain receives replies as a signed webhook of clean JSON. Behind the send, MailKite routes across multiple providers to keep you in the inbox — and any address can be handed to an agent that reads and replies on its own. Sending and receiving are on the free tier.

Next: the Send API for attachments and delivery tracking, or the Quickstart to get a verified domain and API key.