
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 destinataireRecevez 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
PHP
Le PHP fiable a quelques façons différentes de faire des appels d'API HTTPS. Ici, nous avons choisi d'utiliser curl_setopt
et curl_exec
. (https://www.php.net/manual/en/function.curl-exec.php)
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 ».

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 BufferedReader
constructs 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 coexistence facile avec un corpus de code C, et ici chez SparkPost, nous utilisons Lua de manière intensive pour les personnalisations de Policy à l'intérieur de notre MTA Momentum sur site. Vous pouvez également 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 paquets luarocks, nous utilisons les bibliothèques luasocket
et luasec
. Montrant son héritage d'intégration C, nous nous lions à notre bibliothèque OpenSSL locale. Le processus d'installation de luarocks appelle le compilateur gcc
(ou tout autre compilateur C que vous utilisez), donc l'ajout 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 en Python et Go). La concaténation de chaînes se fait avec l'opérateur .. (au lieu de + en Python).
Le corps de la réponse de cet appel est géré avec le module “ltn12” – voir ici. Cela permet une gestion efficace des données qui pourraient être renvoyées en plusieurs “morceaux”. Comme expliqué dans cet article :
La fabrique de tables crée un récepteur qui stocke toutes les données obtenues dans une table. Les données peuvent ensuite être efficacement concaténées en une seule chaîne avec la fonction de bibliothèque table.concat.
Notre exemple concatène simplement le tableau t et l'affiche ; vous pourriez utiliser un filtre pour effectuer un traitement supplémentaire.
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 ce n'est pas basique (à mon humble avis), mais c'est le numéro 6 sur le TIOBE language index alors allons-y.
Il existe d'autres façons de le faire, mais le chemin le plus simple 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 et non la version C# – il est facile de la manquer dans le SDK.

À ce stade, vous pouvez modifier les lignes manuellement ou copier/coller le code d'ici dans VS et gagner beaucoup de temps. Pour que ce code fonctionne, vous devez ajouter une variable d'environnement Windows. La manière la plus simple de le faire est d'ouvrir une invite de commande et d'utiliser setx.exe ainsi :
C:\Users\me>setx SPARKPOST_API_KEY "142<redacted<redacted>c531c3"
Dans Windows 10, cela s'applique à votre 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 ont besoin de valider des adresses email à grande échelle, notre guide du consommateur de webhook Azure Functions montre comment construire des solutions sans serveur qui peuvent gérer efficacement les flux de travail 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 a été le « langage de programmation le plus apprécié » dans l'enquête des développeurs de Stack Overflow depuis 2016.
Le code Rust dans notre dépôt Github utilise la bibliothèque reqwest
avec tokio
async, similaire à cet exemple du livre de recettes Rust. (Ce n’est pas une faute de frappe, le nom de la bibliothèque reqwest
est écrit ainsi). Nous avons inclus un fichier de configuration du gestionnaire de paquets cargo, vous pouvez donc construire et exécuter avec :
cd rust_recipient_validation cargo run
Cela compilera le package en un code exécutable et l'exécutera :
Fin du développement [non optimisé + debuginfo] cible(s) en 0,10s Exécution de `target/debug/rust_recipient_validation` Statut : 200 OK Corps : : (etc)
Le code utilise std:env
pour lire la variable d'environnement SPARKPOST_API_KEY
. Une clause correspondante 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 async est émis, suivi d'un .await?
(voir ici). Async, plutôt que l'appel bloquant plus simple, semble être nécessaire pour définir les en-têtes de requêtes. Le texte du corps de la réponse est lu avec un deuxième .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 !