Product

Solutions

Resources

Company

Product

Solutions

Resources

Company

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

Oiseau

8 juil. 2020

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 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

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 ».

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 !

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

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

Product

Solutions

Resources

Company

Paramètres de confidentialité

À venir bientôt

Social

Newsletter

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

S'inscrire

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

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

Product

Solutions

Resources

Company

Paramètres de confidentialité

Social

Newsletter

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

S'inscrire