Erreichen

Grow

Manage

Automate

Erreichen

Grow

Manage

Automate

Empfängerverifizierung: Beispiele für E-Mail-Verifizierungscodes

Vogel

08.07.2020

E-Mail

1 min read

Empfängerverifizierung: Beispiele für E-Mail-Verifizierungscodes

Vogel

08.07.2020

E-Mail

1 min read

Empfängerverifizierung: Beispiele für E-Mail-Verifizierungscodes

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-Webanwendung können Sie eine gesamte Liste zum Überprüfen per Drag & Drop hinzufügen. Sie können auch die API verwenden, um einzelne Adressen zu validieren, sodass Sie die Validierung direkt in Ihren Workflow zur Adresseingabe integrieren können.

Vor einiger Zeit haben wir ein Python-Command-Line-Tool mit dieser API entwickelt. Wir haben darüber gesprochen, was wir für andere Sprachen tun sollten – und hier sind wir! Lass uns anfangen.

Dieser Github-Repository-Ordner enthält funktionierende Beispiele für API-Aufrufe zur Empfängervalidierung in etwa einem Dutzend verschiedener Sprachen. Wir versuchen, die beliebtesten anwendbaren Sprachen abzudecken.

Der allgemeine Weg, um all diese Beispiele zu bearbeiten, ist:

  • Holen Sie sich Ihren Schlüssel aus der Umgebungsvariable SPARKPOST_API_KEY

  • Machen Sie einen API-Aufruf zu /api/v1/recipient-validation/single/, um einen Empfänger zu validieren

  • Empfangen Sie eine Antwortzeichenkette mit Daten im JSON-Format, die das Ergebnis enthält

  • Geben Sie das Ergebnis aus

SparkPost hat Bibliotheken für einige, aber nicht alle hier behandelten Sprachen. Wir haben uns entschieden, diese Beispiele stattdessen „nativ“ zu schreiben, damit wir a) mehr Sprachen abdecken können, b) zeigen können, wie einfach der zugrunde liegende Code sein kann, und c) es Ihnen ermöglichen können, die Gemeinsamkeiten und Unterschiede zwischen den Sprachen klar zu erkennen.

Bash / Curl

Dies gewinnt den Preis für den kürzesten Code – es verwendet einfach das Befehlszeilen-Tool „curl“, um die Anfrage zu stellen und die Antwort direkt im Terminal auszugeben. Sie können sehen, dass die Ausgabe eine Zeichenkette ist, die JSON enthält; wir analysieren die einzelnen Ergebnisattribute tatsächlich nicht.

Dies gewinnt den Preis für den kürzesten Code – es verwendet einfach das Befehlszeilen-Tool „curl“, um die Anfrage zu stellen und die Antwort direkt im Terminal auszugeben. Sie können sehen, dass die Ausgabe eine Zeichenkette ist, die JSON enthält; wir analysieren die einzelnen Ergebnisattribute tatsächlich nicht.

Dies gewinnt den Preis für den kürzesten Code – es verwendet einfach das Befehlszeilen-Tool „curl“, um die Anfrage zu stellen und die Antwort direkt im Terminal auszugeben. Sie können sehen, dass die Ausgabe eine Zeichenkette ist, die JSON enthält; wir analysieren die einzelnen Ergebnisattribute tatsächlich nicht.

PHP

Vertrauenswürdiges 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 "Code"-Schaltfläche.

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

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 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 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 eine Reise in die Vergangenheit, da ich in den 1990er Jahren viel C-Code geschrieben habe, der noch immer tief in Telekommunikationsnetzen irgendwo läuft. Da die Geschichte von C älter ist als das moderne Web, ist es nicht überraschend, dass die Bibliotheksunterstützung eine manuelle Aufgabe ist. Wir müssen eine aktuelle Version von Libcurl herunterladen (und kompilieren), die mit einer OpenSSL-Bibliothek verlinkt ist – siehe die README für die tatsächlichen Schritte.

Im Vergleich zu modernen Sprachen fühlt sich das wie eine Menge Arbeit an, insbesondere wenn Go (oder Lua, oder Python, oder eine der anderen) schnell genug für Aufgaben wie diese sind.

Das andere, das ich vergessen hatte, trotz der Narben früherer Schlachten, ist die Gefährlichkeit der Speicherzuweisung! Um das Beispiel einfach zu halten, habe ich die URL-String-Länge auf 1024 Zeichen vorab zugewiesen und die Länge der E-Mail-Adresse überprüft (mithilfe von strlen), bevor wir sie daranhängen (mit strcat).

Wir behandeln die Authorization-Zeichenfolge mit einem angehängten 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 aus einer Umgebungsvariable könnten alles Mögliche sein. Sie müssen defensiv programmieren.

