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

Email

1 min read

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

Email

1 min read

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

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 désormais disponible à la fois pour les clients existants de SparkPost et pour les nouveaux clients, même ceux qui n’envoient pas d’emails. Il utilise une analyse puissante basée sur les données de milliards d'événements de rebond, de livraison et d'engagement quotidiennement pour entraîner notre algorithme, vous apportant ainsi l’un des outils de validation d'email les plus puissants du marché basé sur les données, afin que vous puissiez envoyer des emails de manière plus intelligente.

Cet article explique comment tirer le meilleur parti des données que vous recevrez pour chaque destinataire validé – vous verrez que nous classons les adresses comme étant « valides », « risquées », « neutres », « non distribuables » et « typo ». Nous vous fournissons un code « reason » 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, ce qui vous permet d'intégrer la validation directement dans votre flux de travail de saisie d'adresses.

Il y a quelque temps, nous avons conçu 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 de Destinataires fonctionnels dans une dizaine de langues différentes. Nous essayons de couvrir les langues applicables les plus populaires.

La manière courante de travailler à travers tous ces exemples est :

  • Récupérez votre clé à partir de la variable d'environnement SPARKPOST_API_KEY

  • Effectuez un appel API à /api/v1/recipient-validation/single/ pour valider un destinataire

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

  • Imprimez 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" afin que nous puissions a) couvrir plus de langues, b) montrer comment 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

Trusty PHP a plusieurs manières 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 – configurez simplement une requête GET fonctionnelle et utilisez 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'adhérer à 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 autres.

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

Nous déclarons également la structure de l'objet résultats avec des balises de champ, pour nous permettre de « désérialiser » la chaîne retournée JSON. 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# – pour moi, cela ressemble plutôt à Java qu'à C. J'ai pu assembler ceci en suivant les exemples montrés dans la bibliothèque de requêtes System.Net.Http.

Postman peut générer automatiquement du code d'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 InputStreamReaderet 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, dont certains fonctionnent 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 la bibliothèque soit une tâche manuelle. Nous devons télécharger (et compiler) une version récente de Libcurl, en se liant à une bibliothèque OpenSSL - voir le README pour les étapes réelles.

Cela semble être beaucoup de travail comparé aux langages modernes, surtout lorsque Go (ou Lua, ou Python, ou n'importe quel autre) est suffisamment rapide 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 mémoire ! Pour garder l'exemple simple, j'ai préalloué la longueur de la chaîne URL à 1024 caractères, et vérifié la longueur de l'adresse e-mail (en utilisant strlen) avant qu'on y concatène (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.. ce n'est pas une protection ! 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 sur la pile, et calculer précisément la longueur nécessaire 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 auxquels les programmeurs C sont confrontés chaque jour, en essayant d'éviter les débordements de tampon et les effets secondaires inattendus. Ce qui nous amène à ..

Lua

Lua est connu pour sa coexistence aisée avec un ensemble de code C, et ici chez SparkPost, nous avons utilisé Lua de manière intensive pour les personnalisations de Politiques dans notre MTA Momentum sur site. Vous pouvez également l'utiliser comme langage de script autonome, et c’est aussi assez agréable pour cela.

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 effectuons un lien vers 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 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 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 une gestion efficace des données qui pourraient être renvoyées en plusieurs “morceaux”. Comme cet article l'explique :

L’usine 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 bibliothèque table.concat.

Notre exemple se contente de concaténer la table t et de l'imprimer ; 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 il n'est pas basique (à mon avis), mais il est le numéro 6 sur l'indice de langue TIOBE, donc c'est parti.

Il existe d'autres moyens de faire cela, mais le chemin le plus simple vers le succès est d'utiliser le SDK Visual Studio sur une plate-forme Windows. Lancez Visual Studio, démarrez un nouveau projet et sélectionnez Visual Basic, puis choisissez console.app.  Assurez-vous d'utiliser la version VB et non la version C# – il est facile de manquer cela 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.  Le moyen le plus simple de faire cela 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 à 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.

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 !

Rejoignez notre Newsletter.

Restez à jour avec Bird grâce aux mises à jour hebdomadaires dans votre boîte de réception.

En soumettant, vous acceptez que Bird puisse vous contacter au sujet de nos produits et services.

Vous pouvez vous désabonner à tout moment. Consultez la Déclaration de confidentialité de Bird pour plus de détails sur le traitement des données.

Rejoignez notre Newsletter.

Restez à jour avec Bird grâce aux mises à jour hebdomadaires dans votre boîte de réception.

En soumettant, vous acceptez que Bird puisse vous contacter au sujet de nos produits et services.

Vous pouvez vous désabonner à tout moment. Consultez la Déclaration de confidentialité de Bird pour plus de détails sur le traitement des données.

Rejoignez notre Newsletter.

Restez à jour avec Bird grâce aux mises à jour hebdomadaires dans votre boîte de réception.

En soumettant, vous acceptez que Bird puisse vous contacter au sujet de nos produits et services.

Vous pouvez vous désabonner à tout moment. Consultez la Déclaration de confidentialité de Bird pour plus de détails sur le traitement des données.

Pinterest logo
Uber logo
Logo Square
Logo Adobe
Meta logo
logo PayPal

Company

Paramètres de confidentialité

Newsletter

Restez à jour avec Bird grâce aux mises à jour hebdomadaires dans votre boîte de réception.

En soumettant, vous acceptez que Bird puisse vous contacter au sujet de nos produits et services.

Vous pouvez vous désabonner à tout moment. Consultez la Déclaration de confidentialité de Bird pour plus de détails sur le traitement des données.

Uber logo
Logo Square
Logo Adobe
Meta logo

Company

Paramètres de confidentialité

Newsletter

Restez à jour avec Bird grâce aux mises à jour hebdomadaires dans votre boîte de réception.

En soumettant, vous acceptez que Bird puisse vous contacter au sujet de nos produits et services.

Vous pouvez vous désabonner à tout moment. Consultez la Déclaration de confidentialité de Bird pour plus de détails sur le traitement des données.

Uber logo
Logo Adobe
Meta logo

Reach

Grow

Manage

Automate

Resources

Company

Newsletter

Restez à jour avec Bird grâce aux mises à jour hebdomadaires dans votre boîte de réception.

En soumettant, vous acceptez que Bird puisse vous contacter au sujet de nos produits et services.

Vous pouvez vous désabonner à tout moment. Consultez la Déclaration de confidentialité de Bird pour plus de détails sur le traitement des données.