Configurar DMARC en AWS SES: guía para desarrolladores

Guía técnica para desarrolladores: configura SPF, DKIM y DMARC en Amazon SES. Incluye comandos CLI, ejemplos de código y buenas prácticas.

15 de diciembre de 2025
8 min de lectura
Share:
Configurar DMARC en AWS SES: guía para desarrolladores

Introducción

Amazon Simple Email Service (SES) es una plataforma de correo potente y rentable para desarrolladores. Sin embargo, configurar correctamente la autenticación es fundamental para la entregabilidad y para evitar la carpeta de spam en SES.

Esta guía técnica cubre la configuración completa de autenticación de correo en AWS SES, incluyendo comandos CLI y ejemplos de infraestructura como código.

Lo que aprenderás:

  • Configurar la identidad de dominio en SES con SPF y DKIM
  • Implementar una política DMARC
  • Gestionar múltiples dominios de envío
  • Monitorizar y depurar la autenticación
  • Buenas prácticas para despliegues en producción

Requisitos previos:

  • Cuenta de AWS con acceso a SES
  • Dominio con gestión DNS
  • AWS CLI instalado y configurado
  • Conocimientos básicos de DNS y autenticación de correo

Paso 1: Verificar el dominio en SES

1.1: Verificar la identidad del dominio (consola)

  1. Abre la consola de SES

  2. Crear la identidad del dominio

    • Haz clic en "Identities" → "Create identity"
    • Selecciona "Domain"
    • Introduce tu dominio: tudominio.com
    • Marca "Assign a default configuration set" (opcional)
    • Haz clic en "Create identity"
  3. Copia los registros DNS

    • SES proporciona los registros DNS a añadir:
      • Verificación del dominio (TXT o CNAME)
      • Registros DKIM (3 registros CNAME)
      • (Opcionalmente) Custom MAIL FROM

1.2: Verificar la identidad del dominio (CLI)

aws ses verify-domain-identity --domain tudominio.com --region us-east-1

aws ses verify-domain-dkim --domain tudominio.com --region us-east-1

Salida:

{
    "DkimTokens": [
        "token1abc123",
        "token2def456",
        "token3ghi789"
    ]
}

1.3: Verificar el dominio con CloudFormation

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  SESIdentity:
    Type: AWS::SES::EmailIdentity
    Properties:
      EmailIdentity: tudominio.com
      DkimSigningAttributes:
        NextSigningKeyLength: RSA_2048_BIT

1.4: Verificar el dominio con Terraform

resource "aws_ses_domain_identity" "main" {
  domain = "tudominio.com"
}

resource "aws_ses_domain_dkim" "main" {
  domain = aws_ses_domain_identity.main.domain
}

Paso 2: Configurar los registros DNS

2.1: Añadir el registro de verificación del dominio

SES proporciona un token de verificación. Añade un registro TXT:

  • Name: _amazonses.tudominio.com
  • Type: TXT
  • Value: Token de verificación de SES

Ejemplo:

_amazonses.tudominio.com TXT "abc123def456ghi789..."

2.2: Añadir los registros DKIM

SES proporciona tres tokens DKIM. Crea tres registros CNAME:

token1abc123._domainkey.tudominio.com CNAME token1abc123.dkim.amazonses.com
token2def456._domainkey.tudominio.com CNAME token2def456.dkim.amazonses.com
token3ghi789._domainkey.tudominio.com CNAME token3ghi789.dkim.amazonses.com

Con Route 53 CLI:

ZONE_ID=$(aws route53 list-hosted-zones-by-name --dns-name tudominio.com \
  --query "HostedZones[0].Id" --output text)

