guide · api sendgrid

Comment une équipe produit doit-elle implémenter l’API SendGrid en toute sécurité ?

Implémentez l’API SendGrid derrière un service d’envoi côté serveur, avec un domaine d’envoi authentifié et une clé API limitée à la permission Mail Send. Validez chaque message avant d’appeler `POST /v3/mail/send`, enregistrez votre propre trace d’envoi et récupérez l’en-tête `X-Message-ID` de la réponse. Traitez les payloads signés de l’Event Webhook à partir de leurs octets bruts, dédupliquez les événements et respectez les bounces, les signalements de spam et les désinscriptions. Considérez `202 Accepted`, la livraison au serveur destinataire et l’arrivée en boîte de réception comme des états distincts, avec des nouvelles tentatives bornées pour les seuls échecs transitoires.

Définissez une tâche d’envoi limitée et légitime

L’API Mail Send v3 de SendGrid est un endpoint fournisseur pour l’e-mail sortant, pas une boîte aux lettres utilisateur à usage général. Placez-la derrière un service applicatif de confiance ou un worker de file d’attente et définissez quels événements produit peuvent créer des messages, comme une vérification de compte, un reçu, un avis de sécurité ou une notification demandée. N’exposez pas la clé du fournisseur aux navigateurs, clients mobiles, modèles, prompts ou logs. Séparez, dès le modèle de données, les messages transactionnels des campagnes soumises au consentement, afin que les attentes des destinataires, la gestion des préférences et la réputation puissent être gérées indépendamment. Avant l’implémentation, décidez à qui appartient le domaine d’expéditeur, qui approuve les modèles, quels environnements peuvent envoyer vers l’extérieur et quels destinataires sont autorisés en développement. Ce périmètre devient la frontière des permissions des clés API, de la configuration du domaine, des enregistrements d’audit, des alertes et de la réponse aux incidents. Il rend aussi possible une migration de fournisseur, car le code produit demande une opération e-mail approuvée au lieu de construire des requêtes SendGrid arbitraires partout dans l’application.

Authentifiez un domaine d’envoi dédié

Configurez le Domain Authentication de SendGrid pour un domaine ou un sous-domaine dédié à un usage que vous contrôlez, puis publiez exactement les enregistrements DNS générés pour cette identité et vérifiez-les dans SendGrid. La documentation du fournisseur précise que les sous-domaines n’héritent pas d’une identité parente authentifiée : vérifiez donc le domaine réellement utilisé dans les adresses From. Examinez les enregistrements SPF et DMARC existants avant de modifier le DNS ; ne créez pas de seconde politique SPF pour le même nom d’hôte et ne remplacez pas la politique DMARC existante d’une organisation sans son propriétaire. Gardez le trafic transactionnel et le trafic promotionnel sur des identités choisies à dessein lorsque leurs audiences et leurs risques diffèrent. Vérifiez sur un message de test reçu l’adresse From visible, le return path, le domaine de signature DKIM, le chemin de réponse et le comportement du link branding. L’authentification établit une identité autorisée et des signaux d’alignement, mais ne détermine pas le dossier final chez le destinataire. Continuez à surveiller les bounces, les plaintes, les attentes des destinataires et le contenu une fois la vérification DNS réussie.

Émettez des clés API au moindre privilège par environnement

Créez une clé API Custom Access avec uniquement les permissions dont la charge a besoin, normalement l’accès Mail Send pour un worker d’envoi. Ne donnez pas à un expéditeur courant un Full Access aux modèles, suppressions, coéquipiers, statistiques, à la configuration des IP ou à l’administration du compte. Utilisez des clés distinctes pour le développement, la préproduction et la production, avec des noms qui identifient le service propriétaire et l’objectif de rotation. SendGrid n’affiche une nouvelle clé qu’une seule fois : placez-la directement dans le gestionnaire de secrets de l’environnement et ne la copiez jamais dans le contrôle de version ou un document partagé. À l’exécution, lisez-la depuis une configuration adossée aux secrets et transmettez-la uniquement dans l’en-tête `Authorization: Bearer` via HTTPS. Testez la rotation des clés comme une séquence opérationnelle : créez un remplaçant avec des permissions tout aussi étroites, déployez-le, vérifiez qu’un trafic contrôlé passe, puis révoquez l’ancienne clé. Déclenchez une alerte sur les réponses 401 ou 403 inattendues, car elles peuvent signaler une clé manquante, un identifiant révoqué, une incohérence de permissions ou un changement de configuration risqué.

Construisez et enregistrez chaque requête Mail Send

