# 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](/es/docs/migrate/) 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](/es/docs/workspaces/) |
| Identidades verificadas: dominios y direcciones de email | [Dominios de envío](/es/docs/domains/). 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](/es/docs/workspaces/production-access/). 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](/es/docs/limits/): emails por segundo y al día, que se renuevan a medianoche UTC |
| Credenciales de IAM y firma SigV4 | [Claves de API](/es/docs/developers/api-keys/) 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](/es/docs/webhooks/) que envían JSON firmado a tu endpoint HTTPS |
| Lista de suppressions de la cuenta | [Lista de direcciones bloqueadas](/es/docs/suppressions/) del espacio de trabajo |
| Plantillas de email | [Plantillas](/es/docs/templates/) con un alias y versiones |
| Receipt rules | [Emails entrantes](/es/docs/inbound/) con el webhook `email.received` |
| Email tags | `meta` |
| IP dedicadas | [IP dedicadas](/es/docs/deliverability/dedicated-ips/) bajo solicitud |
| Listas de contactos | [Contactos](/es/docs/contacts/), [listas de contactos](/es/docs/audiences/) y [campañas](/es/docs/campaigns/) |

## 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](/es/docs/sdks/) para tu lenguaje. En Node.js:

```javascript title="Antes: Amazon SES (AWS SDK v3)"

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>' },
      },
    },
  },
}));
```

```javascript title="Después: Emailit"

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](/es/docs/smtp/), 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](/es/docs/email-api/send-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](/es/docs/smtp/settings/).

## 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}`](/es/docs/api-reference/emails/get/) |

El payload también cambia:

- Cada petición de Emailit es un array JSON de hasta 100 eventos, con el nombre en `type` y el email en `data.object`.
- Usa `data.object.id`, el ID `em_` de la respuesta de envío, en lugar del `messageId` de SES. Tus valores de `meta` están en `data.object.meta`.
- En lugar de comprobar las firmas de los mensajes de SNS, verifica `X-Emailit-Signature` con `X-Emailit-Timestamp` y tu secreto `whsec_`. Consulta [Verificar las firmas de los webhooks](/es/docs/webhooks/request-signature/).

```javascript
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

1. 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-token` hasta tener todas las páginas.

```bash
aws sesv2 list-suppressed-destinations --output json \
  | jq -r '(["email","type","reason"] | @csv),
           (.SuppressedDestinationSummaries[] | [.EmailAddress, "recipient", ("ses " + .Reason)] | @csv)' \
  > suppressions.csv
```

   Esto genera un CSV con las columnas `email,type,reason`. Todas las filas usan el tipo `recipient`, que bloquea los envíos por API, por SMTP y de campañas a la dirección.

2. Si mantienes tu propia lista de rebotes y quejas a partir de las notificaciones de SNS, añade también esas direcciones.

3. En **Email API → Suppressions**, 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](/es/docs/suppressions/manage/).

## Trasladar las plantillas

Obtén cada plantilla con `aws sesv2 get-email-template --template-name <name>` y después importa su HTML en **Email Marketing → Templates** o crea la plantilla con la [API de plantillas](/es/docs/api-reference/templates/create/). 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](/es/docs/templates/temple/).

## Cambiar los DNS

Añade tu dominio en **Email API → Domains** 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](/es/docs/domains/dns-records/).

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](/es/docs/inbound/set-up/) de Emailit.

## Próximos pasos

- [Lista de comprobación para pasar a producción](/es/docs/get-started/go-live/)
- [Configurar un webhook](/es/docs/webhooks/set-up/)
- [Migración prioritaria](/es/docs/programs/priority-migration/): deja que los ingenieros de Emailit hagan la migración contigo

---
Fuente: https://emailit.com/es/docs/migrate/amazon-ses/
