
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 la validation. Vous pouvez également utiliser l'API pour valider des adresses individuelles, afin de pouvoir intégrer la validation directement dans votre flux de travail d'entrée d'adresse.
Il y a quelque temps, nous avons créé un outil de ligne de commande Python utilisant cette API. Nous avons discuté de ce que nous devrions faire pour d'autres langues – et nous y voici ! Commençons.
Ce dossier de répertoire Github contient des exemples d'appels API de Validation de Destinataires fonctionnels dans une douzaine de langues différentes. Nous essayons de couvrir les langues les plus populaires et applicables.
La manière courante de travailler à travers tous ces exemples est :
Récupérer votre clé à partir de la variable d'environnement
SPARKPOST_API_KEY
Faire un appel API à
/api/v1/recipient-validation/single/
pour valider un destinataireRecevoir en retour une chaîne de réponse, contenant les données formatées en JSON avec le résultat
Imprimer le résultat
SparkPost a des bibliothèques pour certaines, mais pas toutes les langues couvertes ici. Nous avons choisi d'écrire ces exemples de manière "native" à la place, afin de pouvoir 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 fiable PHP a plusieurs façons différentes de faire des appels 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 de travail et d'utiliser le bouton "Code".

Python
Cela utilise le module populaire requests, qui est de haut niveau et donc facile à utiliser. Cet exemple vérifie le code d'état retourné, convertit le JSON des résultats en un objet dictionnaire Python, et imprime l'objet résultant plutôt qu'une simple chaîne.
Si vous préférez la bibliothèque intégrée http.client, Postman peut aussi générer du code pour cela ; ce n’est pas beaucoup plus long.
Node.js
Il y a beaucoup de bibliothèques HTTP(S) node.js différentes. J'ai commencé avec le plus 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 (en utilisant des promesses).
Postman peut également vous fournir un exemple natif en Javascript et Unirest, au cas où vous préféreriez ceux-ci.
Parce que ce code nécessite l'accès à votre clé API, nous recommandons fortement d'appeler notre API depuis votre côté 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 de code Ruby ; j'ai utilisé la bibliothèque Net::http et j'ai suivi cet exemple (qui s'avère être très proche du code que Postman génère automatiquement).
J'ai rencontré une particularité de langue / bibliothèque qui mérite une explication. 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 légitimement d'autoriser la requête. Ne tentez pas cela à la maison, car votre clé API se trouve dans l'en-tête Authorization. Cette fonctionnalité de langue / bibliothèque me semblait peu sûre.
Java
Je n'ai jamais écrit de Java sérieusement auparavant, mais il a été facile de rassembler cela en suivant l'approche générale utilisée dans la bibliothèque SparkPost pour d'autres appels GET.
Incidemment, l'utilisation de VS Code comme éditeur / débogueur a très bien fonctionné pour toutes les langues ici, me offrant la coloration syntaxique, le suivi du débogueur / visualisation des variables, etc. The InputStreamReader
et BufferedReader
les constructions sont similaires à (et je suppose ont été copiées 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 fonctionnent toujours profondément dans les réseaux télécoms quelque part. Comme l'histoire de C précède le Web moderne, il n'est pas surprenant que la prise en charge de la bibliothèque soit une tâche manuelle. Nous devons télécharger (et compiler) une version récente de Libcurl, en liant à une bibliothèque OpenSSL – voir le README pour les étapes réelles.
Cela semble beaucoup de travail par rapport aux langages modernes, en particulier lorsque Go (ou Lua, ou Python, ou n'importe lequel des autres) sont suffisamment 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 peur de l'allocation de mémoire ! Pour garder l'exemple simple, j'ai préalloué la longueur de la chaîne URL à 1024 caractères, et j'ai vérifié les limites de la longueur de l'adresse e-mail (en utilisant strlen
) avant d'y concaténer (en utilisant strcat
).
Nous traitons la chaîne d'autorisation 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 .. cela ne protège pas ! Les saisies utilisateur provenant d'une variable d'environnement peuvent ê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 variable sur la pile, et calculer précisément combien de temps les chaînes jointes doivent être. Devoir penser à cette complexité supplémentaire m'a donné une douleur dans les diodes du côté gauche; cela m'a rappelé les risques auxquels les programmeurs C sont confrontés chaque jour, 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é à coexister avec un corps de code C, et ici chez SparkPost, nous used Lua extensively pour les personnalisations de la politique à l'intérieur de notre MTA Momentum sur site. Vous pouvez également l'utiliser comme un langage de script autonome, et c'est également assez agréable pour cela.
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 attachons à notre bibliothèque OpenSSL locale. Le processus d'installation de luarocks appelle le compilateur gcc
(ou quel que soit le compilateur C que vous utilisez), donc ajouter de nouvelles bibliothèques prend du temps.
Le code Lua est très simple. Les caractères – marquent les commentaires. La fonction https.request
fournit multiple return values (un peu comme Python et Go). La concaténation de chaînes est effectuée avec l'operator .. (au lieu de + en Python).
Le corps de la réponse de cet appel est géré avec le module “ltn12” – voir here. Cela permet un traitement efficace des données qui peuvent être renvoyées en plusieurs “morceaux”. Comme l'explique cet article :
La fabrique de tables crée un puits 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 la table t et l'imprime; vous pourriez utiliser un filtre pour effectuer plus de traitement.
Perl
Alors que Perl est célèbre pour ses one liners, ce n'en est pas un. Perl a été conçu pour une recherche et une modification de documents très rapides, mais est en réalité capable de bien plus. J'ai une fois écrit un ensemble complet de contrôle d'inventaire en Perl. Allez comprendre. E n t o u t c a s…
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 avec tous les autres scripts de cette page, vous devez pré-définir une variable d'environnement SPARKPOST_API_KEY
à votre clé API générée incluant la fonction de validation des destinataires. Ce script code en dur $recipient = ‘test@gmail.com’ mais vous pouvez facilement ajouter une entrée de ligne de commande ou consommer depuis un fichier.
Après avoir rempli toutes les variables, nous chargeons une HTTP:Request avec des paramètres GET et l'envoyons à LWP:UserAgent. Le « message » résultant est le résultat du test de validation de l'email sous forme de tableau. Vous pouvez utiliser JSON et DUMPER pour afficher le résultat ou simplement passer le tableau pour un traitement supplémentaire.
VB.net
Visual Basic n'est pas visuel et ce n'est pas basic (AMHA), mais c'est le n°6 sur le TIOBE language index alors c'est parti.
Il y a d'autres façons de faire cela, 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 ne pas le remarquer dans le SDK.

À ce stade, vous pouvez éditer 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. Le moyen le plus simple de le faire est d'ouvrir une invite de commandes et d'utiliser setx.exe comme ceci :
C:\Users\me>setx SPARKPOST_API_KEY "142<redacted<redacted>c531c3"
Dans Windows 10, ceci est appliqué à votre environnement utilisateur, mais n'est pas immédiatement disponible dans la session de commande en cours, donc le tester avec un "set" ne fonctionnera pas, mais il sera disponible pour le code. Si vous compilez 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 webhook de production qui doivent valider des adresses email à grande échelle, notre guide du consommateur webhook Azure Functions montre comment construire des solutions sans serveur 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 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 code exécutable et l'exécutera :
Compilation terminée [non optimisé + debuginfo] cible(s) en 0.10s Exécution `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 de correspondance gère le cas où la clé est indéfinie. Si tout va bien, un nouveau reqwest::Client
est créé et un appel async est lancé, suivi d'un .await?
(voir ici). Async, plutôt qu'un 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 omis votre langue préférée. Nous n'avons peut-être pas autant d'exemples que The Fibonacci Project, mais nous serions ravis d'en ajouter d'autres. De plus, si vous pensez que nos exemples peuvent être améliorés, faites-le nous savoir !