
SparkPost Empfänger-Validierung ist jetzt sowohl für bestehende SparkPost-Kunden als auch für neue, nicht sendende Kunden verfügbar. Es nutzt leistungsstarke datengetriebene Analysen von Milliarden von Bounce-, Zustell- und Interaktionsereignissen täglich, um unseren Algorithmus zu trainieren und Ihnen eines der leistungsstärksten datengetriebenen E-Mail-Validierungstools auf dem Markt zu bieten, damit Sie E-Mails intelligenter senden können.
SparkPost Recipient Validation ist jetzt sowohl für bestehende SparkPost-Kunden als auch für neue, nicht sendende Kunden verfügbar. Es verwendet leistungsstarke, datengesteuerte Analysen von Milliarden von Bounce-, Zustellungs- und Engagement-Ereignissen täglich, um unseren Algorithmus zu trainieren, und bietet Ihnen eines der leistungsstärksten datengesteuerten E-Mail-Validierungswerkzeuge auf dem Markt, damit Sie E-Mails intelligenter versenden können. Dies stellt die neueste Entwicklung in Techniken der E-Mail-Validierung dar, die über einfache Syntaxprüfungen hinausgehen und anspruchsvolle datengesteuerte Ansätze nutzen, die genauere Ergebnisse liefern.
Dieser Artikel erklärt, wie Sie das Beste aus den Daten herausholen können, die Sie zu jedem validierten Empfänger zurückerhalten – Sie werden sehen, dass wir Adressen als „gültig“, „riskant“, „neutral“, „unzustellbar“ und „Tippfehler“ klassifizieren. Wir geben Ihnen einen „Grund“-Code und auch eine „meinten_sie“ für bekannte Adress-Tippfehler.
API-Anfragen
In der SparkPost-Web-App können Sie eine gesamte Liste zur Validierung per Drag & Drop einfügen. Sie können auch die API verwenden, um einzelne Adressen zu validieren, sodass Sie die Validierung direkt in Ihren Adresseneingabeworkflow integrieren können.
Vor einiger Zeit haben wir ein Python-Befehlszeilen-Tool mit dieser API entwickelt. Wir haben darüber gesprochen, was wir für andere Sprachen tun sollten – und hier sind wir! Lassen Sie uns beginnen.
Diesen Github-Repository-Ordner enthält funktionierende Beispiele für Aufrufe der Recipient Validation API in etwa einem Dutzend verschiedener Sprachen. Wir versuchen, die beliebtesten anwendbaren Sprachen abzudecken.
Der übliche Weg, um all diese Beispiele durchzuarbeiten, ist:
Nehmen Sie Ihren Schlüssel aus der Umgebungsvariable
SPARKPOST_API_KEY
Führen Sie einen API-Aufruf an
/api/v1/recipient-validation/single/
durch, um einen Empfänger zu validierenErhalten Sie eine Antwortzeichenkette zurück, die JSON-formatierte Daten mit dem Ergebnis enthält
Drucken Sie das Ergebnis aus
SparkPost hat Bibliotheken für einige, aber nicht alle hier abgedeckten Sprachen. Wir haben uns entschieden, diese Beispiele stattdessen „nativ“ zu schreiben, um a) mehr Sprachen abzudecken, b) zu zeigen, wie einfach der zugrunde liegende Code sein kann, und c) Ihnen die Möglichkeit zu geben, die Ähnlichkeiten und Unterschiede zwischen den Sprachen klar zu erkennen.
Bash / Curl
PHP
Vertrauenswürdiges PHP hat einige verschiedene Methoden, um HTTPS API-Aufrufe zu machen. Hier haben wir uns entschieden, curl_setopt
und curl_exec
zu verwenden. (https://www.php.net/manual/en/function.curl-exec.php)
Wenn Sie HTTP_Request2 oder pecl_http bevorzugen, dann hat Postman einen integrierten Code-Generator, den Sie verwenden können, um ähnliche Beispiele zu erstellen – richten Sie einfach eine funktionierende GET-Anfrage ein und verwenden Sie die „Code“-Schaltfläche.

Python
Dies verwendet das beliebte requests-Modul, das high-level ist und daher einfach zu verwenden. Dieses Beispiel überprüft den zurückgegebenen Statuscode, wandelt das Ergebnisse-JSON zurück in ein Python-Dictionary-Objekt um und gibt das resultierende Objekt aus, anstatt nur einen String auszugeben.
Falls Sie die eingebaute http.client-Bibliothek bevorzugen, kann Postman auch dafür Code generieren; es ist nicht viel länger.
Node.js
Es gibt viele verschiedene node.js HTTP(S)-Bibliotheken. Ich begann mit dem älteren request-Paket (unter Verwendung einer Callback-Funktion), aber es ist veraltet und wird nicht mehr aktiv gewartet. Ich habe das neuere axios-Paket (unter Verwendung von promises) gewählt.
Postman kann Ihnen auch ein native Javascript-Beispiel geben und Unirest, falls Sie diese bevorzugen.
Da dieser Code Zugriff auf Ihren API-Schlüssel benötigt, empfehlen wir dringend, unsere API von Ihrer Serverseite aus aufzurufen, niemals von der Clientseite (Browser / Mobilgerät).
Go
Go strebt nach einer Philosophie von „ein guter Weg“, um etwas zu tun; in diesem Fall unter Verwendung der integrierten „Batteries included“ Bibliotheken net/http, encoding/json und andere.
Die Länge ist hauptsächlich auf die expliziten Fehlerüberprüfungsanweisungen if err != nil {}
überall zurückzuführen (keine Ausnahmen LOL).
Wir deklarieren auch die Struktur des Ergebnisse-Objekts mit Feldtags, um uns das „Unmarshaling“ des zurückgegebenen JSON-Strings zu ermöglichen. Wir überlagern die „results“ und „errors“ Tags, um beide Arten der Rückgabe zu ermöglichen.
Ich mag die Geschwindigkeit, die Typsicherheit und die Klarheit von Go, auch wenn der Code länger ist als unsere vorherigen Beispiele.
C#
Ich bin weniger vertraut mit C# – für mich sieht es mehr nach Java aus, als nach C. Ich konnte dies zusammenstellen, indem ich den in der Anforderungsbibliothek gezeigten Beispielen folgte System.Net.Http.
Postman kann Beispielcode automatisch generieren, wenn Sie RestSharp bevorzugen.
Ruby
Dies war mein erster Versuch mit Ruby-Code; ich verwendete die Net::http Bibliothek und folgte diesem Beispiel (das sich als sehr nah am Code herausstellt, den Postman automatisch generiert).
Ich stieß auf eine Sprach-/Bibliothekseigenheit, die es wert ist, erklärt zu werden. Nur die Verwendung eines URI, der mit „https://“ beginnt, reicht nicht aus, man muss speziell http.use_ssl = true
setzen.
Ohne dies wird Ihr Code versuchen, eine Anfrage auf Port 443 zu stellen – aber ohne die Verwendung von SSL/TLS (d.h. in Klartext), und SparkPost wird zu Recht die Autorisierung der Anfrage verweigern. Versuchen Sie dies nicht zu Hause, da Ihr API-Schlüssel im Authorization-Header enthalten ist. Diese Sprach-/Bibliotheksfunktion fühlte sich für mich unsicher an.
Java
Ich habe zuvor noch nie ernsthaft Java programmiert, aber es war einfach, dies zusammenzustellen, indem ich dem allgemeinen Ansatz folgte, der in der SparkPost-Bibliothek für andere GET-Aufrufe verwendet wird.
Übrigens funktionierte die Nutzung von VS Code als mein Editor / Debugger wirklich gut für alle hier verwendeten Sprachen. Es bot mir Syntaxhervorhebung, Debugger-Schritte/Variablenansicht usw. Die InputStreamReader
und BufferedReader
Konstrukte sind denjenigen in Go ähnlich (und ich nehme an, dass sie davon kopiert wurden).
C / C++
Dies war ein Ausflug in die Vergangenheit, da ich in den 1990er Jahren viel C-Code geschrieben habe, von dem einige noch tief in Telekommunikationsnetzen irgendwo laufen. Da die Geschichte von C der modernen Webentwicklung vorausgeht, ist es nicht überraschend, dass die Unterstützung von Bibliotheken eine manuelle Aufgabe ist. Wir müssen eine aktuelle Version von Libcurl herunterladen (und kompilieren) und mit einer OpenSSL-Bibliothek verlinken – siehe die README für die eigentlichen Schritte.
Dies fühlt sich im Vergleich zu modernen Sprachen nach viel Arbeit an, insbesondere wenn Go (oder Lua, oder Python oder eine der anderen) für derartige Aufgaben schnell genug sind.
Das andere, was ich vergessen hatte, trotz der Narben früherer Kämpfe, ist der Schrecken der Speicherzuweisung! Um das Beispiel einfach zu halten, habe ich die URL-String-Länge vorab auf 1024 Zeichen festgelegt und die Länge der E-Mail-Adresse überprüft (mithilfe von strlen
), bevor wir sie anhängen (mithilfe von strcat
).
Wir behandeln den Authorization-String mit einem verketteten API-Schlüssel auf die gleiche Weise .. auch wenn wir wissen, dass ein gültiger API-Schlüssel nie zu lang sein wird .. das ist kein Schutz! Benutzereingaben, die aus einer Umgebungsvariable stammen, könnten alles Mögliche sein. Man muss defensiv programmieren.
Ein erfahrenerer Entwickler könnte malloc
anstelle der Zuordnung von Stapelvariablen verwenden und genau berechnen, wie lang die verbundenen Strings sein müssen. Über diese zusätzliche Komplexität nachzudenken, bereitete mir Schmerzen in den Dioden auf meiner linken Seite; es erinnerte mich an die Risiken, die C-Programmierer jeden Tag eingehen, um Pufferüberläufe und unerwartete Nebeneffekte zu vermeiden. Was uns zu ... bringt.
Lua
Lua ist bekannt für seine einfache Koexistenz neben einem C-Code, und hier bei SparkPost haben wir Lua umfangreich verwendet für Richtlinienanpassungen innerhalb unseres Momentum On-Premises MTA. Sie können es auch als eigenständige Skriptsprache verwenden, und es ist dafür auch ziemlich gut geeignet.
Mit Lua 5.3 und dem luarocks-Paketmanager verwenden wir die Bibliotheken luasocket
und luasec
. Zeigt sein C-Integrations-Erbe, wir verlinken auf unsere lokale OpenSSL-Bibliothek. Der luarocks-Installationsprozess ruft den gcc
-Compiler (oder welchen C-Compiler Sie verwenden) auf, daher dauert das Hinzufügen neuer Bibliotheken etwas.
Der Lua-Code ist ziemlich einfach. Die Zeichen — markieren Kommentare. Die Funktion https.request
bietet mehrere Rückgabewerte (ein bisschen wie Python und Go). Die String-Konkatenation erfolgt mit dem Operator .. (anstatt + in Python).
Der Antwortkörper von diesem Aufruf wird mit dem ‘ltn12’-Modul verarbeitet – siehe die Lua-Wiki-Seite über Filter, Quellen und Senken. Damit wird eine effiziente Handhabung von Daten ermöglicht, die in mehreren „Chunks“ zurückgegeben werden könnten. Wie dieser Artikel erklärt:
Die Tabellenfabrik erstellt ein Senkbecken, das alle erhaltenen Daten in einer Tabelle speichert. Die Daten können später effizient mit der Funktion table.concat in einen einzelnen String zusammengefügt werden.
Unser Beispiel verbindet einfach die Tabelle t und gibt sie aus; Sie könnten einen Filter verwenden, um mehr Verarbeitung durchzuführen.
Perl
Während Perl für seine One-Liner berühmt ist, ist dies nicht einer davon. Perl wurde für eine sehr schnelle Dokumentensuche und -änderung entwickelt, ist aber tatsächlich zu noch viel mehr fähig. Ich habe einmal eine komplette Inventarsteuerungs-Suite in Perl geschrieben. Stell dir das vor. W i e a u c h i m m e r…
Dieses Skript verwendet LWP::UserAgent und HTTP::Request sowie optional die Pakete JSON und Data::Dumper, je nachdem, wie Sie die Ausgabe sehen möchten. Wie bei allen anderen Skripten auf dieser Seite sollten Sie eine Umgebungsvariable SPARKPOST_API_KEY
auf Ihren generierten API-Schlüssel voreinstellen, der die Funktion zur Empfängerüberprüfung enthält. Dieses Skript codiert $recipient = ‘test@gmail.com’ fest, aber Sie können leicht eine Eingabe über die Befehlszeile hinzufügen oder aus einer Datei verbrauchen.
Nachdem alle Variablen geladen sind, laden wir eine HTTP:Request mit GET-Parametern und senden sie an den LWP:UserAgent. Die resultierende „Nachricht“ ist das Ergebnis des E-Mail-Validierungstests als Array. Sie können JSON und DUMPER verwenden, um das Ergebnis anzuzeigen, oder einfach das Array zur weiteren Verarbeitung weitergeben.
VB.net
Visual Basic ist nicht visuell und es ist nicht grundlegend (IMHO), aber es ist #6 auf dem TIOBE-Sprachindex, also los geht's.
Es gibt andere Möglichkeiten, dies zu tun, aber der einfachste Weg zum Erfolg ist die Verwendung des Visual Studio SDK auf einer Windows-Plattform. Starten Sie Visual Studio, beginnen Sie ein neues Projekt und wählen Sie Visual Basic, dann wählen Sie console.app. Achten Sie darauf, die VB-Version und nicht die C#-Version zu verwenden – das wird im SDK leicht übersehen.

An diesem Punkt können Sie die Zeilen manuell bearbeiten oder den Code von hier in VS kopieren/einfügen und eine Menge Zeit sparen. Um diesen Code zum Laufen zu bringen, müssen Sie eine Windows-Umgebungsvariable hinzufügen. Der einfachste Weg, dies zu tun, ist das Öffnen einer Eingabeaufforderung und die Verwendung von setx.exe wie folgt:
In Windows 10 wird dies auf Ihre Benutzerumgebung angewendet, ist aber in der aktuellen Befehlszeile nicht sofort verfügbar, daher funktioniert der Test mit einem „set“ nicht, aber es wird dem Code zur Verfügung stehen. Wenn Sie den im Repository enthaltenen Code erstellen und ausführen, sehen Sie das Validierungsergebnis. Für Entwickler, die Produktions-Webhook-Konsumenten aufbauen, die E-Mail-Adressen in großem Maßstab validieren müssen, zeigt unser Azure Functions Webhook Consumer Guide, wie man serverlose Lösungen entwickelt, die Validierungsworkflows effizient bewältigen können.
Rust
Rust ist eine Sprache für die System- und Webdiensteprogrammierung, die sich auf Leistung, Sicherheit und Nebenläufigkeit konzentriert. Wie Wikipedia sagt, ist Rust seit 2016 die „beliebteste Programmiersprache“ in der Stack Overflow Developer Survey.
Der Rust-Code in unserem Github-Repo verwendet die reqwest
-Bibliothek mit tokio
async, ähnlich wie das Beispiel im Rust Cookbook. (Das ist kein Tippfehler, der Name der reqwest
-Bibliothek wird so geschrieben). Wir haben eine Cargo-Paketmanager-Konfigurationsdatei beigefügt, damit Sie mit folgendem Befehl bauen und ausführen können:
Dies wird das Paket in ausführbaren Code kompilieren und ausführen:
Der Code verwendet std:env
, um die Umgebungsvariable SPARKPOST_API_KEY
zu lesen. Ein Match-Klausel behandelt den Fall, in dem der Schlüssel undefiniert ist. Wenn alles in Ordnung ist, wird ein neuer reqwest::Client erstellt und ein asynchroner Aufruf durchgeführt, gefolgt von einem .await? (siehe die reqwest-Dokumentation). Async, anstatt des einfacheren blockierenden Aufrufs, scheint nötig zu sein, um Anforderungsheader festzulegen. Der Antworttext des Körpers wird mit einem zweiten .await?
gelesen, gemäß diesem Beispiel.
Zusammenfassung
In diesem Artikel haben wir Beispiele für Recipient Validation Code in vielen Sprachen durchgearbeitet. Hier ist unsere Bitte an Sie.
Lassen Sie uns wissen, ob wir Ihrer Meinung nach Ihre bevorzugte Sprache verpasst haben. Wir haben vielleicht nicht so viele Beispiele wie The Fibonacci Project, aber wir würden gerne noch mehr hinzufügen. Außerdem, wenn Sie denken, dass unsere Beispiele verbessert werden können, lassen Sie es uns wissen!