
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-Codekörper, und hier bei SparkPost haben wir Lua umfassend für Richtlinienanpassungen in unserem Momentum vor-Ort-MTA genutzt. Sie können es auch als eigenständige Skriptsprache verwenden, und es ist dafür auch ziemlich nett.
Mit Lua 5.3 und dem luarocks-Paketmanager verwenden wir die Bibliotheken luasocket
und luasec
. Aufgrund seines C-Integrations-Erbes verlinken wir zu unserer lokalen OpenSSL-Bibliothek. Der luarocks-Installationsprozess ruft den gcc
-Compiler (oder welchen C-Compiler Sie verwenden) auf, daher dauert das Hinzufügen neuer Bibliotheken eine Weile.
Der Lua-Code ist ziemlich einfach. Die Zeichen — kennzeichnen Kommentare. Die Funktion https.request
bietet mehrere Rückgabewerte (ein bisschen wie Python und Go). Die Zeichenkettenkonkatenation erfolgt mit dem Operator .. (anstatt + in Python).
Der Antwortkörper dieses Aufrufs wird mit dem „ltn12“-Modul verarbeitet – siehe hier. Dies ermöglicht eine effiziente Verarbeitung von Daten, die in mehreren „Chunks“ zurückgegeben werden könnten. Wie der Artikel erklärt:
Die Tabellenfabrik erstellt ein Senkventil, das alle erhaltenen Daten in einer Tabelle speichert. Die Daten können später effizient mit der table.concat-Bibliotheksfunktion in eine einzelne Zeichenfolge verkettet werden.
Unser Beispiel verkettet einfach die Tabelle t und gibt sie aus; Sie könnten einen Filter verwenden, um weitere Verarbeitungen 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 einfach (meiner Meinung nach), aber es ist auf Platz #6 im TIOBE-Sprachindex, also machen wir weiter.
Es gibt andere Wege, 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 – es ist leicht, dies im SDK zu übersehen.

An diesem Punkt können Sie Zeilen manuell bearbeiten oder den Code von hier kopieren/einfügen in VS 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 die Eingabeaufforderung zu öffnen und setx.exe so zu verwenden:
C:\Users\me>setx SPARKPOST_API_KEY "142<redacted<redacted>c531c3"
In Windows 10 wird dies auf Ihre Benutzerumgebung angewendet, ist jedoch nicht sofort in der aktuellen Befehlssitzung verfügbar, daher funktioniert das Testen mit einem 'set' nicht, aber es wird für den Code verfügbar sein. Wenn Sie den im Repo enthaltenen Code erstellen und ausführen, sehen Sie das Validierungsergebnis. Für Entwickler, die Produktionswebhook-Konsumenten erstellen, die E-Mail-Adressen in großem Maßstab validieren müssen, zeigt unser Azure Functions Webhook-Konsumenten Leitfaden, wie man serverlose Lösungen erstellt, die Validierungsworkflows effizient bewältigen können.
Rust
Rust ist eine Sprache für System- und Web-Service-Programmierung, die auf Leistung, Sicherheit und Parallelität ausgerichtet ist. 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 dieses Beispiel aus dem Rust-Kochbuch. (Das ist kein Tippfehler, der Name der reqwest
Bibliothek wird so geschrieben). Wir haben eine Cargo-Paketmanager-Konfigurationsdatei hinzugefügt, sodass Sie mit dem folgenden Befehl bauen und ausführen können:
cd rust_recipient_validation cargo run
Dies wird das Paket in ausführbaren Code übersetzen und ausführen:
Abgeschlossen dev [nicht optimiert + debuginfo] Ziel(e) in 0.10s Ausführen von `target/debug/rust_recipient_validation` Status: 200 OK Body: : (etc)
Der Code verwendet std:env
, um die Umgebungsvariable SPARKPOST_API_KEY
zu lesen. Eine Match-Klausel behandelt den Fall, dass der Schlüssel nicht definiert ist. Wenn alles gut geht, wird ein neuer reqwest::Client
erstellt und ein asynchroner Aufruf ausgegeben, gefolgt von einem .await?
(siehe hier). Async anstelle des einfacheren blockierenden Aufrufs scheint erforderlich zu sein, um Anfrage-Header festzulegen. Der Antwortkörpertext 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!