
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.
Business in a box.
Entdecken Sie unsere Lösungen.
Sprechen Sie mit unserem Vertriebsteam
SparkPost Recipient Validation ist jetzt sowohl für bestehende SparkPost-Kunden als auch für neue, nicht sendende Kunden verfügbar. Es verwendet leistungsstarke, datengetriebene Analysen von Milliarden von Bounce-, Zustellungs- und Engagement-Ereignissen täglich, um unseren Algorithmus zu trainieren und Ihnen eines der leistungsstärksten, datengetriebenen E-Mail-Validierungswerkzeuge auf dem Markt zu bieten, damit Sie E-Mails intelligenter versenden können.
Dieser Artikel erklärt, wie Sie das Beste aus den Daten herausholen können, die Sie für jeden validierten Empfänger zurückerhalten – Sie werden sehen, dass wir Adressen als „gültig“, „riskant“, „neutral“, „unzustellbar“ und „Tippfehler“ klassifizieren. Wir geben Ihnen einen „reason“-Code und auch ein „did_you_mean“ für bekannte Adresstippfehler.
API-Anfragen
In der SparkPost-Webanwendung 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 Adresseingabeworkflow integrieren können.
Vor einiger Zeit haben wir ein Python-Befehlszeilentool mit dieser API entwickelt. Wir besprachen, was wir für andere Sprachen tun sollten – und hier sind wir nun! Lassen Sie uns loslegen.
Dieser Github-Repository-Ordner enthält funktionierende Beispiele für API-Aufrufe zur Empfänger-Validierung in etwa einem Dutzend verschiedener Sprachen. Wir versuchen, die beliebtesten anwendbaren Sprachen abzudecken.
Der übliche Weg, alle diese Beispiele durchzugehen, ist:
Nehmen Sie Ihren Schlüssel aus der Umgebungsvariable
SPARKPOST_API_KEY
Machen Sie einen API-Aufruf an
/api/v1/recipient-validation/single/
, um einen Empfänger zu validierenErhalten Sie eine Antwortzeichenfolge 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 der hier behandelten Sprachen. Wir haben uns entschieden, diese Beispiele stattdessen „nativ“ zu schreiben, damit wir a) mehr Sprachen abdecken können, b) zeigen, wie einfach der zugrunde liegende Code sein kann, und c) Ihnen ermöglichen, die Ähnlichkeiten und Unterschiede zwischen den Sprachen klar zu erkennen.
Bash / Curl
PHP
Das zuverlässige PHP hat ein paar verschiedene Möglichkeiten, HTTPS-API-Aufrufe zu tätigen. 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 Schaltfläche „Code“.