Créez un enregistrement sortant interne avant de contacter SendGrid. Donnez-lui une clé d’événement applicatif stable, le tenant, l’identité d’expéditeur, les destinataires approuvés, la catégorie de message, la version du modèle et un état. Construisez le payload du fournisseur à partir de cet enregistrement avec `personalizations`, `from`, `subject` et au moins une partie de contenu prise en charge ou un modèle dynamique approuvé. Validez la syntaxe des adresses, le nombre de destinataires, la taille des pièces jointes, les données du modèle et les en-têtes personnalisés avant l’appel réseau. La présentation actuelle de Mail Send de SendGrid limite la taille totale de la requête, pièces jointes comprises, à moins de 30 Mo, et le nombre total de destinataires dans To, Cc et Bcc à 1 000 au maximum. Des requêtes plus petites et ciblées sont plus faciles à auditer et à reprendre. Sur une réponse `202 Accepted`, récupérez l’en-tête `X-Message-ID` et rattachez-le à l’enregistrement sortant. Ne placez pas de données personnelles dans les catégories ou les unique arguments ; SendGrid avertit que ces valeurs peuvent être conservées et consultées en dehors des protections attendues pour le contenu des messages.

Vérifiez et traitez l’Event Webhook

Configurez l’Event Webhook de SendGrid sur un endpoint HTTPS capable de conserver le corps brut de la requête. Activez la signature cryptographique, OAuth 2.0, ou les deux. Pour une livraison signée, vérifiez l’horodatage et `X-Twilio-Email-Event-Webhook-Signature` sur les octets bruts exacts avant d’analyser le JSON ; Twilio avertit que re-sérialiser le payload peut modifier les octets et invalider la vérification. Rejetez les entrées non authentifiées, appliquez une limite raisonnable de taille de requête et empêchez le rejeu selon la politique d’horodatage choisie par l’équipe. Après vérification, mettez en file d’attente ou enregistrez durablement le lot d’événements avant de renvoyer un succès. Dédupliquez avec `sg_event_id`, puis associez `sg_message_id`, le `X-Message-ID` enregistré et une valeur de corrélation interne non sensible. Rendez les transitions d’état monotones, afin qu’un événement processed arrivé en retard ne puisse pas écraser un résultat delivered ou bounce ultérieur. Conservez l’événement d’origine du fournisseur dans un stockage à accès restreint pour le dépannage, mais limitez la conservation des adresses, des textes de réponse et des données d’engagement à ce que le produit et vos règles exigent réellement.

Modélisez précisément l’acceptation, la livraison et le placement

La réponse HTTP `202 Accepted` de SendGrid signifie que la requête a été acceptée et mise en file d’attente pour traitement. Elle n’indique pas que la destination a accepté le message. Un événement webhook `processed` signifie que SendGrid a accepté le message et peut tenter la livraison. Un événement `delivered` signifie que SendGrid rapporte que le serveur de messagerie destinataire l’a accepté, souvent avec une réponse SMTP. Cela n’établit toujours pas l’arrivée en boîte de réception, car le système destinataire peut classer le courrier accepté dans un onglet de la boîte de réception, en quarantaine, dans le dossier des indésirables ou ailleurs. Gardez ces états séparés dans le stockage et les interfaces : demandé, accepté par le fournisseur, traité, différé, accepté par le serveur destinataire, en bounce, abandonné (dropped), plainte ou supprimé. Évitez de traduire chaque réponse HTTP sans erreur par « délivré ». Les signaux d’engagement comme les ouvertures ne prouvent pas non plus la livraison et peuvent être affectés par les fonctions de protection de la vie privée. Des noms d’état précis rendent plus sûrs les investigations du support, les nouvelles tentatives et les décisions de délivrabilité.

Classez les échecs avant de réessayer

Traitez les erreurs du fournisseur par classe plutôt que de réessayer chaque réponse différente de 202. Un 400 nécessite généralement de corriger le payload, l’expéditeur, les données du modèle ou des en-têtes réservés. Un 401 désigne l’authentification ; un 403 peut indiquer une permission insuffisante ou une politique du compte ; un 413 impose de réduire la taille du message. SendGrid documente des en-têtes de limite de débit par endpoint et renvoie 429 lorsque le quota de la période de renouvellement est épuisé : attendez l’heure de réinitialisation et ajoutez du jitter au lieu de créer des nouvelles tentatives synchronisées. Réessayez les erreurs 5xx et les échecs de transport avec un backoff exponentiel, un nombre fini de tentatives et une alerte opérationnelle. Les timeouts ambigus demandent une attention particulière : le fournisseur a pu accepter la requête même si le client n’a pas reçu la réponse. Maintenez l’enregistrement sortant dans un état inconnu, recherchez les événements corrélés et exigez une règle de rapprochement délibérée avant de renvoyer. Les API des fournisseurs ne dispensent pas de prévenir les doublons au niveau du produit. Ne réessayez jamais une destination connue pour un bounce définitif, un destinataire invalide, une désinscription ou un signalement de spam comme s’il s’agissait d’une erreur d’infrastructure transitoire.

Respectez les suppressions et les choix des destinataires

