MailKite
Get your API key
All guides Sending email

Send email with SendGrid

Transactional email is the mail your app sends one recipient at a time — receipts, password resets, magic links, notifications. This guide sends one through SendGrid, 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 SendGrid account, with Mail Send permission.

Part 1 — Send with SendGrid

1. Authenticate your domain

So your mail passes authentication and lands in the inbox, set up Domain Authentication under Settings → Sender Authentication. With Automated Security on, SendGrid gives you three CNAME records to publish — one em#### subdomain for SPF, plus two DKIM keys at s1._domainkey and s2._domainkey:

DNS — yourdomain.com
Type    Name                     Value
CNAME em1234.yourdomain.com u1234567.wl123.sendgrid.net
CNAME s1._domainkey.yourdomain.com s1.domainkey.u1234567.wl123.sendgrid.net
CNAME s2._domainkey.yourdomain.com s2.domainkey.u1234567.wl123.sendgrid.net

SendGrid shows the exact per-domain hostnames and targets in the dashboard — copy them from there.

2. Send over the API

POST to SendGrid's Mail Send endpoint with your API key as a bearer token. The body is nested — recipients go under personalizations, and the from address must be on the domain you just authenticated:

send
curl -X POST https://api.sendgrid.com/v3/mail/send \
-H "Authorization: Bearer $SENDGRID_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"personalizations": [{ "to": [{ "email": "ada@example.com" }] }],
"from": { "email": "hello@yourdomain.com" },
"subject": "Your invoice #1042",
"content": [{ "type": "text/html", "value": "<p>Thanks! Your receipt is attached.</p>" }]
}'
response
← 202 Accepted
X-Message-Id: abcd1234-5678-...
(empty body)

A successful send returns 202 Accepted with an empty body; the message id comes back in the X-Message-Id response header.

3. Or send over SMTP

Prefer SMTP? Point your app at SendGrid's relay. The username is the literal string apikey, and the password is your API key:

smtp
Host:      smtp.sendgrid.net
Port: 587 # TLS
Username: apikey # the literal string "apikey"
Password: SG.xxxxx… # your API key
From: hello@yourdomain.com

That's a transactional send on SendGrid: 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.