Python
Dies verwendet das beliebte requests-Modul, das hochgradig ist und daher einfach zu verwenden ist. Dieses Beispiel überprüft den zurückgegebenen Statuscode, wandelt das Ergebnis-JSON zurück in ein Python-Dictionary-Objekt und druckt das resultierende Objekt anstelle nur eines Strings aus.
Wenn Sie die integrierte 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 (mit einer Callback-Funktion), aber es ist veraltet und wird nicht mehr aktiv gewartet. Ich habe mich für das neuere axios-Paket (unter Verwendung von promises) entschieden.
Postman kann Ihnen auch ein natives Javascript-Beispiel und Unirest geben, 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 Client-Seite (Browser / Mobilgerät).
Go
Go strebt nach der Philosophie des „einen guten Wegs“, um etwas zu tun; in diesem Fall durch die Verwendung der eingebauten „batteries included“ Bibliotheken net/http, encoding/json und andere.
Die Länge ist hauptsächlich auf die expliziten Fehlerüberprüfungs-Klauseln if err != nil {}
überall zurückzuführen (keine Ausnahmen LOL).
Wir deklarieren auch die Ergebnisobjektstruktur mit Feld-Tags, um uns das „Unmarshal“ des zurückgegebenen JSON-Strings zu ermöglichen. Wir legen die „results“ und „errors“ Tags übereinander, um beide Arten von Rückgaben zu ermöglichen.
Ich mag die Geschwindigkeit, Typensicherheit und Klarheit von Go, auch wenn der Code länger ist als in unseren vorherigen Beispielen.
C#
Ich bin mit C# weniger vertraut – für mich sieht es eher Java-ähnlich aus, anstatt C-ähnlich. Ich konnte dies anhand von Beispielen aus der Anforderungsbibliothek System.Net.Http zusammenstellen.
Postman kann automatisch Beispielcode mit RestSharp generieren, wenn Sie das bevorzugen.
Ruby
Dies war mein erster Versuch mit Ruby-Code; Ich verwendete die Net::http-Bibliothek und folgte diesem Beispiel (das sich als dem Code herausstellt, den Postman automatisch generiert, sehr ähnlich).
Ich stieß auf eine Eigenart der Sprache/Bibliothek, die es wert ist, erklärt zu werden. Nur die Verwendung eines URI, der mit „https://“ beginnt, reicht nicht aus, Sie müssen speziell http.use_ssl = true
setzen.
Ohne dies wird Ihr Code versuchen, eine Anfrage auf Port 443 zu stellen – jedoch ohne Verwendung von SSL/TLS (d. h. im Klartext), und SparkPost wird zu Recht die Autorisierung der Anfrage verweigern. Versuchen Sie dies nicht zu Hause, da sich Ihr API-Schlüssel im Authorization-Header befindet. Dieses Sprach-/Bibliotheksmerkmal fühlte sich für mich unsicher an.
Java
Ich habe zuvor kein ernsthaftes Java geschrieben, aber es war einfach, dies zusammenzufügen, indem ich dem allgemeinen Ansatz folgte, der in der SparkPost-Bibliothek für andere GET-Aufrufe verwendet wird.
Übrigens hat das Verwenden von VS Code als mein Editor/Debugger wirklich gut für alle hier verwendeten Sprachen funktioniert, da es mir Syntaxhervorhebung, Debugger-Stepping/Variables-Ansicht usw. bietet. Die InputStreamReader
und BufferedReader
-Konstrukte sind ähnlich wie (und ich nehme an, wurden von) Go kopiert.
C / C++
Dies war ein Ausflug in die Vergangenheit, da ich in den 1990er Jahren viel C-Code geschrieben habe, von dem einige noch irgendwo tief in Telekommunikationsnetzwerken laufen. Da die Geschichte von C der modernen Webentwicklung vorausgeht, ist es nicht überraschend, dass die Bibliotheksunterstützung 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 tatsächlichen Schritte.
Dies fühlt sich im Vergleich zu modernen Sprachen nach viel Arbeit an, insbesondere wenn Go (oder Lua, oder Python oder andere) schnell genug für Aufgaben wie diese sind.
Das andere, was ich vergessen hatte, trotz der Narben früherer Schlachten, ist die Unheimlichkeit der Speicherzuweisung! Um das Beispiel einfach zu halten, habe ich die URL-String-Länge auf 1024 Zeichen vorzugewiesen und die E-Mail-Adresslänge überprüft (mit strlen
), bevor wir sie konkatenieren (mit strcat
).
Wir behandeln die Authorization-Zeichenkette mit einem verketteten API-Schlüssel auf die gleiche Weise .. obwohl wir wissen, dass ein gültiger API-Schlüssel nie zu lang sein wird .. das ist kein Schutz! Benutzereingaben, die aus einer Umgebungsvariable kommen, können alles sein. Sie müssen defensiv programmieren.
Ein raffinierterer Entwickler könnte malloc
anstelle der Stapelspeicherzuweisung verwenden und genau berechnen, wie lang die verbundenen Zeichenfolgen sein müssen. Darüber nachzudenken, hat mir Schmerzen in den Dioden auf meiner linken Seite bereitet; es erinnerte mich an die Risiken, die C-Programmierer jeden Tag eingehen, um Pufferüberläufe und unerwartete Nebenwirkungen zu vermeiden. Was uns zu .. führt
Lua
Lua ist bekannt für seine einfache Koexistenz neben einem C-Code-Körper, 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 das ist auch ziemlich nett.
Mit Lua 5.3 und dem luarocks Paketmanager verwenden wir die Bibliotheken luasocket
und luasec
. Es zeigt sein C-Integrations-Erbe, indem wir auf unsere lokale OpenSSL-Bibliothek verlinken. Der luarocks-Installationsprozess ruft den gcc
-Compiler auf (oder welchen C-Compiler Sie verwenden), daher dauert das Hinzufügen neuer Bibliotheken eine Weile.
Der Lua-Code ist ziemlich einfach. Die Zeichen — markieren Kommentare. Die Funktion https.request
liefert mehrere Rückgabewerte (ein bisschen wie in Python und Go). Die Verkettung von Strings erfolgt mit dem Operator .. (statt + in Python).
Der Antwortkörper dieses Aufrufs wird mit dem „ltn12“-Modul behandelt – siehe hier. Das ermöglicht eine effiziente Handhabung von Daten, die in mehreren „Chunks“ zurückgegeben werden könnten. Wie in diesem Artikel erklärt wird:
Die Tabellenfabrik erstellt ein Senke, die alle erhaltenen Daten in eine Tabelle speichert. Die Daten können später effizient mit der Funktion table.concat aus der Bibliothek in einen einzelnen String zusammengefügt werden.
Unser Beispiel verkettet einfach die Tabelle t und druckt sie aus; Sie könnten einen Filter verwenden, um eine weitere Verarbeitung durchzuführen.
Perl
Während Perl für seine One-Liner berühmt ist, ist dies keiner von ihnen. Perl wurde für sehr schnelle Dokumentensuche und -modifikation entwickelt, ist aber tatsächlich zu viel mehr fähig. Ich habe einmal eine komplette Inventurkontrollsuite in Perl geschrieben. Wer hätte das gedacht? J e d e n f a l l s…
Dieses Skript verwendet LWP::UserAgent und HTTP::Request und optional die JSON- und Data::Dumper-Pakete, abhängig davon, wie Sie die Ausgabe anzeigen 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’, aber Sie können problemlos Kommandozeileneingaben hinzufügen oder aus einer Datei konsumieren.
Nachdem alle Variablen gefüllt 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 weiterleiten.
VB.net
Visual Basic ist nicht visuell und es ist nicht grundlegend (meiner Meinung nach), aber es steht auf Platz #6 im TIOBE Language Index, also los geht's.
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 – das kann man im SDK leicht übersehen.

