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.
Prerequisiti
Sezione intitolata “Prerequisiti”- 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.
Collegamento in Frontmail
Sezione intitolata “Collegamento in Frontmail”- Apri Servizi email → Aggiungi servizio → Amazon SES.
- 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 |
- Clicca Verifica e salva. Frontmail chiama
GetAccounte mostra se l’account è ancora nella sandbox, la velocità di invio massima e la quota delle 24 ore. - 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. - La chiave di accesso è cifrata con AWS KMS (envelope encryption) e viene decifrata solo all’interno del processo di invio.
DNS: SPF, DKIM e DMARC
Sezione intitolata “DNS: SPF, DKIM e DMARC”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"Regioni
Sezione intitolata “Regioni”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).
Sandbox e limiti
Sezione intitolata “Sandbox e limiti”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.
Webhook (tracciamento della consegna)
Sezione intitolata “Webhook (tracciamento della consegna)”SES pubblica gli eventi tramite Amazon SNS. Frontmail si iscrive al tuo topic SNS via HTTPS.
-
SNS → Topics → Create topic (Standard), ad es.
frontmail-events, nella stessa regione. -
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.
-
SES → Configuration sets → Create set (ad es.
frontmail) → Event destinations → Add destination → scegli i tipi di evento → destinazione Amazon SNS → il tuo topic. -
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.
Errori comuni
Sezione intitolata “Errori comuni”- 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
unhealthye 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 comeheld_service_errorfinché 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
failedcon il credito rimborsato. - transient – throttling, timeout, 5xx. Ritentato con backoff esponenziale; dopo l’ultimo tentativo
failede 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. |
Checklist
Sezione intitolata “Checklist”- Identità di dominio verificata con Easy DKIM (3 CNAME) nella regione scelta
- MAIL FROM personalizzato (MX + SPF) e DMARC
p=nonepubblicati - 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