Validation des destinataires : Exemples de codes de vérification par e-mail

Oiseau

8 juil. 2020

Email

1 min read

Validation des destinataires : Exemples de codes de vérification par e-mail

Points Clés

    • Validation basée sur les données, pas des suppositions. Bird’s (anciennement SparkPost’s) Recipient Validation utilise des milliards d'événements de livraison et d'engagement réels pour déterminer si une adresse e-mail est valide, risquée, non distribuable ou contient une faute de frappe.

    • Plus intelligent que les vérifications de syntaxe. Contrairement aux outils traditionnels basés sur Regex, ce modèle utilise des données du monde réel pour classer la délivrabilité et suggère même des corrections avec une fonction « did_you_mean ».

    • Intégration en temps réel. Validez les adresses e-mail directement dans vos formulaires d'inscription, CRM, ou listes en vrac via le point de terminaison de l'API /recipient-validation/single/.

    • Exemples pour développeurs avant tout. Des extraits de code fonctionnels sont disponibles dans plusieurs langages de programmation — dont Python, Node.js, PHP, Go, C#, Ruby, Java, Rust, et plus — pour faciliter l'intégration.

    • Meilleures pratiques de sécurité. Les clés d'API doivent toujours être stockées côté serveur (jamais exposées dans le code côté client), en utilisant des variables d'environnement telles que SPARKPOST_API_KEY.

    • Au-delà de la validation. Combinez Recipient Validation avec des consommateurs webhook ou Azure Functions pour construire des workflows de vérification évolutifs et sans serveur pour une utilisation en production.

    • Amélioration continue. Les développeurs sont encouragés à contribuer des exemples dans d'autres langages, garantissant une accessibilité mondiale à travers les écosystèmes.

Points forts des Q&A

  • Qu'est-ce que la Validation de destinataire ?

    C'est le système de validation d'e-mails de Bird alimenté par API qui classe les adresses comme valid, risky, neutral, undeliverable, ou typo, en utilisant des données provenant de milliards d'événements de livraison réels.

  • En quoi cela diffère-t-il de la validation syntaxique de base ?

    Les validateurs traditionnels vérifient uniquement le format ; le système de Bird évalue des données en direct telles que les taux de rejet, les métriques d'engagement et les modèles de délivrabilité pour faire des prédictions plus intelligentes.

  • Quel type d'information l'API retourne-t-elle ?

    Chaque réponse de validation inclut :

    • Classification du statut (valide, risqué, etc.)

    • Code de raison (pourquoi une adresse est signalée)

    • Correction optionnelle "did_you_mean" pour les fautes de frappe

    • Métadonnées comme les tarifs, le pays et les champs de raison de statut

  • Puis-je valider les emails en vrac ?

    Oui. Vous pouvez télécharger des listes entières dans l'application web ou utiliser l'API pour valider des adresses individuelles par programme dans le cadre de votre flux de travail.

  • Quelles sont les langages de programmation supportés ?

    Des exemples de code sont disponibles pour plus d'une douzaine de langages — y compris Python, Node.js, PHP, Go, C#, Java, Rust, et Perl — couvrant à la fois les systèmes modernes et hérités.

  • Où devrais-je stocker ma clé API ?

    Toujours garder côté serveur en utilisant une variable d'environnement comme SPARKPOST_API_KEY. Ne l'intégrez jamais dans des scripts côté client ou du code de navigateur.

  • Cela peut-il être intégré dans des workflows automatisés ?

    Absolument. Vous pouvez utiliser le Flow Builder de Bird ou les Azure Functions pour valider les adresses en temps réel avant de déclencher l'automatisation en aval, telle que les emails de confirmation ou les mises à jour du CRM.

  • Pourquoi les entreprises devraient-elles se soucier de la précision de la validation ?

    Une validation de haute qualité améliore la réputation de l'expéditeur, prévient les rebonds et augmente le ROI de la campagne en s'assurant que chaque message atteint une boîte de réception valide.

  • Quelle est la prochaine étape pour les développeurs ?

    Bird invite les contributions de la communauté pour de nouveaux exemples de langue et des améliorations aux exemples existants, aidant à élargir l'accessibilité à la validation dans le monde entier.

