Migrate from Amazon SES
Most SES senders already relay over SMTP, which makes the SES-to-CamelMailer switch the easiest of the three: change the host, port, and credential, and you are done. If you call the SES API directly, CamelMailer offers an HTTP send API too. Verified identities become sending domains, the SES suppression list becomes CamelMailer suppressions, and SNS notifications become signed webhooks.
What maps to what
SES splits sending, identity, and events across several AWS services. CamelMailer folds them into one server with its own domains, suppressions, streams, and webhooks.
| Amazon SES | CamelMailer |
|---|---|
| SES SMTP interface + SMTP credentials (IAM-derived) | SMTP submission with an SMTP-type credential. The fastest drop-in. |
SES v2 SendEmail API (IAM / SigV4) | POST /api/v2/server/messages with the X-Server-API-Key header. See Credentials. |
| Verified identities (domain and email), Easy DKIM | Sending domains with a per-domain DKIM key and SPF, or a confirmed single sender address. |
| Account-level suppression list | Suppressions per server, honored before every send. |
| SNS notifications (bounce, complaint, delivery) | RSA-signed webhooks: MessageSent, MessageDelayed, MessageDeliveryFailed, MessageHeld. |
| Configuration sets | Message streams, one per traffic class, each with its own tracking and stats. |
| Dedicated IP pools | IP pools assigned per stream. |
Set up your domain and DNS
Where SES verifies an identity and publishes Easy DKIM CNAMEs, CamelMailer verifies a sending domain and publishes DKIM as a TXT record. Add each domain to the CamelMailer server and publish the three records it generates: a verification TXT record, an SPF include, and the per-domain DKIM record. Keep the SES DKIM records in place until the cutover is done, so mail stays authenticated on either path. Details are in Sending domains.
SMTP drop-in (the fastest switch)
If your application posts to the SES SMTP endpoint, moving to CamelMailer is a settings change. Swap the SES host and IAM-derived credential for the CamelMailer SMTP host and an SMTP-type credential key, and leave the rest of your mail code alone.
Host: email-smtp.eu-central-1.amazonaws.com Port: 587 (STARTTLS) User: <SES SMTP username, derived from IAM> Pass: <SES SMTP password>
Host: the SMTP hostname of your CamelMailer installation Port: 587 (STARTTLS) or 25 (plain with STARTTLS); 465 for implicit TLS Auth: AUTH PLAIN or AUTH LOGIN User: any value (accepted but unused for these mechanisms) Pass: an SMTP-type credential key from the server
SMTP submission reaches the same pipeline as the HTTP API and applies the same From-address authorization. See SMTP for the session details.
The HTTP send call
If you call the SES v2 API directly, the CamelMailer equivalent is a flat JSON POST rather than the nested Content.Simple shape, authenticated with a server API key instead of SigV4.
import { SESv2Client, SendEmailCommand } from '@aws-sdk/client-sesv2';
const ses = new SESv2Client({ region: 'eu-central-1' });
await ses.send(new SendEmailCommand({
FromEmailAddress: 'billing@acme.com',
Destination: { ToAddresses: ['ada@example.com'] },
Content: {
Simple: {
Subject: { Data: 'Your receipt' },
Body: { Html: { Data: '<p>Thanks for your purchase.</p>' } },
},
},
}));POST https://app.camelmailer.com/api/v2/server/messages
X-Server-API-Key: <your CamelMailer server key>
Content-Type: application/json
{
"from": "billing@acme.com",
"to": ["ada@example.com"],
"subject": "Your receipt",
"html_body": "<p>Thanks for your purchase.</p>",
"text_body": "Thanks for your purchase."
}A successful send returns 201 Created with one entry per recipient. CamelMailer also ships official SDKs if you would rather not build the request by hand. See Sending email for batch sends, attachments, and custom headers.
Suppressions, streams, and events
Three SES surfaces have direct homes in CamelMailer:
- Suppression list. Import your SES suppressions into CamelMailer suppressions, which are checked before every send.
- Configuration sets. Recreate each as a message stream so a traffic class keeps its own tracking, stats, and IP pool.
- SNS notifications. Replace the SNS topic subscriptions with a CamelMailer webhook that posts the signed delivery lifecycle to your endpoint.
Cutover checklist
- Create a CamelMailer server and an SMTP or API credential.
- Add each sending domain and publish its verification, SPF, and DKIM records; keep the SES DKIM records live too.
- Verify each domain and confirm the health check is green.
- Point your mailer at the CamelMailer SMTP host (or swap the SES SDK call for a
POST /api/v2/server/messages). - Import the SES suppression list and recreate configuration sets as streams.
- Replace SNS subscriptions with a signed webhook.
- Send a test message and confirm it is accepted and delivered.
- Flip traffic, then keep SES warm briefly before you disable the IAM keys.
