Aller au contenu

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.

  • 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.

  1. Ouvrez Services d’envoi → Ajouter un service → Amazon SES.
  2. 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
  1. Cliquez sur Vérifier et enregistrer. Frontmail appelle GetAccount et indique si le compte est encore dans le sandbox, ainsi que son débit d’envoi maximal et son quota sur 24 heures.
  2. 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.
  3. 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.

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).

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.

SES publie les événements via Amazon SNS. Frontmail s’abonne à votre topic SNS en HTTPS.

  1. SNS → Topics → Create topic (Standard), p. ex. frontmail-events, dans la même région.

  2. 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.

  3. SES → Configuration sets → Create set (p. ex. frontmail) → Event destinations → Add destination → choisissez les types d’événements → destination Amazon SNS → votre topic.

  4. 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.

  • 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é unhealthy et 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 en held_service_error jusqu’à 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 failed et 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, failed et 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.
  • Identité de domaine vérifiée avec Easy DKIM (3 CNAME) dans la région choisie
  • MAIL FROM personnalisé (MX + SPF) et DMARC p=none publié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