La validation des destinataires SparkPost est maintenant disponible pour les clients existants de SparkPost ainsi que pour les nouveaux clients qui ne font pas d'envoi. Elle utilise une analyse donnée basée sur des milliards d'événements de rebond, de livraison et d'engagement quotidiennement pour entraîner notre algorithme, vous offrant l'un des outils de validation d'e-mails les plus puissants du marché, afin que vous puissiez envoyer des e-mails de manière plus intelligente.

SparkPost Recipient Validation est maintenant disponible à la fois pour les clients existants de SparkPost et pour les nouveaux clients non-expéditeurs. Il utilise une analyse puissante et axée sur les données sur des milliards d'événements de rebond, de livraison et d'engagement quotidiennement pour entraîner notre algorithme, vous offrant l'un des outils de validation des e-mails les plus puissants du marché, afin que vous puissiez envoyer des e-mails plus intelligemment. Cela représente la dernière évolution des techniques de validation des e-mails, allant au-delà des simples vérifications de syntaxe pour des approches sophistiquées basées sur les données qui fournissent des résultats plus précis.

Cet article explique comment vous pouvez tirer le meilleur parti des données que vous recevrez pour chaque destinataire validé – vous verrez que nous classifions les adresses comme "valide", "risqué", "neutre", "non livrable", et "faute de frappe". Nous vous donnons un code de "raison" et également un "did_you_mean" pour les fautes d'adresse connues.

Requêtes API

Dans l'application web SparkPost, vous pouvez glisser-déposer une liste entière pour validation. Vous pouvez également utiliser l'API pour valider des adresses individuelles, afin d'intégrer directement la validation dans votre flux de travail d'entrée d'adresse.

Il y a quelque temps, nous avons créé un outil en ligne de commande Python utilisant cette API. Nous avons discuté de ce que nous devrions faire pour d'autres langues – et nous y voilà ! Commençons.

Ce dossier du dépôt Github contient des exemples d'appels d'API de validation des destinataires fonctionnels dans une douzaine de langues différentes. Nous essayons de couvrir les langues les plus populaires applicables.

La méthode habituelle pour travailler à travers tous ces exemples est :

  • Récupérez votre clé depuis la variable d'environnement SPARKPOST_API_KEY

  • Faites un appel d'API à /api/v1/recipient-validation/single/pour valider un destinataire

  • Recevez en retour une chaîne de réponse, contenant des données formatées en JSON avec le résultat

  • Imprimez le résultat

SparkPost dispose de bibliothèques pour certaines, mais pas toutes les langues couvertes ici. Nous avons choisi d'écrire ces exemples de manière « native » plutôt, afin que nous puissions a) couvrir plus de langues, b) montrer à quel point le code sous-jacent peut être simple, et c) vous permettre de voir clairement les similitudes et les différences entre les langues.

Bash / Curl

Cela remporte le prix pour le code le plus court – il utilise simplement l'outil en ligne de commande "curl" pour effectuer la requête et imprimer la réponse directement sur le terminal. Vous pouvez voir que la sortie est une chaîne, contenant JSON; nous ne analysons pas réellement les attributs individuels du résultat.

Cela remporte le prix pour le code le plus court – il utilise simplement l'outil en ligne de commande "curl" pour effectuer la requête et imprimer la réponse directement sur le terminal. Vous pouvez voir que la sortie est une chaîne, contenant JSON; nous ne analysons pas réellement les attributs individuels du résultat.

Cela remporte le prix pour le code le plus court – il utilise simplement l'outil en ligne de commande "curl" pour effectuer la requête et imprimer la réponse directement sur le terminal. Vous pouvez voir que la sortie est une chaîne, contenant JSON; nous ne analysons pas réellement les attributs individuels du résultat.

PHP

La fiable PHP a plusieurs façons différentes de faire des appels API HTTPS. Ici, nous avons choisi d'utiliser curl_setopt avec curl_exec.

