MailerSend is a developer-friendly transactional service, and its Inbound Routing genuinely parses incoming mail to JSON. The friction for an agent is narrower: you compose the trust decision yourself from spf_check and dkim_check (no DMARC, no spam verdict), and you host the model loop. MailKite hands you one resolved auth block and will run the receive→reply loop for you.
MailerSend's inbound is not a bolt-on: it parses to JSON with decoded text/html/attachments, signs each webhook with HMAC-SHA256, and the sending half (REST, SMTP, templates, a real Node SDK) makes replying a few setters. As a send-and-receive pair for an agent, it genuinely works.
MailerSend gives you spf_check ({code, value}) and dkim_check (a boolean), with no DMARC alignment and no spam classification in the payload. MailKite resolves SPF, DKIM, DMARC, and spam into one auth block, so the agent reads a single field before it acts instead of composing a partial decision.
MailerSend delivers the message and stops — the model call, retries, and run bookkeeping are yours to build. A MailKite route with action:'agent' runs the receive→reply loop on a Cloudflare Queue, capped and reaped at five minutes, recorded as a drill-in transcript.
MailerSend's free plan is one verified domain. MailKite adds every domain and scoped agent address at no per-domain cost, on every plan including Free — an agent can own as many addresses as it needs.
MailerSend gates new accounts behind a trial-approval step that can take up to a day. MailKite is DNS-verify only: MX to receive, SPF + DKIM to send, no sandbox and no approval queue.
| MailKite | MailerSend | |
|---|---|---|
| Inbound → JSON webhook | Yes — email.received | Yes — Inbound Routing (data.*) |
| Auth signals in payload | auth: {spf, dkim, dmarc, spam} | spf_check + dkim_check only |
| DMARC / spam verdict | Included, normalized | Not in the payload |
| HMAC-signed webhooks | HMAC + replay window, one-call verify | HMAC-SHA256 Signature header |
| Built-in agent loop | Optional route action:'agent' | None — webhook only |
| Failed-delivery replay | Retries + one-click replay | Retries |
| MCP server | Hosted MCP — send + inbox | Official MCP — sending only, no inbox read |
| Per-domain fees | None — unlimited domains | Free plan is 1 verified domain |
Competitor capabilities change — we re-audit these tables regularly. Spot something out of date? Tell us and we'll fix it.
MailerSend parses cleanly and signs, but hands you two raw signals to combine; MailKite delivers one resolved auth verdict the agent reads directly.
POST /your-webhook
Content-Type: application/json
Signature: <HMAC-SHA256 of the raw body>
{
"data": {
"from": { "email": "ada@example.com" },
"recipients": { "rcptTo": "agent@myapp.ai" },
"subject": "Re: invoice #1042",
"text": "Looks good — approved!",
"html": "<p>Looks good — approved!</p>",
"headers": { "message-id": "<a1b2c3@mail.example.com>" },
"spf_check": { "code": "...", "value": "pass" },
"dkim_check": true,
"attachments": [ /* decoded parts */ ]
}
}
// no DMARC alignment, no spam verdict — you compose trust yourself POST /your-webhook Content-Type: application/json
x-mailkite-signature: t=…,v1=… (HMAC-SHA256 — verify locally)
{
"id": "msg_2Hk9…",
"type": "email.received",
"from": { "address": "ada@example.com" },
"to": [{ "address": "support@myapp.ai" }],
"subject": "Re: invoice #1042",
"text": "Looks good — approved!",
"html": "<p>Looks good — approved!</p>",
"threadId": "<a1b2c3@mail.example.com>",
"auth": { "spf": "pass", "dkim": "pass", "dmarc": "pass", "spam": "ham" },
"attachments": [
{ "filename": "po.pdf", "contentType": "application/pdf",
"size": 18213, "url": "https://api.mailkite.dev/att/2Hk9…/0?sig=…" }
]
} MailerSend counts forwarded/posted inbound messages against the same monthly quota. MailKite counts inbound and outbound against one quota and never bills per domain.
Add the MailKite MX records (or start on a managed subdomain while DNS propagates). No trial-approval wait — DNS verification is the only gate to receive.
Read event.auth.dmarc and event.auth.spam directly instead of composing a verdict from spf_check.value and dkim_check. Verify x-mailkite-signature with the SDK's verifyWebhook helper.
Reply with mk.send({ inReplyTo: event.id }) through the same API, or set a route to action:'agent' and MailKite runs the receive→reply loop for you. Keep sending on MailerSend if you like; you're only replacing the inbound trust-and-loop layer.
Yes. MailerSend's Inbound Routing points your MX at MailerSend, matches messages with catch-all or per-recipient filters, and POSTs the parsed email as JSON under a data object, HMAC-SHA256 signed. It's a real inbound feed — the agent-specific gaps are the trust verdict and the loop, not parsing.
No. It includes spf_check (a {code, value} object) and dkim_check (a boolean). There's no DMARC alignment result and no spam classification, so an agent composes its trust decision from the two signals it does get. MailKite delivers a single normalized auth: {spf, dkim, dmarc, spam} block.
MailerSend's official MCP server exposes sending, domain management, and analytics as tools — not inbox reading. An agent can send through it, but the inbound half is still a webhook you wire up. MailKite's hosted MCP covers both send and inbox, alongside a Claude Code plugin.
The MailerSend alternative for AI agents →
The long-form take on our blog — receipts, runnable code, and where we won't overclaim.
Point a domain, drop in a webhook URL, receive your first email. Unlimited domains, no credit card.