MailKite
Get your API key
All guides Sending email

Send email with Mandrill

Transactional email is the mail your app sends one recipient at a time — receipts, password resets, magic links, notifications. This guide sends one through Mandrill (Mailchimp Transactional), 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.
  • A Mandrill API key from your Mailchimp Transactional account.

Part 1 — Send with Mandrill

1. Authenticate your domain

So your mail passes authentication and lands in the inbox, add a sending domain under Settings → Domains, then publish the records it lists — two DKIM CNAMEs and a DMARC policy — and click verify:

DNS — yourdomain.com
Type    Name                            Value
CNAME mte1._domainkey.yourdomain.com dkim1.mandrillapp.com
CNAME mte2._domainkey.yourdomain.com dkim2.mandrillapp.com
TXT _dmarc.yourdomain.com v=DMARC1; p=none;

Mandrill shows the exact records for your domain in the dashboard — copy them from there, since the DKIM host and value are account-specific. Mandrill rechecks DNS and marks the domain verified once the records resolve.

2. Send over the API

POST to Mandrill's messages/send endpoint. Your key goes in the JSON body, and the from_email must be on the domain you just authenticated:

send
curl -X POST https://mandrillapp.com/api/1.0/messages/send.json \
-H "Content-Type: application/json" \
-d '{
"key": "YOUR_API_KEY",
"message": {
"from_email": "hello@yourdomain.com",
"to": [{ "email": "ada@example.com", "type": "to" }],
"subject": "Your invoice #1042",
"html": "<p>Thanks! Your receipt is attached.</p>"
}
}'

A 200 returns an array — one object per recipient, with its delivery status and message _id:

response
200 OK
[
{ "email": "ada@example.com", "status": "queued", "_id": "abc123…" }
]

3. Or send over SMTP

Prefer SMTP? Point your app at Mandrill's relay. The username is your account username, and the password is any valid Mandrill API key:

smtp
Host:      smtp.mandrillapp.com
Port: 587 # TLS (or 465 for SSL)
Username: you@youraccount.com # your Mailchimp/Mandrill account username
Password: md-… # any valid Mandrill API key
From: hello@yourdomain.com

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