Si vous préférez HTTP_Request2 ou pecl_http, alors Postman dispose d'un générateur de code intégré que vous pouvez utiliser pour créer des exemples similaires – il suffit de configurer une requête GET fonctionnelle et d'utiliser le bouton « Code ».

Postman interface used for API testing, featuring a "Single Address Validation" endpoint with GET parameters, a Headers section showing Authorization and Accept keys, and a highlighted area labeled "Cookies" and "Code" on the right side.

Python

Ceci utilise le module populaire requests, qui est de haut niveau et donc facile à utiliser. Cet exemple vérifie le code d'état renvoyé, convertit le JSON des résultats en un objet dictionnaire Python, et imprime l'objet résultant plutôt qu'une simple chaîne de caractères.

Si vous préférez la bibliothèque intégrée http.client, Postman peut également générer du code pour cela; ce n'est pas beaucoup plus long.

Node.js

Il existe de nombreuses bibliothèques HTTP(S) node.js différentes. J'ai commencé avec l'ancien package request (en utilisant une fonction de rappel) mais il est obsolète et n'est plus maintenu activement.  J'ai choisi le nouveau package axios (utilisant les promises). 

Postman peut également vous fournir un exemple natif en Javascript et Unirest, au cas où vous préférez ceux-là.

Étant donné que ce code nécessite un accès à votre clé API, nous vous recommandons fortement d'appeler notre API depuis votre serveur, jamais depuis le côté client (navigateur / appareil mobile).

Go

Go s'efforce d'avoir une philosophie de « une bonne façon » de faire quelque chose ; dans ce cas, en utilisant les bibliothèques intégrées « batteries incluses » net/http, encoding/json et d'autres.

La longueur est principalement due aux clauses explicites de vérification d'erreur if err != nil {} partout (aucune exception LOL).

Nous déclarons aussi la structure de l'objet de résultats avec des balises de champ, pour nous permettre de « démarshaller » la chaîne de retour JSON. Nous superposons les balises « results » et « errors » pour permettre les deux types de retour.

J'aime la vitesse, la sécurité d'interprétation et la clarté de Go, même si le code est plus long que nos exemples précédents.

C#

Je suis moins familier avec C# – pour moi, cela ressemble plutôt à Java, plutôt qu'à C. J'ai pu assembler cela en suivant les exemples montrés dans la bibliothèque de requêtes System.Net.Http.

Postman peut générer automatiquement du code exemple en utilisant RestSharp, si vous préférez cela.

Ruby

