Salta ai contenuti

Amazon SES

Amazon Simple Email Service (SES) è il modo più economico per inviare grandi volumi di email transazionali ed è una scelta naturale se usi già AWS. Richiede un po’ più di configurazione rispetto ad altri provider – IAM, una regione, l’uscita dalla sandbox – ma dopo è molto affidabile.

Scegli SES quando invii migliaia di email al mese o più, ti interessa il prezzo per messaggio o vuoi tenere tutto nel tuo account AWS. Se vuoi la configurazione più rapida possibile, è più facile iniziare con Postmark, Resend o Mailgun. Vedi la panoramica dei servizi.

  • Un account AWS con SES attivo nella regione da cui vuoi inviare.
  • Un’identità verificata in quella regione: preferibilmente un intero dominio (SES → Identities → Create identity → Domain) o almeno il singolo indirizzo mittente.
  • L’accesso di produzione (uscita dalla sandbox) prima di inviare a destinatari qualsiasi: vedi Sandbox e limiti.
  • Un utente IAM dedicato con una chiave di accesso e solo questi permessi:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["ses:SendEmail", "ses:SendRawEmail", "ses:GetAccount"],
"Resource": "*"
}
]
}

ses:SendEmail / ses:SendRawEmail servono per l’invio (Frontmail usa l’API SES v2 con un messaggio MIME raw), ses:GetAccount per Prova connessione e per il controllo di stato giornaliero, che legge anche la tua quota e lo stato della sandbox. Puoi restringere Resource agli ARN della tua identità e del configuration set. Non usare le credenziali root o un utente amministratore.

  1. Apri Servizi email → Aggiungi servizio → Amazon SES.
  2. Compila i campi:
Campo Dove trovarlo Esempio
Regione AWS La regione in cui è verificata la tua identità (in alto a destra nella console SES) eu-central-1
Access key ID IAM → Users → frontmail-ses → Security credentials → Create access key AKIAIOSFODNN7EXAMPLE
Secret access key Mostrata una sola volta alla creazione della chiave di accesso wJalrXUtnFEMI/K7MDENG/…
Configuration set SES → Configuration sets (necessario per gli eventi di consegna) frontmail
ARN del topic SNS Facoltativo; SNS → Topics – gli eventi di altri topic vengono poi ignorati arn:aws:sns:eu-central-1:123456789012:frontmail-events
Email mittente predefinita Facoltativa; un’identità verificata nella regione scelta (un indirizzo su un dominio verificato o un indirizzo verificato). Usata quando il modello non ha un mittente hello@example.com
Nome mittente predefinito Facoltativo; nome visualizzato del mittente predefinito Acme
Max email al secondo Facoltativo; tienilo pari o inferiore alla velocità di invio massima di SES 14
  1. Clicca Verifica e salva. Frontmail chiama GetAccount e mostra se l’account è ancora nella sandbox, la velocità di invio massima e la quota delle 24 ore.
  2. Il servizio viene salvato quando il controllo va a buon fine. SES non ha un «indirizzo dell’account», quindi imposta qui un’Email mittente predefinita oppure un’email mittente in ogni modello; altrimenti l’invio fallisce con sender_not_configured (vedi Mittente predefinito). Puoi cambiarla in seguito nella pagina del servizio senza ripetere la verifica.
  3. La chiave di accesso è cifrata con AWS KMS (envelope encryption) e viene decifrata solo all’interno del processo di invio.

Easy DKIM – quando crei un’identità di dominio, SES ti fornisce tre record CNAME:

abcdef1234._domainkey.example.com. CNAME abcdef1234.dkim.amazonses.com.
ghijkl5678._domainkey.example.com. CNAME ghijkl5678.dkim.amazonses.com.
mnopqr9012._domainkey.example.com. CNAME mnopqr9012.dkim.amazonses.com.

AWS ruota automaticamente le chiavi che ci sono dietro. Quando i record si risolvono, l’identità risulta Verified.

SPF tramite un dominio MAIL FROM personalizzato – per impostazione predefinita il mittente della busta è un indirizzo amazonses.com, quindi SPF passa ma non è allineato con il tuo dominio. Per avere l’allineamento DMARC anche su SPF, imposta un MAIL FROM personalizzato (ad es. bounce.example.com) sull’identità e pubblica:

bounce.example.com. MX 10 feedback-smtp.eu-central-1.amazonses.com.
bounce.example.com. TXT "v=spf1 include:amazonses.com ~all"

(Sostituisci eu-central-1 con la tua regione.)

DMARC – inizia in modalità di monitoraggio, poi rendilo più restrittivo:

_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"

SES è regionale: identità, stato della sandbox, quote, configuration set e liste di soppressione sono tutti per regione. La regione che scegli in Frontmail deve essere quella in cui:

  • il tuo dominio o indirizzo è verificato,
  • hai richiesto l’accesso di produzione,
  • si trovano il configuration set e il topic SNS.

La chiave di accesso IAM in sé è globale, ma usarla in una regione in cui non è configurato nulla fallisce con “Email address is not verified”. Per la residenza dei dati nell’UE scegli una regione UE come eu-central-1 (Francoforte), eu-west-1 (Irlanda) o eu-north-1 (Stoccolma).

Ogni nuovo account SES parte nella sandbox in ogni regione:

  • puoi inviare solo a indirizzi o domini verificati,
  • al massimo 200 messaggi ogni 24 ore,
  • al massimo 1 messaggio al secondo.

