Amazon SES alternative · receiving email
Amazon SES hands you raw MIME files in an S3 bucket and leaves the rest to you. CloudMailin delivers each message to your application as parsed JSON over HTTP, with attachments handled and every delivery recorded in a history you can search.
Receiving with SES
Receiving with CloudMailin
The difference that matters
SES keeps no message history of its own and has no console for browsing individual messages. Receiving offers aggregate CloudWatch metrics, so when a message goes missing you are searching S3 keys and Lambda logs to work out what happened.
CloudMailin keeps every message and its delivery status in a searchable dashboard. Each HTTP POST to your application is recorded with the status your server returned, so a failing endpoint is visible immediately rather than surfacing later as missing data.
The pipeline you build
SES email receiving is capable infrastructure, and at very large volumes it is hard to argue with. It is also a toolkit rather than a finished pipeline. The AWS documentation says it plainly: SES "delivers you the raw, unmodified email in MIME format". To get from there to a parsed message in your application, you typically build and operate:
A receipt rule set delivering messages to an S3 bucket. The SNS path is capped at 150KB per message, so real-world email needs the bucket.
A Lambda function triggered for each new message.
MIME parsing inside that function: multipart trees, base64 and quoted-printable decoding, character sets and attachment extraction.
Handling for the spam and virus verdict headers, because SES records verdicts but takes no action on them.
Retry and failure handling for the POST to your application.
Lifecycle rules for the bucket, since SES keeps no message history of its own and has no console for browsing individual messages.
Each piece is reasonable on its own. Together they are a small internal product that someone on your team owns forever.
The same job
Create an address. It can receive immediately, before any DNS changes.
Add a webhook handler. Each message arrives as an HTTP POST, already parsed.
Point MX records at CloudMailin only when you want mail on your own domain.
app.post('/incoming_mails', (req, res) => {
const { envelope, headers, plain, html, attachments } = req.body;
res.sendStatus(200);
});
Plus you get all of this
Instant Setup
Receiving in minutes
Choose Your Format
JSON, multipart or raw
Searchable History
Per-message delivery status
S3 / Azure / GCS
Messages + attachments in your bucket
Custom Domains
Catch-all on your own domain
Spam Scoring
Optional, per address
Side by side
| Amazon SES receiving | CloudMailin | |
|---|---|---|
| What your app receives | Raw MIME file in S3 | ✓ Parsed JSON or multipart over HTTP |
| Parsing | ✕ Build your own with Lambda and a MIME library | ✓ Included |
| Delivery to your app | ✕ Build your own | ✓ HTTP POST with retries and recorded status |
| Spam handling | ✕ Verdict headers only, no action taken | ✓ Optional scoring per address |
| Message history and search | ✕ None, aggregate CloudWatch metrics only | ✓ Included |
| Attachments | Inside the raw MIME | ✓ Parsed, or written to your own bucket |
| Setup | Rule sets, IAM, S3, SNS or Lambda, plus code | An address and a webhook. MX records optional |
SES details from the AWS documentation: email receiving concepts, receipt rule actions. Checked July 2026. Tell us if anything is out of date.
If you send tens of millions of messages a month, run everything on AWS and have the engineering time to own a receiving pipeline, SES can make sense. Its per-message cost is genuinely low until you factor in the hours spent building that pipeline and debugging it when a message goes missing. AWS also moved SES to a new pricing model in July 2026, so if you are evaluating it, check the current plans rather than an older comparison.
Create an address and receive your first message before you touch DNS.
Migration
Create a CloudMailin address and pick a format. It can receive immediately, before any DNS changes.
Add your webhook handler. The parsing, decoding and retry logic from your Lambda pipeline is no longer needed.
If you archive raw messages in S3 today, keep doing so. CloudMailin can deliver messages and attachments to your own bucket.
Point MX records at CloudMailin. Both setups can run side by side on different subdomains while you test.
Support
With CloudMailin our engineers also run support. They have in-depth knowledge of the whole platform, so when something looks wrong you talk to someone who can see both ends of the problem. There is a phone number you can actually call, and support is part of the service rather than a paid add-on.
Questions
Create an address and receive your first message as JSON in minutes, no DNS changes needed.