C'était ma première tentative avec du code Ruby ; j'ai utilisé la bibliothèque Net::http, et suivi cet exemple (qui s'avère être très proche du code que Postman auto-génère).

Je suis tombé sur une particularité du langage/bibliothèque qui vaut la peine d'être expliquée. Il ne suffit pas d'utiliser un URI qui commence par "https://", vous devez spécifiquement définir http.use_ssl = true

Sans cela, votre code tentera une requête sur le port 443 – mais sans utiliser SSL/TLS (c’est-à-dire en clair), et SparkPost refusera à juste titre d'autoriser la requête. Ne tentez pas cela à la maison, car votre clé API se trouve dans l'en-tête d'Authorization. Cette particularité du langage/bibliothèque me semblait peu sûre.

Java

Je n'ai pas écrit de Java sérieux auparavant, mais il était facile de reconstituer cela en suivant l'approche générale utilisée dans la bibliothèque SparkPost pour d'autres appels GET.

Incidemment, utiliser VS Code comme mon éditeur / débogueur a vraiment bien fonctionné pour toutes les langues ici, me donnant la mise en surbrillance de la syntaxe, le pas à pas du débogueur / la visualisation des variables, etc. The InputStreamReader et BufferedReaderconstructs sont similaires à (et je suppose ont été copiés par) Go.

C / C++

C'était un voyage dans le passé, car j'ai écrit beaucoup de code C dans les années 1990, certains fonctionnant encore profondément dans les réseaux de télécommunications quelque part. Comme l'histoire du C précède le Web moderne, il n'est pas surprenant que le support de bibliothèque soit une tâche manuelle. Nous devons télécharger (et compiler) une version récente de Libcurl, en lien avec une bibliothèque OpenSSL – voir le README pour les étapes réelles.

Cela semble être beaucoup de travail comparé aux langages modernes, en particulier lorsque Go (ou Lua, ou Python, ou tout autre) sont assez rapides pour des tâches comme celle-ci.

L'autre chose que j'avais oubliée, malgré les cicatrices des batailles précédentes, c'est la frayeur de l'allocation de mémoire ! Pour garder l'exemple simple, j'ai préalloué la longueur de chaîne URL à 1024 caractères et vérifié la longueur de l'adresse e-mail (en utilisant strlen) avant de la concaténer (en utilisant strcat).

Nous traitons la chaîne Authorization avec une clé API concaténée de la même manière... même si nous savons qu'une clé API valide ne sera jamais trop longue... ça ne protège pas ! Les entrées utilisateur provenant d'une variable d'environnement pourraient être n'importe quoi. Vous devez programmer de manière défensive.

Un développeur plus sophistiqué pourrait utiliser malloc au lieu de l'allocation de variables de pile et calculer la longueur requise des chaînes jointes. Devoir penser à cette complexité supplémentaire m'a donné une douleur dans les diodes du côté gauche; cela m'a rappelé les risques que courent les programmeurs C chaque jour, en essayant d'éviter les dépassements de tampon et les effets secondaires inattendus. Ce qui nous amène à...

Lua

Lua est connu pour sa facilité de coexistence aux côtés d'un ensemble de code C, et ici chez SparkPost, nous avons utilisé Lua de manière intensive pour les personnalisations de Policy à l'intérieur de notre MTA Momentum sur site. Vous pouvez aussi l'utiliser comme un langage de script autonome, et c'est plutôt agréable pour ça aussi.

Avec Lua 5.3 et le gestionnaire de packages luarocks, nous utilisons les bibliothèques luasocket et luasec. Montrant son héritage d'intégration C, nous nous connectons à notre bibliothèque OpenSSL locale. Le processus d'installation de luarocks appelle le compilateur gcc (ou tout autre compilateur C que vous utilisez), donc ajouter de nouvelles bibliothèques prend un certain temps.

Le code Lua est assez simple. Les caractères — marquent les commentaires.  La fonction https.request fournit plusieurs valeurs de retour (un peu comme Python et Go). La concaténation de chaînes est effectuée avec l'opérateur  .. (au lieu de + en Python).

Le corps de réponse de cet appel est géré avec le module ‘ltn12’ – voir la page wiki Lua sur les Filtres, Sources et Sinks. Cela permet une gestion efficace des données qui pourraient être retournées en plusieurs « morceaux ». Comme cet article l'explique :

La fabrique de table crée un sink qui stocke toutes les données obtenues dans une table. Les données peuvent ensuite être concaténées efficacement en une seule chaîne avec la fonction de bibliothèque table.concat.

Notre exemple concatène simplement la table t et l'affiche ; vous pourriez utiliser un filtre pour effectuer un traitement plus poussé.

Perl

Bien que Perl soit célèbre pour ses one liners, ce n'en est pas un.  Perl a été conçu pour des recherches et modifications de documents très rapides, mais est en fait capable de bien plus.  J'ai une fois écrit un ensemble complet de contrôle d'Inventaire en Perl.  Va comprendre.   E n f i n...

Ce script utilise LWP::UserAgent et HTTP::Request et éventuellement les packages JSON et Data::Dumper selon la façon dont vous souhaitez voir le résultat. Comme pour tous les autres scripts de cette page, vous devez pré-établir une variable d'environnement SPARKPOST_API_KEY à votre clé API générée qui inclut la fonction de Validation des Destinataires. Ce script code en dur $recipient = ‘test@gmail.com’ mais vous pouvez facilement ajouter une entrée en ligne de commande ou consommer à partir d'un fichier.

Après que toutes les variables soient peuplées, nous chargeons un HTTP:Request avec des paramètres GET et l'envoyons à LWP:UserAgent.  Le « message » résultant est le résultat du test de validation d'email sous forme de tableau.  Vous pouvez utiliser JSON et DUMPER pour afficher le résultat ou simplement transmettre le tableau pour un traitement supplémentaire.

VB.net

Visual Basic n'est pas visuel et il n'est pas basique (IMHO), mais il est #6 sur l'index des langages TIOBE, alors allons-y.

Il existe d'autres façons de faire cela, mais le chemin le plus facile vers le succès est d'utiliser le SDK de Visual Studio sur une plateforme Windows. Lancez Visual Studio, démarrez un nouveau projet et sélectionnez Visual Basic, puis sélectionnez console.app.  Assurez-vous d'utiliser la version VB, pas la version C# – il est facile de manquer cela dans le SDK.

Visual Studio interface for creating a new project, highlighting options such as Console App (.NET Core) and ASP.NET Web Application, with sections for selecting the language, platform, and project type.


À ce stade, vous pouvez éditer les lignes manuellement ou copier/coller le code d'ici dans VS et gagner beaucoup de temps. Pour faire fonctionner ce code, vous devez ajouter une variable d'environnement Windows.  La façon la plus simple de le faire est d'ouvrir une invite de commande et d'utiliser setx.exe comme ceci: 

C:\Users\me>setx SPARKPOST_API_KEY  "142<redacted<redacted>c531c3"

Dans Windows 10, cela s'applique à l'environnement utilisateur, mais n'est pas immédiatement disponible dans la session de commande actuelle, donc le tester avec un "set" ne fonctionnera pas, mais il sera disponible pour le code. Si vous construisez et exécutez le code inclus dans le dépôt, vous verrez le résultat de la validation. Pour les développeurs construisant des consommateurs de webhook en production qui doivent valider des adresses e-mail à grande échelle, notre guide de consommateur de webhook Azure Functions montre comment construire des solutions serverless qui peuvent gérer efficacement les flux de validation.

Rouille

Rust est un langage de programmation pour les systèmes et les services Web qui est axé sur la performance, la sécurité et la concurrence. Comme le dit Wikipedia, Rust est le « langage de programmation le plus apprécié » dans le sondage des développeurs de Stack Overflow depuis 2016.

Le code Rust dans notre dépôt Github utilise la bibliothèque reqwest avec tokio asynchrone, similaire à l'exemple dans le Rust Cookbook. (Ce n'est pas une faute de frappe, le nom de la bibliothèque reqwest s'écrit ainsi). Nous avons inclus un fichier de configuration du gestionnaire de paquets cargo , afin que vous puissiez construire et exécuter avec :

cd rust_recipient_validation cargo run

Cela compilera le package en code exécutable, et l'exécutera :

Finished dev [unoptimized + debuginfo] target(s) in 0.10s
Running `target/debug/rust_recipient_validation`
Status: 200 OK
Body: : (etc)

Le code utilise std:env pour lire la variable d'environnement SPARKPOST_API_KEY. Une clause match gère le cas où la clé n'est pas définie. Si tout va bien, un nouveau reqwest::Client est créé et un appel asynchrone est émis, suivi d'un .await? (voir la documentation reqwest). Async, plutôt que l'appel de blocage plus simple, semble être nécessaire pour définir les en-têtes de requête. Le texte du corps de la réponse est lu avec un second .await?, comme dans cet exemple.

Résumé

Dans cet article, nous avons parcouru des exemples de code de validation de destinataire dans de nombreuses langues. Voici notre demande pour vous.

Faites-nous savoir si vous pensez que nous avons oublié votre langue préférée. Nous n'avons peut-être pas autant d'exemples que The Fibonacci Project, mais nous aimerions en ajouter d'autres. Aussi, si vous pensez que nos exemples peuvent être améliorés, faites-le nous savoir !

Autres news

Lire la suite de cette catégorie

A person is standing at a desk while typing on a laptop.

La plateforme native AI complète qui évolue avec votre business.

A person is standing at a desk while typing on a laptop.

La plateforme native AI complète qui évolue avec votre business.