An diesem Punkt können Sie 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 eines Eingabeaufforderungsfensters und die Verwendung von setx.exe wie folgt:
C:\Users\me>setx SPARKPOST_API_KEY "142<redacted<redacted>c531c3"
In Windows 10 wird dies auf Ihre Benutzerumgebung angewendet, ist jedoch im aktuellen Befehlssitzung nicht sofort verfügbar, daher funktioniert ein Test mit „set“ nicht, aber es wird für den Code verfügbar sein. Wenn Sie den im Repo enthaltenen Code bauen und ausführen, sehen Sie das Validierungsergebnis.
Rust
Rust ist eine Sprache für die System- und Webdienstprogrammierung, die sich auf Leistung, Sicherheit und Nebenläufigkeit konzentriert. Wie Wikipedia sagt, war Rust in der Stack Overflow Developer Survey seit 2016 die „am meisten geliebte Programmiersprache“.
Der Rust-Code in unserem Github-Repo verwendet die reqwest
Bibliothek mit tokio
async, ähnlich wie in diesem Beispiel aus dem Rust-Kochbuch. (Das ist kein Tippfehler, der Bibliotheksname reqwest
wird so geschrieben). Wir haben eine Cargo-Paketmanager Konfigurationsdatei beigefügt, sodass Sie mit folgendem Befehl bauen und ausführen können:
cd rust_recipient_validation cargo run
Dies wird das Paket in ausführbaren Code kompilieren und ausführen:
Fertiggestellt dev [nicht optimiert + Debuginfo] Ziel(e) in 0,10s Ausführen `target/debug/rust_recipient_validation` Status: 200 OK Body: : (etc)
Der Code verwendet std:env
, um die Umgebungsvariable SPARKPOST_API_KEY
auszulesen. Eine Match-Klausel behandelt den Fall, dass der Schlüssel undefiniert ist. Wenn alles in Ordnung ist, wird ein neuer reqwest::Client
erstellt und ein asynchroner Aufruf gestartet, gefolgt von einem .await?
(siehe hier). Async scheint notwendig zu sein, anstatt des einfacheren blockierenden Aufrufs, um Anforderungsheader festzulegen. Der Antworttext wird mit einem zweiten .await?
gelesen, wie in diesem Beispiel.
Zusammenfassung
In diesem Artikel haben wir Empfänger-Validierungs-Codebeispiele in vielen Sprachen durchgearbeitet. Hier ist unsere Bitte an Sie.
Lassen Sie uns wissen, ob Sie denken, dass wir Ihre bevorzugte Sprache verpasst haben. Wir haben möglicherweise nicht so viele Beispiele wie The Fibonacci Project, aber wir würden gerne noch mehr hinzufügen. Wenn Sie auch der Meinung sind, dass unsere Beispiele verbessert werden können, lassen Sie es uns wissen!