AWS SES — Setup & publish
EmailSpace guides you through SES setup (domain, DNS, verification) or connects to an account where SES is already configured in AWS. After publish, send from your application with the Node.js SDK (@emailspace/sdk).
Setup paths
| Path | When to use |
|---|---|
| Guided setup | New to SES — EmailSpace creates the domain identity, shows DNS records, tracks verification, and can request production access |
| Already configured | Domain, DKIM, and production access are done in AWS — connect IAM credentials only (manage-only policy) |
On project creation, EmailSpace guides you through SES setup — or connects to an account where SES is already configured in AWS.
SES setup wizard
The wizard walks through connect → domain → DNS → from email → production access. Open it from Project → Email provider when setup is pending, or immediately after creating an AWS SES project.
Step 1 — Connect AWS
- Open Configure AWS or the setup wizard.
- Enter your AWS access key, secret, and region.
- Choose guided setup (full IAM policy) or already configured (manage-only policy).
- Copy the scoped IAM policy from the dialog if you need to create a new IAM user.
- Click Connect AWS. EmailSpace verifies the credentials against your AWS account.
Credentials are encrypted at rest. EmailSpace never returns the secret to the browser after save.
Step 2 — Register domain
- Enter your sending domain (e.g.
mail.yourdomain.comoryourdomain.com). - EmailSpace creates the domain identity in SES and fetches verification and DKIM records.
Step 3 — DNS records
- Copy the TXT, CNAME, and DKIM records shown in the wizard.
- Add them at your DNS provider.
- Click Check DNS to probe propagation, or Confirm DNS when records are saved.
- Click Refresh to pull the latest status from AWS.
Route53 auto-configure: If your domain is in Route53 in the same AWS account, click Auto-configure Route53 to apply records automatically.
DNS propagation can take a few minutes. AWS domain verification may lag behind DNS detection — you can continue setup, but sending stays disabled until AWS confirms.
Step 4 — From email
Set the default From address for sends from this project (e.g. hello@yourdomain.com). The address must match a verified identity.
Step 5 — Production access
In SES sandbox, you can only send to verified recipients and From addresses. Request production access from the wizard to send to any recipient.
You can Skip for now and complete this later from the email provider bar.
Setup later
Click Set up later to defer the wizard. Resume from Project → Email provider at any time.
Email identities
Manage sender addresses from Project → Email identities (also accessible from the provider bar in sandbox mode).
| Action | Description |
|---|---|
| Add | Register a new email address for verification |
| Refresh | Pull latest verification status from SES |
| Remove | Delete an identity from your SES account |
In sandbox mode, both the From address and each recipient must be verified. After production access, only the From address must be verified (domain verification covers addresses on that domain).
What EmailSpace provides on publish
On publish, EmailSpace creates or updates an SES template with:
- Template name — stored on the template record (
sesTemplateName) - Subject and HTML with runtime placeholders like
{{userName}} - Variable list — runtime keys to pass in
TemplateData
Project globals ({{&key}}) and components ({{&@slug}}) are resolved and inlined at publish time. Only runtime variables remain for TemplateData.
Find the template name in the dashboard after publish, or in the publish response.
Send from your app
Use the Node.js SDK — no AWS credentials in your app, and sends appear in Analytics → Messages automatically.
import { EmailSpace } from '@emailspace/sdk';
const emailSpace = new EmailSpace({
apiKey: process.env.EMAILSPACE_API_KEY!,
projectId: process.env.EMAILSPACE_PROJECT_ID!,
});
await emailSpace.send({
template: '550e8400-e29b-41d4-a716-446655440000', // template UUID from dashboard
to: 'customer@example.com',
data: { userName: 'Alex', companyName: 'Acme' },
});
Create an API key under Project → API credentials. The template must be published to SES before send.
Advanced — direct AWS SDK
If you call SES directly from your app (instead of the EmailSpace SDK), you must include EmailSpace's configuration set and correlation tags on every send for Messages tracking to work. See Analytics → setup in the dashboard for the configuration set name and required tags.
SendTemplatedEmail (AWS SDK v3, Node.js)
import { SESClient, SendTemplatedEmailCommand } from '@aws-sdk/client-ses';
const ses = new SESClient({ region: 'us-east-1' });
await ses.send(
new SendTemplatedEmailCommand({
Source: 'hello@yourdomain.com',
Destination: {
ToAddresses: ['customer@example.com'],
},
Template: 'emailspace_welcome_550e8400e29b41d4', // sesTemplateName from EmailSpace publish
TemplateData: JSON.stringify({
userName: 'Alex',
companyName: 'Acme',
}),
ConfigurationSetName: 'emailspace-cb4307d2e9e4', // from project webhook status
Tags: [
{ Name: 'emailspaceProjectId', Value: 'your-project-uuid' },
{ Name: 'emailspaceTemplateId', Value: 'your-template-uuid' },
{ Name: 'templateName', Value: 'emailspace_welcome_550e8400e29b41d4' },
],
}),
);
Multiple recipients and reply-to
await ses.send(
new SendTemplatedEmailCommand({
Source: 'hello@yourdomain.com',
Destination: {
ToAddresses: ['a@example.com', 'b@example.com'],
CcAddresses: ['manager@example.com'],
},
ReplyToAddresses: ['support@yourdomain.com'],
Template: 'emailspace_welcome_550e8400e29b41d4',
TemplateData: JSON.stringify({ userName: 'Alex' }),
ConfigurationSetName: 'emailspace-cb4307d2e9e4',
Tags: [
{ Name: 'emailspaceProjectId', Value: 'your-project-uuid' },
{ Name: 'emailspaceTemplateId', Value: 'your-template-uuid' },
],
}),
);
EmailSpace provisions the configuration set and SNS delivery webhooks when you connect AWS SES.
TemplateData rules
- Keys must match runtime variables declared in the EmailSpace template
- Values are strings in the JSON object
- Project globals and components are already resolved at publish time — do not pass them in
TemplateData
Attachments
SendTemplatedEmail does not support attachments directly. Use SendRawEmail with MIME parts you build in your application.
Related
- Node.js SDK — recommended send path from your app
- Provider SDK overview
- Getting started — dashboard overview and variable layers
- Automations — scheduled sends from MongoDB or Excel