Ein anspruchsvollerer Entwickler könnte malloc anstelle der Stack-Variablen-Zuweisung verwenden und genau berechnen, wie lang die verbundenen Zeichenketten sein müssen. Über diese zusätzliche Komplexität nachdenken zu müssen, gab mir einen Schmerz in den Dioden auf meiner linken Seite; es erinnerte mich an die Risiken, denen C-Programmierer jeden Tag ausgesetzt sind, um Pufferüberläufe und unerwartete Nebenwirkungen zu vermeiden. Damit kommen wir zu ..

Lua

Lua ist bekannt für seine einfache Koexistenz neben einem C-Code, und hier bei SparkPost nutzen wir Lua umfangreich für Policy-Anpassungen innerhalb unseres Momentum On-Premise MTA. Sie können es auch als eigenständige Skriptsprache verwenden, und es ist auch dafür ziemlich nett.

Mit Lua 5.3 und dem luarocks-Paketmanager nutzen wir die Bibliotheken luasocket und luasec. Um seine C-Integrations-Herkunft zu zeigen, verlinken wir mit unserer lokalen OpenSSL-Bibliothek. Der luarocks-Installationsprozess ruft den gcc-Compiler auf (oder welchen C-Compiler Sie auch verwenden), sodass das Hinzufügen neuer Bibliotheken eine Weile dauert.

Der Lua-Code ist ganz einfach. Die Zeichen — markieren Kommentare. Die Funktion https.request liefert mehrere Rückgabewerte (ein bisschen wie Python und Go). Die String-Verkettung erfolgt mit dem Operator .. (statt + in Python).

Der Antworttext aus diesem Aufruf wird mit dem „ltn12“-Modul gehandhabt – siehe hier. Das ermöglicht eine effiziente Handhabung von Daten, die in mehreren „Chunks“ zurückgegeben werden könnten. Wie der Artikel erklärt:

Die Tabellenfabrik erstellt ein Sink, das alle erhaltenen Daten in einer Tabelle speichert. Die Daten können später effizient mit der table.concat-Bibliotheksfunktion in einen einzelnen String verkettet werden.

Unser Beispiel verketten einfach 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 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 basic (meiner Meinung nach), aber es steht auf Platz #6 im 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. Stellen Sie sicher, die VB-Version zu verwenden und nicht die C#-Version – es ist leicht, dies im SDK zu übersehen.

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.


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 einer Eingabeaufforderung 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 aber nicht sofort in der aktuellen Befehlssitzung verfügbar, sodass das Testen mit einem „set“ nicht funktioniert, aber es wird dem Code zur Verfügung stehen. Wenn Sie den im Repo enthaltenen Code bauen und ausführen, werden Sie das Validierungsergebnis sehen. Für Entwickler, die Produktions-Webhook-Konsumenten erstellen, die E-Mail-Adressen in großem Maßstab validieren müssen, zeigt unser Azure Functions webhook consumer guide, wie man serverlose Lösungen baut, die Validierungs-Workflows effizient bewältigen können.

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!

Lassen Sie uns Sie mit einem Bird-Experten verbinden.
Erleben Sie die volle Macht des Bird in 30 Minuten.

Durch die Übermittlung stimmen Sie zu, dass Bird Sie bezüglich unserer Produkte und Dienstleistungen kontaktieren darf.

Sie können sich jederzeit abmelden. Weitere Informationen zur Datenverarbeitung finden Sie in Birds Datenschutzerklärung.

Unternehmen

Newsletter

Bleiben Sie mit Bird auf dem Laufenden durch wöchentliche Updates in Ihrem Posteingang.

Lassen Sie uns Sie mit einem Bird-Experten verbinden.
Erleben Sie die volle Macht des Bird in 30 Minuten.

Durch die Übermittlung stimmen Sie zu, dass Bird Sie bezüglich unserer Produkte und Dienstleistungen kontaktieren darf.

Sie können sich jederzeit abmelden. Weitere Informationen zur Datenverarbeitung finden Sie in Birds Datenschutzerklärung.

Unternehmen

Newsletter

Bleiben Sie mit Bird auf dem Laufenden durch wöchentliche Updates in Ihrem Posteingang.

Lassen Sie uns Sie mit einem Bird-Experten verbinden.
Erleben Sie die volle Macht des Bird in 30 Minuten.

Durch die Übermittlung stimmen Sie zu, dass Bird Sie bezüglich unserer Produkte und Dienstleistungen kontaktieren darf.

Sie können sich jederzeit abmelden. Weitere Informationen zur Datenverarbeitung finden Sie in Birds Datenschutzerklärung.

R

Erreichen

G

Grow

M

Manage

A

Automate

Unternehmen

Newsletter

Bleiben Sie mit Bird auf dem Laufenden durch wöchentliche Updates in Ihrem Posteingang.