Intégrez les événements bounce, dropped, spam report, unsubscribe et group unsubscribe dans un modèle de sécurité des destinataires. SendGrid prend en charge les suppressions globales et les groupes de désinscription pour différentes catégories de messages. Associez chaque message promotionnel ou facultatif au bon groupe, proposez un parcours de préférences compréhensible et arrêtez les envois lorsque la suppression concernée s’applique. N’utilisez pas les options de contournement des suppressions comme technique de livraison courante. Un message critique pour le produit peut nécessiter une politique juridique et opérationnelle documentée séparément, mais cette politique ne doit pas passer outre en silence au choix promotionnel d’une personne ni à une protection de réputation du fournisseur. Protégez les outils de support qui retirent une suppression par une autorisation forte, une raison visible et une piste d’audit. Suivez séparément les échecs de livraison définitifs et temporaires, et examinez toute réactivation manuelle avant l’envoi suivant. Ces contrôles protègent les destinataires et réduisent les tentatives répétées vers des destinations qui ont déjà rejeté ou refusé le trafic. Ils évitent aussi que l’envoi transactionnel hérite de comportements de campagne risqués.

Testez le cycle de vie complet avant le trafic de production

Commencez avec une clé SendGrid hors production et un sous-domaine authentifié contrôlé. Vérifiez le DNS, puis envoyez des variantes en texte brut et en HTML vers des boîtes de réception appartenant à l’équipe. Confirmez la réponse `202` et le `X-Message-ID`, et vérifiez que les événements webhook signés correspondent à l’enregistrement sortant local. Testez les cas de payload invalide, clé révoquée, permission manquante, pièce jointe trop volumineuse, limite de débit, report, bounce, dropped et événement en double, sans utiliser de vraies adresses clients. Confirmez que la vérification du webhook rejette un corps modifié et que le gestionnaire n’accuse réception qu’après un enregistrement durable. Testez la rotation des clés, le retour arrière d’un modèle, l’application des suppressions et un timeout client ambigu. Ajoutez des tableaux de bord pour les échecs de requête, le retard des événements, les reports, les bounces, les signalements de spam et les échecs de signature des webhooks, avec les identifiants de tenant et de message mais sans identifiants d’accès ni contenu complet. Enfin, relisez la documentation actuelle de SendGrid et les limites du compte au moment du lancement, car les droits liés aux formules, les fonctionnalités régionales, les quotas et les politiques du fournisseur peuvent évoluer indépendamment du code applicatif.

Comparez les dépendances propres au fournisseur

Une intégration SendGrid directe est appropriée lorsqu’une équipe dépend délibérément des champs de requête propres à SendGrid, des modèles, des contrôles de compte, des formats de webhook, des suppressions et de la responsabilité opérationnelle. La documentation publique de SendHQ décrit une API e-mail limitée à l’espace de travail avec l’envoi depuis un domaine vérifié, les e-mails entrants, les modèles hébergés, les événements de livraison, les suppressions et un tableau de bord web. Avant de migrer, examinez les payloads, événements, contrôles d’identité, suppressions, exigences régionales et identifiants de fournisseur stockés des deux fournisseurs.

Questions fréquentes

Un 202 Accepted de SendGrid signifie-t-il que l’e-mail a été délivré ?

Non. Il signifie que SendGrid a accepté la requête API pour traitement. Utilisez les événements de livraison de l’Event Webhook pour savoir si le serveur destinataire a accepté le message, et considérez l’arrivée en boîte de réception comme un résultat distinct que la réponse de l’API n’établit pas.

Quelle permission une clé d’envoi SendGrid doit-elle avoir ?

Utilisez une clé Custom Access limitée à la capacité Mail Send dont le worker a besoin. Évitez le Full Access pour les envois courants, et utilisez des clés distinctes gérées comme secrets pour le développement, la préproduction, la production, l’administration et toute autre charge disposant de droits sensiblement différents.

Comment vérifier la signature d’un Event Webhook SendGrid ?

Conservez le corps HTTP brut exact, lisez les en-têtes de signature et d’horodatage Twilio et vérifiez-les avant toute analyse JSON ou re-sérialisation. Appliquez une protection contre le rejeu, rejetez les vérifications en échec, puis enregistrez durablement ou mettez en file d’attente le lot d’événements avant d’accuser réception.

Un produit doit-il réessayer chaque requête Mail Send en échec ?

Non. Corrigez les erreurs de payload, d’authentification, d’autorisation, de taille et de destinataire définitivement invalide au lieu de les réessayer. Attendez la réinitialisation documentée après une réponse 429, réessayez les échecs réseau transitoires et les 5xx avec un backoff borné, et rapprochez les timeouts ambigus avant de renvoyer.

Peut-on contourner les suppressions SendGrid pour l’e-mail transactionnel ?

SendGrid propose des options de contournement, mais un produit ne devrait pas les utiliser couramment. Séparez les catégories de messages, respectez la désinscription ou la suppression applicable, et exigez une autorisation documentée et un historique d’audit pour toute réactivation exceptionnelle ou décision d’envoi propre à une politique.

Que doit évaluer une équipe avant de comparer SendGrid et SendHQ ?

Comparez les payloads, événements, contrôles d’identité, suppressions, exigences régionales et identifiants de fournisseur stockés avant de planifier une migration.

Sources