aws route53 change-resource-record-sets --hosted-zone-id $ZONE_ID --change-batch '{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "token1abc123._domainkey.tudominio.com",
        "Type": "CNAME",
        "TTL": 1800,
        "ResourceRecords": [{"Value": "token1abc123.dkim.amazonses.com"}]
      }
    },
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "token2def456._domainkey.tudominio.com",
        "Type": "CNAME",
        "TTL": 1800,
        "ResourceRecords": [{"Value": "token2def456.dkim.amazonses.com"}]
      }
    },
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "token3ghi789._domainkey.tudominio.com",
        "Type": "CNAME",
        "TTL": 1800,
        "ResourceRecords": [{"Value": "token3ghi789.dkim.amazonses.com"}]
      }
    }
  ]
}'

2.3: Verificar el estado de DKIM

Consola: Comprueba el estado de la identidad (debería mostrar "Verified" con DKIM activado)

CLI:

aws ses get-identity-dkim-attributes --identities tudominio.com --region us-east-1

Salida esperada:

{
    "DkimAttributes": {
        "tudominio.com": {
            "DkimEnabled": true,
            "DkimVerificationStatus": "Success",
            "DkimTokens": ["token1abc123", "token2def456", "token3ghi789"]
        }
    }
}

Paso 3: Configurar SPF para SES

3.1: Registro SPF básico

Añade un registro TXT:

  • Name: @ o tudominio.com
  • Type: TXT
  • Value: v=spf1 include:amazonses.com ~all

3.2: SPF con múltiples servicios

Si usas SES + otros servicios:

v=spf1 include:amazonses.com include:_spf.google.com ~all

3.3: Consideraciones regionales de SPF

Importante: SES envía desde endpoints regionales. El include amazonses.com cubre todas las regiones.

Alternativa (específico por región):

  • US East (N. Virginia): include:ses-email.us-east-1.amazonses.com
  • US West (Oregon): include:ses-email.us-west-2.amazonses.com
  • EU (Ireland): include:ses-email.eu-west-1.amazonses.com

Se recomienda usar include:amazonses.com (cubre todas las regiones).

3.4: Añadir SPF con Route 53 CLI

ZONE_ID=$(aws route53 list-hosted-zones-by-name --dns-name tudominio.com \
  --query "HostedZones[0].Id" --output text)

aws route53 change-resource-record-sets --hosted-zone-id $ZONE_ID --change-batch '{
  "Changes": [{
    "Action": "CREATE",
    "ResourceRecordSet": {
      "Name": "tudominio.com",
      "Type": "TXT",
      "TTL": 300,
      "ResourceRecords": [{"Value": "\"v=spf1 include:amazonses.com ~all\""}]
    }
  }]
}'

3.5: Verificar SPF

dig tudominio.com TXT

O usa: SPF Checker →

Paso 4: Configurar Custom MAIL FROM (opcional pero recomendado)

4.1: Por qué usar Custom MAIL FROM

Por defecto, SES utiliza amazonses.com como dominio MAIL FROM, lo que provoca problemas de alineación SPF con DMARC.

Ventajas del Custom MAIL FROM:

  • Alineación SPF correcta
  • Mejor cumplimiento DMARC
  • Apariencia más profesional

4.2: Establecer el dominio Custom MAIL FROM

Elige un subdominio: bounce.tudominio.com o mail.tudominio.com

Desde la consola:

  1. Ve a la identidad en SES
  2. Haz clic en "Custom MAIL FROM domain"
  3. Introduce el subdominio: bounce.tudominio.com
  4. Elige "Use a default value" o "Reject email"
  5. Guarda

Desde CLI:

aws ses set-identity-mail-from-domain \
  --identity tudominio.com \
  --mail-from-domain bounce.tudominio.com \
  --behavior-on-mx-failure UseDefaultValue \
  --region us-east-1

4.3: Añadir registros DNS para Custom MAIL FROM

SES requiere dos registros:

Registro MX:

  • Name: bounce.tudominio.com
  • Type: MX
  • Value: 10 feedback-smtp.us-east-1.amazonses.com
  • Priority: 10

Registro SPF:

  • Name: bounce.tudominio.com
  • Type: TXT
  • Value: v=spf1 include:amazonses.com ~all

Route 53 CLI:

