Amazon SES
Amazon Simple Email Service (SES) est le moyen le moins cher d’envoyer de gros volumes d’e-mails transactionnels, et un choix naturel si vous êtes déjà sur AWS. Sa configuration demande un peu plus de travail que celle des autres fournisseurs – IAM, une région, la sortie du sandbox – mais ensuite, il est très fiable.
Choisissez SES si vous envoyez des milliers d’e-mails par mois ou plus, si le prix par message compte pour vous, ou si vous voulez tout garder dans votre propre compte AWS. Si vous voulez la configuration la plus rapide possible, Postmark, Resend ou Mailgun sont plus simples pour démarrer. Voir la présentation des services d’envoi.
Prérequis
Section intitulée « Prérequis »- Un compte AWS avec SES activé dans la région depuis laquelle vous voulez envoyer.
- Une identité vérifiée dans cette région : de préférence un domaine entier (SES → Identities → Create identity → Domain), ou au moins l’adresse d’expéditeur elle-même.
- L’accès production (sortie du sandbox) avant d’envoyer à des destinataires quelconques – voir Sandbox et limites.
- Un utilisateur IAM dédié avec une clé d’accès et uniquement ces autorisations :
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["ses:SendEmail", "ses:SendRawEmail", "ses:GetAccount"], "Resource": "*" } ]}ses:SendEmail / ses:SendRawEmail sont nécessaires pour l’envoi (Frontmail utilise l’API SES v2 avec un message MIME brut), ses:GetAccount pour Tester la connexion et la vérification d’état quotidienne, qui lit aussi votre quota et votre statut sandbox. Vous pouvez restreindre Resource aux ARN de votre identité et de votre configuration set. N’utilisez pas les identifiants root ni un utilisateur administrateur.
Connexion dans Frontmail
Section intitulée « Connexion dans Frontmail »- Ouvrez Services d’envoi → Ajouter un service → Amazon SES.
- Remplissez les champs :
| Champ | Où le trouver | Exemple |
|---|---|---|
| Région AWS | La région où votre identité est vérifiée (en haut à droite de la console SES) | eu-central-1 |
| Access key ID | IAM → Users → frontmail-ses → Security credentials → Create access key | AKIAIOSFODNN7EXAMPLE |
| Secret access key | Affichée une seule fois à la création de la clé d’accès | wJalrXUtnFEMI/K7MDENG/… |
| Configuration set | SES → Configuration sets (nécessaire pour les événements de livraison) | frontmail |
| ARN du topic SNS | Facultatif ; SNS → Topics – les événements des autres topics sont alors ignorés | arn:aws:sns:eu-central-1:123456789012:frontmail-events |
| Adresse d’expéditeur par défaut | Facultatif ; une identité vérifiée dans la région choisie (une adresse sur un domaine vérifié, ou une adresse vérifiée). Utilisée quand le modèle n’a pas d’expéditeur | hello@example.com |
| Nom d’expéditeur par défaut | Facultatif ; nom affiché de l’expéditeur par défaut | Acme |
| E-mails par seconde (max.) | Facultatif ; restez au niveau de votre débit d’envoi maximal SES ou en dessous | 14 |
- Cliquez sur Vérifier et enregistrer. Frontmail appelle
GetAccountet indique si le compte est encore dans le sandbox, ainsi que son débit d’envoi maximal et son quota sur 24 heures. - Le service est enregistré une fois la vérification réussie. SES n’a pas d’« adresse de compte » : définissez donc ici une Adresse d’expéditeur par défaut ou un e-mail d’expéditeur dans chaque modèle – sinon l’envoi échoue avec
sender_not_configured(voir Expéditeur par défaut). Vous pourrez la modifier plus tard sur la page du service sans nouvelle vérification. - La clé d’accès est chiffrée avec le chiffrement d’enveloppe d’AWS KMS ; elle n’est déchiffrée qu’à l’intérieur du processus d’envoi.
DNS : SPF, DKIM et DMARC
Section intitulée « DNS : SPF, DKIM et DMARC »Easy DKIM – quand vous créez une identité de domaine, SES vous donne trois enregistrements 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 fait tourner automatiquement les clés correspondantes. Dès qu’ils sont résolus, l’identité affiche Verified.
SPF via un domaine MAIL FROM personnalisé – par défaut, l’expéditeur d’enveloppe est une adresse amazonses.com : SPF passe, mais n’est pas aligné sur votre domaine. Pour obtenir aussi l’alignement DMARC sur SPF, définissez un MAIL FROM personnalisé (p. ex. bounce.example.com) sur l’identité et publiez :
bounce.example.com. MX 10 feedback-smtp.eu-central-1.amazonses.com.bounce.example.com. TXT "v=spf1 include:amazonses.com ~all"(Remplacez eu-central-1 par votre région.)
DMARC – commencez en mode surveillance, puis durcissez :
_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:dmarc@example.com"SES est régional : identités, statut sandbox, quotas, configuration sets et listes de suppression sont tous définis par région. La région choisie dans Frontmail doit être celle où :
- votre domaine ou votre adresse est vérifié,
- vous avez demandé l’accès production,
- se trouvent votre configuration set et votre topic SNS.
La clé d’accès IAM est elle-même globale, mais l’utiliser dans une région où rien n’est configuré échoue avec « Email address is not verified ». Pour garder les données dans l’UE, choisissez une région européenne comme eu-central-1 (Francfort), eu-west-1 (Irlande) ou eu-north-1 (Stockholm).
Sandbox et limites
Section intitulée « Sandbox et limites »Chaque nouveau compte SES démarre dans le sandbox, dans chaque région :
- vous ne pouvez envoyer qu’à des adresses ou domaines vérifiés,
- au maximum 200 messages par 24 heures,
- au maximum 1 message par seconde.
Demandez l’accès production dans SES → Account dashboard → Request production access. Décrivez le cas d’usage (e-mails transactionnels depuis un formulaire web via Frontmail), la façon dont les destinataires ont donné leur accord et la manière dont vous gérez les rebonds et les plaintes. L’approbation prend généralement environ une journée.
Après l’approbation, votre quota démarre à un niveau modeste (p. ex. 50 000/jour, 14/s) et augmente avec un bon historique d’envoi. Tester la connexion affiche les valeurs actuelles ; réglez E-mails par seconde (max.) au niveau de votre débit d’envoi maximal ou en dessous.
Webhooks (suivi de livraison)
Section intitulée « Webhooks (suivi de livraison) »SES publie les événements via Amazon SNS. Frontmail s’abonne à votre topic SNS en HTTPS.
-
SNS → Topics → Create topic (Standard), p. ex.
frontmail-events, dans la même région. -
Create subscription → protocole HTTPS → point de terminaison = l’URL du webhook de la page du service dans Frontmail (bouton de copie) :
https://api.frontmail.dev/webhooks/providers/ses/<token>Laissez raw message delivery désactivé. Frontmail vérifie la signature SNS et confirme l’abonnement automatiquement – en quelques secondes, le statut de l’abonnement passe de Pending confirmation à Confirmed.
-
SES → Configuration sets → Create set (p. ex.
frontmail) → Event destinations → Add destination → choisissez les types d’événements → destination Amazon SNS → votre topic. -
Saisissez le nom du configuration set (et éventuellement l’ARN du topic) dans le service Frontmail et enregistrez.
| Type d’événement SES | Événement Frontmail |
|---|---|
| Deliveries | delivered |
Hard bounces (Permanent) |
bounced – ajoutée à la liste de suppression |
Soft bounces (Transient), retards de livraison |
enregistré sur le message |
| Complaints | complained – ajoutée à la liste de suppression |
| Opens | opened |
| Clicks | clicked |
| Rejects, échecs de rendu | enregistré sur le message |
Vérification de la signature : chaque message SNS est signé. Frontmail télécharge le certificat de signature uniquement depuis sns.<region>.amazonaws.com, vérifie la signature (SignatureVersion 1 ou 2) et refuse les messages de plus d’une heure. Si vous renseignez ARN du topic SNS, les notifications de tout autre topic sont refusées. Si vous le laissez vide, Frontmail retient le topic du premier message correctement signé (normalement la confirmation d’abonnement) et refuse ensuite les messages de tout autre topic – une signature SNS prouve seulement qu’un compte AWS quelconque a envoyé le message.
Frontmail ajoute à chaque e-mail un tag de message frontmail_message_id pour que les événements puissent être rattachés au bon message.
Erreurs courantes
Section intitulée « Erreurs courantes »- auth – le service est cassé (clé d’accès invalide ou supprimée, autorisation IAM manquante, envoi suspendu, expéditeur non vérifié). Le service est marqué
unhealthyet le propriétaire reçoit un e-mail ainsi qu’une bannière dans le tableau de bord. Si le modèle a un service de secours, le message part par celui-ci ; sinon le crédit est remboursé et le message attend dans la file d’attente des e-mails retenus enheld_service_errorjusqu’à ce que vous répariez le service (revérifié à l’enregistrement et lors de la vérification d’état quotidienne), puis il est envoyé automatiquement. - permanent – ce message ne peut pas être envoyé (destinataire invalide ou non vérifié, contenu refusé). Service de secours s’il est configuré, sinon
failedet crédit remboursé. - transient – limitation de débit, délais dépassés, 5xx. Relancé avec un délai exponentiel ; après la dernière tentative,
failedet crédit remboursé.
| Erreur SES | Catégorie | Que faire |
|---|---|---|
InvalidClientTokenId / UnrecognizedClientException / SignatureDoesNotMatch |
auth | L’access key ID ou le secret est erroné ou supprimé. Créez une nouvelle clé pour l’utilisateur IAM. |
AccessDeniedException: … not authorized to perform ses:SendRawEmail |
auth | Ajoutez l’action manquante à la stratégie IAM (voir plus haut). |
MessageRejected: Email address is not verified … hello@example.com (l’expéditeur) |
auth | Vérifiez le domaine ou l’adresse d’expéditeur dans la région choisie. |
MailFromDomainNotVerifiedException |
auth | Corrigez les enregistrements MX/TXT du MAIL FROM personnalisé ou supprimez le MAIL FROM personnalisé. |
SendingPausedException / AccountSuspendedException |
auth | AWS a suspendu l’envoi (souvent à cause d’un taux de rebonds ou de plaintes élevé). Consultez SES → Reputation metrics et les notifications AWS. |
MessageRejected: Email address is not verified … customer@gmail.com (un destinataire) |
permanent | Le compte est encore dans le sandbox – demandez l’accès production ou vérifiez le destinataire. |
BadRequestException / ValidationException (adresse invalide) |
permanent | Voir destinataire invalide. |
TooManyRequestsException / Throttling: Maximum sending rate exceeded |
transient | Réglez E-mails par seconde (max.) sur votre débit d’envoi SES ; demandez un quota plus élevé à AWS. |
InternalFailure, ServiceUnavailable, délais dépassés |
transient | Rien – Frontmail relance. |
Liste de contrôle
Section intitulée « Liste de contrôle »- Identité de domaine vérifiée avec Easy DKIM (3 CNAME) dans la région choisie
- MAIL FROM personnalisé (MX + SPF) et DMARC
p=nonepubliés - Accès production accordé dans cette région
- Utilisateur IAM avec uniquement
ses:SendEmail,ses:SendRawEmail,ses:GetAccount - Tester la connexion réussit et affiche
sandbox: false - Configuration set → topic SNS → abonnement HTTPS vers l’URL du webhook Frontmail, statut Confirmed
- Nom du configuration set saisi dans Frontmail
- E-mails par seconde (max.) au niveau de votre débit d’envoi SES ou en dessous