Guía
Migrar desde Amazon SES
Pasa de Amazon SES a Emailit. Equivalencias de identidades, sandbox y cuotas, sustitución de las llamadas del SDK y de las credenciales SMTP, y conversión de los eventos de SNS en webhooks firmados.
Esta guía relaciona los conceptos, las llamadas a la API, las notificaciones de eventos, las direcciones bloqueadas y las plantillas de Amazon SES con sus equivalentes en Emailit. Lee primero Migrar a Emailit para conocer el orden general y cómo usar los dos proveedores en paralelo.
Conceptos
| Amazon SES | Emailit |
|---|---|
| Cuenta de AWS en una región | Espacio de trabajo |
| Identidades verificadas: dominios y direcciones de email | Dominios de envío. Las identidades de una sola dirección de email no están disponibles. |
| Registros CNAME de Easy DKIM | Un registro TXT de DKIM, emailit._domainkey |
| Dominio MAIL FROM personalizado | El return-path emailit.<your domain>, que tienen todos los dominios |
| Sandbox y solicitud de acceso de producción | Modo sandbox y acceso de producción. En modo sandbox puedes enviar a las direcciones de email de las cuentas de los miembros del espacio de trabajo. |
| Cuota de envío y velocidad máxima de envío | Límites de envío: emails por segundo y al día, que se renuevan a medianoche UTC |
| Credenciales de IAM y firma SigV4 | Claves de API en una cabecera Authorization: Bearer |
| Credenciales SMTP | Tu clave de API, usada como contraseña SMTP |
| Configuration sets y destinos de eventos (SNS, EventBridge, Firehose) | Webhooks que envían JSON firmado a tu endpoint HTTPS |
| Lista de suppressions de la cuenta | Lista de direcciones bloqueadas del espacio de trabajo |
| Plantillas de email | Plantillas con un alias y versiones |
| Receipt rules | Emails entrantes con el webhook email.received |
| Email tags | meta |
| IP dedicadas | IP dedicadas bajo solicitud |
| Listas de contactos | Contactos, listas de contactos y campañas |
Actualizar las llamadas a la API
Las llamadas a SES se firman con tus credenciales de AWS, así que normalmente las haces con un SDK de AWS. Con Emailit, envías una petición JSON con una clave de API, o usas el SDK de Emailit para tu lenguaje. En Node.js:
import { SESv2Client, SendEmailCommand } from '@aws-sdk/client-sesv2';
const ses = new SESv2Client({ region: 'eu-west-1' });
await ses.send(new SendEmailCommand({
FromEmailAddress: 'Acme <hello@acme.com>',
Destination: { ToAddresses: ['ada@example.com'] },
Content: {
Simple: {
Subject: { Data: 'Your receipt' },
Body: {
Text: { Data: 'Thanks for your order.' },
Html: { Data: '<p>Thanks for your order.</p>' },
},
},
},
}));import { Emailit } from '@emailit/node';
const emailit = new Emailit(process.env.EMAILIT_API_KEY);
await emailit.emails.send({
from: 'Acme <hello@acme.com>',
to: 'ada@example.com',
subject: 'Your receipt',
text: 'Thanks for your order.',
html: '<p>Thanks for your order.</p>',
});Amazon SES (API v2 SendEmail) |
Emailit (POST /v2/emails) |
|---|---|
| Credenciales de AWS y firma SigV4 | Authorization: Bearer secret_… |
FromEmailAddress |
from |
Destination.ToAddresses, CcAddresses, BccAddresses |
to, cc, bcc, hasta 50 cada uno |
ReplyToAddresses |
reply_to |
Content.Simple.Subject.Data |
subject |
Content.Simple.Body.Html.Data, Text.Data |
html, text |
Content.Template.TemplateName |
template, un alias o ID |
Content.Template.TemplateData (una cadena JSON) |
variables (un objeto JSON) |
Content.Raw (un mensaje MIME completo) |
Envía el mensaje MIME a través del SMTP relay, o vuelve a construirlo con html, text y attachments |
EmailTags |
meta, que se devuelve en los eventos de webhook |
ConfigurationSetName |
No es necesario. Los eventos van a tus webhooks, y el seguimiento se configura por dominio o por email con tracking. |
Respuesta MessageId |
200 con id (em_…), message_id, status: "accepted" e ids por destinatario |
Emailit también admite la programación con scheduled_at y los reintentos seguros con una cabecera Idempotency-Key, que SES no ofrece al enviar. Consulta Enviar un email.
Cambiar la configuración SMTP
| Ajuste | Amazon SES | Emailit |
|---|---|---|
| Host | email-smtp.<region>.amazonaws.com |
smtp.emailit.com |
| Puerto | 587, 2587 o 25 (STARTTLS), 465 o 2465 (TLS) |
587, 2587, 2525 o 25 (STARTTLS), 465 (TLS) |
| Usuario | Tu usuario SMTP de SES | emailit |
| Contraseña | Tu contraseña SMTP de SES | Tu clave de API de Emailit |
Emailit no lee las cabeceras de SES, como X-SES-CONFIGURATION-SET. Elimínalas. Consulta Configuración SMTP.
Equivalencias de las notificaciones de eventos
SES publica los eventos a través de configuration sets en SNS, EventBridge o Firehose. Emailit los envía directamente a tu endpoint HTTPS como webhooks, así que no hay ningún tema al que suscribirse ni que confirmar.
| Tipo de evento de SES | Evento de Emailit |
|---|---|
Send |
email.accepted (solo API) |
Delivery |
email.delivered |
DeliveryDelay |
email.attempted |
Bounce con bounceType Permanent |
email.bounced |
Bounce con bounceType Transient |
email.attempted mientras Emailit reintenta, y después email.bounced si fallan todos los reintentos |
Complaint |
email.complained |
Open |
email.loaded |
Click |
email.clicked |
Subscription |
email.unsubscribed, solo para los emails de campaña |
Reject, Rendering Failure |
Sin equivalente directo. Los errores de la petición, como una plantilla que no existe, los devuelve la API de inmediato, y los mensajes que Emailit no va a entregar reciben el estado held. |
| Receipt rule con una acción de SNS o Lambda | email.received; después, obtén el contenido con GET /emails/{id} |
El payload también cambia:
- Cada petición de Emailit es un array JSON de hasta 100 eventos, con el nombre en
typey el email endata.object. - Usa
data.object.id, el IDem_de la respuesta de envío, en lugar delmessageIdde SES. Tus valores demetaestán endata.object.meta. - En lugar de comprobar las firmas de los mensajes de SNS, verifica
X-Emailit-SignatureconX-Emailit-Timestampy tu secretowhsec_. Consulta Verificar las firmas de los webhooks.
for (const event of req.body) {
const email = event.data.object;
if (event.type === 'email.bounced') markBounced(email.to, email.id);
if (event.type === 'email.complained') unsubscribe(email.to);
}Trasladar las direcciones bloqueadas
-
Exporta la lista de suppressions de la cuenta de SES con la AWS CLI. Si la salida incluye un
NextToken, repite el comando con--next-tokenhasta tener todas las páginas.aws sesv2 list-suppressed-destinations --output json \ | jq -r '(["email","type","reason"] | @csv), (.SuppressedDestinationSummaries[] | [.EmailAddress, "recipient", ("ses " + .Reason)] | @csv)' \ > suppressions.csvEsto genera un CSV con las columnas
email,type,reason. Todas las filas usan el tiporecipient, que bloquea los envíos por API, por SMTP y de campañas a la dirección. -
Si mantienes tu propia lista de rebotes y quejas a partir de las notificaciones de SNS, añade también esas direcciones.
-
En Email APISuppressions, selecciona Import y sube el archivo. Cada archivo puede tener hasta 10.000 filas y ocupar como máximo 8 MB. Los duplicados se omiten.
Consulta Gestionar las direcciones bloqueadas.
Trasladar las plantillas
Obtén cada plantilla con aws sesv2 get-email-template --template-name <name> y después importa su HTML en Email MarketingTemplates o crea la plantilla con la API de plantillas. Usa el nombre de la plantilla de SES como alias en Emailit, si se ajusta al formato de los alias: letras minúsculas, números, - y _.
Las plantillas de SES usan etiquetas al estilo de Handlebars. Temple cubre lo más habitual:
| Amazon SES | Emailit (Temple) |
|---|---|
{{name}}, {{user.name}} |
Igual |
{{#if plan}}…{{else}}…{{/if}} |
Igual |
{{#each items}}…{{/each}} |
No compatible. Genera la lista en tu código y pásala como una sola variable. |
TemplateData como cadena JSON |
variables como objeto JSON |
| Sin valor por defecto integrado | {{name|"there"}} añade un valor alternativo |
Temple nunca escapa el HTML, así que escapa los datos que introducen los usuarios antes de pasarlos. Consulta Lenguaje de plantillas Temple.
Cambiar los DNS
Añade tu dominio en Email APIDomains y publica los registros de Emailit. Usan sus propios nombres (emailit._domainkey, emailit.<domain> y, opcionalmente, go e inbound), así que no entran en conflicto con los CNAME de Easy DKIM de SES ni con un subdominio MAIL FROM personalizado. Conserva tu registro DMARC. Consulta Registros DNS de los dominios de envío.
Después del cambio definitivo, elimina los CNAME de DKIM de SES y los registros del MAIL FROM personalizado, y elimina las identidades en SES. Si recibes correo con las receipt rules de SES, trasládalo antes a un subdominio de entrada de Emailit.
Próximos pasos
- Lista de comprobación para pasar a producción
- Configurar un webhook
- Migración prioritaria: deja que los ingenieros de Emailit hagan la migración contigo