aws route53 change-resource-record-sets --hosted-zone-id $ZONE_ID --change-batch '{
  "Changes": [
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "bounce.tudominio.com",
        "Type": "MX",
        "TTL": 300,
        "ResourceRecords": [{"Value": "10 feedback-smtp.us-east-1.amazonses.com"}]
      }
    },
    {
      "Action": "CREATE",
      "ResourceRecordSet": {
        "Name": "bounce.tudominio.com",
        "Type": "TXT",
        "TTL": 300,
        "ResourceRecords": [{"Value": "\"v=spf1 include:amazonses.com ~all\""}]
      }
    }
  ]
}'

4.4: Verificar Custom MAIL FROM

aws ses get-identity-mail-from-domain-attributes \
  --identities tudominio.com \
  --region us-east-1

Paso 5: Implementar DMARC

5.1: Crear el registro DMARC

Añade un registro TXT:

  • Name: _dmarc.tudominio.com
  • Type: TXT
  • Value:
    v=DMARC1; p=none; rua=mailto:dmarc@tudominio.com; fo=1

5.2: Route 53 CLI

aws route53 change-resource-record-sets --hosted-zone-id $ZONE_ID --change-batch '{
  "Changes": [{
    "Action": "CREATE",
    "ResourceRecordSet": {
      "Name": "_dmarc.tudominio.com",
      "Type": "TXT",
      "TTL": 300,
      "ResourceRecords": [{"Value": "\"v=DMARC1; p=none; rua=mailto:dmarc@tudominio.com; fo=1\""}]
    }
  }]
}'

5.3: Política DMARC progresiva

Monitorización (semanas 1-4):

v=DMARC1; p=none; rua=mailto:dmarc@tudominio.com

Cuarentena (semanas 5-8):

v=DMARC1; p=quarantine; pct=100; rua=mailto:dmarc@tudominio.com; adkim=r; aspf=r

Rechazo (semana 9 en adelante):

v=DMARC1; p=reject; pct=100; rua=mailto:dmarc@tudominio.com; adkim=r; aspf=r

5.4: Verificar DMARC

dig _dmarc.tudominio.com TXT

O usa: DMARC Checker →

Paso 6: Enviar correo de prueba

6.1: Enviar prueba con AWS SDK (Python)

import boto3

ses = boto3.client('ses', region_name='us-east-1')

response = ses.send_email(
    Source='test@tudominio.com',
    Destination={'ToAddresses': ['destinatario@ejemplo.com']},
    Message={
        'Subject': {'Data': 'Test Email - DMARC Verification'},
        'Body': {'Text': {'Data': 'This is a test email to verify authentication.'}}
    }
)

print(f"Email sent. Message ID: {response['MessageId']}")

6.2: Enviar prueba con CLI

aws ses send-email \
  --from test@tudominio.com \
  --to destinatario@ejemplo.com \
  --subject "Test Email" \
  --text "Test authentication" \
  --region us-east-1

6.3: Verificar las cabeceras del correo

  1. Envía a Gmail/Outlook
  2. Visualiza el mensaje original
  3. Comprueba la cabecera Authentication-Results

Resultado esperado:

Authentication-Results: mx.google.com;
       dkim=pass header.i=@tudominio.com;
       spf=pass smtp.mailfrom=tudominio.com;
       dmarc=pass

Paso 7: Buenas prácticas para producción

7.1: Usar Configuration Sets

Rastrea envíos, aperturas, clics y rebotes:

aws ses create-configuration-set \
  --configuration-set Name=production-emails \
  --region us-east-1

7.2: Configurar Event Publishing

Monitoriza rebotes y quejas:

aws ses put-configuration-set-event-destination \
  --configuration-set-name production-emails \
  --event-destination '{
    "Name": "CloudWatch",
    "Enabled": true,
    "MatchingEventTypes": ["send","bounce","complaint"],
    "CloudWatchDestination": {
      "DimensionConfigurations": [{
        "DimensionName": "ses:configuration-set",
        "DimensionValueSource": "messageTag",
        "DefaultDimensionValue": "production-emails"
      }]
    }
  }'