Richiedi l’accesso di produzione in SES → Account dashboard → Request production access. Descrivi il caso d’uso (email transazionali da un modulo web tramite Frontmail), come i destinatari hanno dato il consenso e come gestisci bounce e reclami. L’approvazione di solito richiede circa un giorno.

Dopo l’approvazione la quota parte da un livello modesto (ad es. 50.000/giorno, 14/s) e cresce con una buona storia di invio. I valori attuali sono mostrati da Prova connessione; imposta Max email al secondo pari o inferiore alla tua velocità di invio massima.

SES pubblica gli eventi tramite Amazon SNS. Frontmail si iscrive al tuo topic SNS via HTTPS.

  1. SNS → Topics → Create topic (Standard), ad es. frontmail-events, nella stessa regione.

  2. Create subscription → protocollo HTTPS → endpoint = l’URL del webhook dalla pagina del servizio in Frontmail (pulsante di copia):

    https://api.frontmail.dev/webhooks/providers/ses/<token>

    Lascia disattivata la raw message delivery. Frontmail verifica la firma SNS e conferma l’iscrizione automaticamente: nel giro di pochi secondi lo stato dell’iscrizione passa da Pending confirmation a Confirmed.

  3. SES → Configuration sets → Create set (ad es. frontmail) → Event destinations → Add destination → scegli i tipi di evento → destinazione Amazon SNS → il tuo topic.

  4. Inserisci il nome del configuration set (e, se vuoi, l’ARN del topic) nel servizio Frontmail e salva.

Tipo di evento SES Evento Frontmail
Deliveries delivered
Hard bounces (Permanent) bounced – aggiunto alla lista di soppressione
Soft bounces (Transient), ritardi di consegna registrati sul messaggio
Complaints complained – aggiunto alla lista di soppressione
Opens opened
Clicks clicked
Rejects, errori di rendering registrati sul messaggio

Verifica della firma: ogni messaggio SNS è firmato. Frontmail scarica il certificato di firma solo da sns.<region>.amazonaws.com, verifica la firma (SignatureVersion 1 o 2) e rifiuta i messaggi più vecchi di un’ora. Se imposti l’ARN del topic SNS, le notifiche di qualsiasi altro topic vengono rifiutate. Se lo lasci vuoto, Frontmail fissa il topic del primo messaggio con firma valida (di norma la conferma dell’iscrizione) e da quel momento rifiuta i messaggi di qualsiasi altro topic: una firma SNS dimostra solo che il messaggio è stato inviato da un qualche account AWS.

Frontmail aggiunge a ogni email un message tag frontmail_message_id, così gli eventi possono essere ricondotti al messaggio.

  • auth – il servizio non funziona (chiave di accesso non valida o eliminata, permesso IAM mancante, invio sospeso, mittente non verificato). Il servizio viene segnato come unhealthy e il proprietario riceve un’email più un banner nella dashboard. Se il modello ha un servizio di riserva, il messaggio passa da lì; altrimenti il credito viene rimborsato e il messaggio aspetta nella coda dei messaggi in attesa come held_service_error finché non sistemi il servizio (ricontrollato al salvataggio e nel controllo di stato giornaliero), poi viene inviato automaticamente.
  • permanent – questo messaggio non può essere inviato (destinatario non valido o non verificato, contenuto rifiutato). Servizio di riserva se configurato, altrimenti failed con il credito rimborsato.
  • transient – throttling, timeout, 5xx. Ritentato con backoff esponenziale; dopo l’ultimo tentativo failed e credito rimborsato.
Errore SES Classe Cosa fare
InvalidClientTokenId / UnrecognizedClientException / SignatureDoesNotMatch auth L’access key ID o il segreto sono errati o eliminati. Crea una nuova chiave per l’utente IAM.
AccessDeniedException: … not authorized to perform ses:SendRawEmail auth Aggiungi l’azione mancante alla policy IAM (vedi sopra).
MessageRejected: Email address is not verified … hello@example.com (il mittente) auth Verifica il dominio o l’indirizzo mittente nella regione scelta.
MailFromDomainNotVerifiedException auth Correggi i record MX/TXT del MAIL FROM personalizzato o rimuovi il MAIL FROM personalizzato.
SendingPausedException / AccountSuspendedException auth AWS ha sospeso l’invio (spesso per un tasso di bounce o reclami elevato). Controlla SES → Reputation metrics e gli avvisi di AWS.
MessageRejected: Email address is not verified … customer@gmail.com (un destinatario) permanent L’account è ancora nella sandbox: richiedi l’accesso di produzione o verifica il destinatario.
BadRequestException / ValidationException (indirizzo non valido) permanent Vedi destinatario non valido.
TooManyRequestsException / Throttling: Maximum sending rate exceeded transient Abbassa Max email al secondo alla velocità di invio di SES; chiedi ad AWS una quota più alta.
InternalFailure, ServiceUnavailable, timeout transient Niente: Frontmail ritenta.
  • Identità di dominio verificata con Easy DKIM (3 CNAME) nella regione scelta
  • MAIL FROM personalizzato (MX + SPF) e DMARC p=none pubblicati
  • Accesso di produzione concesso in quella regione
  • Utente IAM con solo ses:SendEmail, ses:SendRawEmail, ses:GetAccount
  • Prova connessione va a buon fine e mostra sandbox: false
  • Configuration set → topic SNS → iscrizione HTTPS all’URL del webhook Frontmail, stato Confirmed
  • Nome del configuration set inserito in Frontmail
  • Max email al secondo pari o inferiore alla velocità di invio di SES