SparkPost Validation des destinataires est maintenant disponible à la fois pour les clients SparkPost existants et pour les nouveaux clients non expéditeurs. Il utilise une analyse puissante basée sur des données sur des milliards d'événements de rebond, de livraison et d'engagement quotidien pour entraîner notre algorithme, vous apportant l'un des outils de validation d'email basés sur des données parmi les plus puissants du marché, afin que vous puissiez envoyer des emails de manière plus intelligente.
Cet article explique comment vous pouvez tirer le meilleur parti des données que vous recevrez sur chaque destinataire validé – vous verrez que nous classifions les adresses comme « valides », « à risque », « neutres », « non livrables » et « faute de frappe ». Nous vous fournissons un code « raison » et également un « vous vouliez dire » pour les fautes de frappe d'adresses connues.
Requêtes API
Dans l'application web SparkPost, vous pouvez faire glisser et déposer une liste entière pour validation. Vous pouvez également utiliser l'API pour valider des adresses uniques, afin que vous puissiez intégrer la validation directement dans votre flux de travail d'entrée d'adresse.
Il y a quelque temps, nous avons conçu un outil de ligne de commande Python utilisant cette API. Nous avons discuté de ce que nous devrions faire pour d'autres langages – et nous y voilà ! Commençons.
Ce dossier de dépôt Github contient des exemples d'appels API de validation des destinataires dans environ une douzaine de langages différents. Nous essayons de couvrir les langages applicables les plus populaires.
La méthode courante pour travailler à travers tous ces exemples est la suivante :
Récupérez votre clé depuis la variable d'environnement
SPARKPOST_API_KEY
Faites un appel API à
/api/v1/recipient-validation/single/
pour valider un destinataireRecevez une chaîne de réponse contenant des données formatées en JSON avec le résultat
Affichez le résultat
SparkPost dispose de bibliothèques pour certaines, mais pas toutes les langues couvertes ici. Nous avons choisi d'écrire ces exemples en « natif » à la place, afin de pouvoir a) couvrir plus de langages, 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 langages.
Bash / Curl
Cela remporte le prix du code le plus court – il utilise simplement l'outil en ligne de commande « curl » pour faire la demande et imprimer la réponse directement dans le terminal. Vous pouvez voir que la sortie est une chaîne contenant du JSON ; nous ne analysons pas réellement les attributs de résultat individuels.
PHP
Le PHP de confiance a plusieurs façons 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 a 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
Cela utilise le populaire module requests, qui est de haut niveau et donc facile à utiliser. Cet exemple vérifie le code d'état renvoyé, convertit les résultats JSON en 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 é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 paquet request (en utilisant une fonction de rappel) mais il est obsolète et n'est plus activement maintenu. J'ai choisi le nouveau paquet axios (en utilisant des promesses).
Postman peut également vous donner un exemple natif en Javascript et Unirest, au cas où vous préfériez ceux-ci.
Parce que ce code a besoin d'accéder à votre clé API, nous recommandons fortement d'appeler notre API depuis votre serveur, jamais du côté client (navigateur / appareil mobile).
Go
Go vise une philosophie de « une bonne façon » de faire quelque chose ; dans ce cas, en utilisant les bibliothèques « batteries incluses » intégrées net/http, encoding/json et d'autres.
La longueur est surtout due aux clauses explicites de vérification des erreurs if err != nil {}
partout (pas d'exceptions LOL).
Nous déclarons également la structure de l'objet résultats avec des balises de champ, afin de nous permettre de « désérialiser » la chaîne JSON renvoyée. Nous superposons les balises « résultats » et « erreurs » pour permettre les deux types de retour.
J'aime la rapidité, la sécurité de type 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# – cela ressemble beaucoup à Java, plutôt qu'à C. J'ai pu assembler cela en suivant des exemples montrés dans la bibliothèque de requêtes System.Net.Http.
Postman peut auto-générer un code d'exemple en utilisant RestSharp, si vous préférez cela.
Ruby
C'était ma première tentative avec le code Ruby ; j'ai utilisé la bibliothèque Net::http, et suivi cet exemple (qui s'avère très proche du code que Postman auto-génère).
J'ai rencontré une étrangeté de langage / bibliothèque qui vaut la peine d'être expliquée. Il ne suffit pas de configurer une URI qui commence par « https:// », vous devez spécifiquement définir http.use_ssl = true
.
Sans cela, votre code tentera une demande sur le port 443 – mais sans utiliser SSL/TLS (c'est-à-dire en clair), et SparkPost refusera à juste titre d'autoriser la demande. Ne tentez pas cela chez vous, car votre clé API est dans l'en-tête Authorization. Cette fonctionnalité de langage / bibliothèque m'a semblé peu sûre.
Java
Je n'ai pas écrit de Java sérieux auparavant, mais il a été facile d'assembler 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 mon éditeur / débogueur a très bien fonctionné pour tous les langages ici, me donnant une coloration syntaxique, un pas à pas du débogueur / visualisation des variables, etc. The InputStreamReader
et BufferedReader
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, dont certains fonctionnent encore profondément dans des réseaux de télécommunications quelque part. Comme l'histoire du C prédáté 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 la liant à une bibliothèque OpenSSL – consultez le README pour les étapes réelles.
Cela semble représenter beaucoup de travail par rapport aux langages modernes, particulièrement lorsque Go (ou Lua, ou Python, ou n'importe lequel des autres) 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, est la peur de l'allocation de mémoire ! Pour garder l'exemple simple, j'ai préalloué la longueur de chaîne d'URL à 1024 caractères et vérifié la longueur de l'adresse e-mail (en utilisant strlen
) avant de concaténer dedans (en utilisant strcat
).
Nous traitons la chaîne d'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 ... cela n'offre aucune protection ! L'entrée utilisateur venant d'une variable d'environnement pourrait ê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 de pile, et calculer exactement combien de temps les chaînes jointes doivent être. Être obligé de penser à cette complexité supplémentaire m'a donné une douleur dans les diodes du côté gauche; cela me rappelait les risques auxquels les programmeurs C courent chaque jour, essayant d'éviter les débordements de tampon et les effets secondaires inattendus. Ce qui nous amène à ..
Lua
Lua est connue pour sa coexistence facile avec un ensemble de code C, et ici chez SparkPost, nous utilisons Lua largement pour des personnalisations de politique au sein 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 cela 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 lier à 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 l'ajout de nouvelles bibliothèques prend un certain temps.
Le code Lua est assez simple. Les caractères — marquent des commentaires. La fonction https.request
fournit multiple valeurs de retour (un peu comme Python et Go). La concaténation de chaînes se fait 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 ici. Cela permet de gérer efficacement les données qui pourraient être renvoyées en plusieurs « morceaux ». Comme cet article l'explique :
Le générateur de table crée un puits 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 ne fait que concaténer la table t et l'afficher ; vous pourriez utiliser un filtre pour effectuer un traitement supplémentaire.
Perl
Bien que Perl soit célèbre pour ses lignes uniques, ceci n'est pas l'un d'eux. Perl a été conçu pour une recherche et une modification de documents très rapides, mais est en réalité capable de beaucoup plus. J'ai une fois écrit toute une suite de contrôle d'inventaire en Perl. Allez comprendre. N' importe quoi...
Ce script utilise LWP::UserAgent et HTTP::Request et éventuellement les packages JSON et Data::Dumper selon comment vous voulez voir la sortie. Comme avec tous les autres scripts de cette page, vous devez pré-configurer une variable d'environnement SPARKPOST_API_KEY
avec votre clé API générée qui inclut la fonction de validation des destinataires. Ce script oblige à coder $recipient = ‘test@gmail.com’ mais vous pouvez facilement ajouter une entrée de ligne de commande ou consommer à partir d'un fichier.
Après que toutes les variables soient peuplées, nous chargeons une requête HTTP:Request avec les 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 basique (selon moi), mais il est au numéro 6 de l'indice de langue TIOBE donc allons-y.
Il existe d'autres manières de le faire, 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 et non la version C# – il est facile de le manquer 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 faire fonctionner ce code, vous devez ajouter une variable d'environnement Windows. Le moyen le 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<masqué<masqué>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.
Rust
Rust est un langage pour la programmation système 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 aimé » dans l'enquête des développeurs 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 cuisine Rust. (Ce n'est pas une faute de frappe, le nom de bibliothèque reqwest
est écrit de cette façon). 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 paquet en code exécutable et l'exécutera :
Achèvement dev [non optimisé + informations de débogage] 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 match 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 é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 demande. Le texte du corps de la réponse est lu avec un second .await?
, comme le montre cet exemple.
Résumé
Dans cet article, nous avons parcouru des exemples de code de validation des destinataires dans de nombreux langages. Voici notre demande à vous.
Faites-nous savoir si vous pensez que nous avons manqué votre langage préféré. Nous n'avons peut-être pas autant d'exemples que Le Projet Fibonacci, mais nous aimerions en ajouter quelques autres. De plus, si vous pensez que nos exemples peuvent être améliorés, faites-le nous savoir !