7.3: Monitorizar la reputación de envío

aws ses get-account-sending-enabled --region us-east-1

aws ses get-send-quota --region us-east-1

7.4: Gestionar rebotes y quejas

Configura un topic de SNS para notificaciones:

aws ses set-identity-notification-topic \
  --identity tudominio.com \
  --notification-type Bounce \
  --sns-topic arn:aws:sns:us-east-1:123456789012:ses-bounces

Resolución de problemas

Problema: La verificación DKIM falla

Síntomas: El estado de DKIM muestra "Pending" o "Failed"

Solución:

  • Verifica que los tres registros CNAME están correctamente añadidos
  • Comprueba errores tipográficos en los tokens DKIM
  • Espera hasta 72 horas para la propagación DNS
  • Usa dig para verificar los registros CNAME

Problema: La alineación SPF falla con DMARC

Síntomas: SPF pasa pero DMARC falla la alineación

Solución:

  • Configura un dominio Custom MAIL FROM
  • Asegúrate de que el Custom MAIL FROM tiene los registros MX y SPF correctos
  • Usa alineación relajada en DMARC: aspf=r

Problema: Correos en modo sandbox

Síntomas: Solo puedes enviar a direcciones verificadas

Solución: Solicita acceso a producción:

aws ses get-account-sending-enabled

Ejemplos de infraestructura como código

Ejemplo completo con Terraform

resource "aws_ses_domain_identity" "main" {
  domain = "tudominio.com"
}

resource "aws_ses_domain_dkim" "main" {
  domain = aws_ses_domain_identity.main.domain
}

resource "aws_ses_domain_mail_from" "main" {
  domain           = aws_ses_domain_identity.main.domain
  mail_from_domain = "bounce.${aws_ses_domain_identity.main.domain}"
}

resource "aws_route53_record" "dkim" {
  count   = 3
  zone_id = aws_route53_zone.main.zone_id
  name    = "${element(aws_ses_domain_dkim.main.dkim_tokens, count.index)}._domainkey"
  type    = "CNAME"
  ttl     = 300
  records = ["${element(aws_ses_domain_dkim.main.dkim_tokens, count.index)}.dkim.amazonses.com"]
}

resource "aws_route53_record" "spf" {
  zone_id = aws_route53_zone.main.zone_id
  name    = ""
  type    = "TXT"
  ttl     = 300
  records = ["v=spf1 include:amazonses.com ~all"]
}

resource "aws_route53_record" "dmarc" {
  zone_id = aws_route53_zone.main.zone_id
  name    = "_dmarc"
  type    = "TXT"
  ttl     = 300
  records = ["v=DMARC1; p=none; rua=mailto:dmarc@tudominio.com"]
}

Resumen

La configuración de autenticación en AWS SES implica:

  1. Verificación del dominio: Verificar la identidad del dominio en SES
  2. DKIM: Añadir tres registros CNAME (autoconfigurados)
  3. SPF: Añadir include:amazonses.com
  4. Custom MAIL FROM: Configurar para una alineación SPF correcta
  5. DMARC: Enforcement progresivo de la política

Plazos:

  • Configuración: 30-45 minutos
  • Propagación DNS: 1-24 horas
  • Monitorización: 2-4 semanas
  • Enforcement completo: 6-8 semanas

Siguientes pasos

Verifica tu configuración de AWS SES:

  1. Comprobar SPF →
  2. Verificar DKIM →
  3. Probar DMARC →
  4. Auditoría completa →

¿Necesitas monitorización DMARC automatizada? Empieza gratis →


Artículos relacionados:

Tags:aws-sesamazon-sesdmarc-setupdevelopers

¿Listo para mejorar la entregabilidad de tus emails?

Empieza a monitorizar tus reportes DMARC y obtén información sobre tu configuración de autenticación.

Comenzar Prueba Gratuita