Recipient Validation: Weryfikacja Kodu E-mail

Bird

8 lip 2020

Email

1 min read

Recipient Validation: Weryfikacja Kodu E-mail

SparkPost Recipient Validation jest teraz dostępny zarówno dla istniejących klientów SparkPost, jak i dla nowych, niepiszących klientów. Wykorzystuje potężną analizę opartą na danych na miliardach dziennych zdarzeń związanych z odbiciami, dostawą i zaangażowaniem, aby szkolić nasz algorytm, oferując jedno z najpotężniejszych narzędzi do weryfikacji adresów e-mail opartych na danych na rynku, dzięki czemu możesz wysyłać e-maile mądrzej.

SparkPost Recipient Validation jest teraz dostępny zarówno dla istniejących klientów SparkPost, jak i dla nowych, niewysyłających klientów. Wykorzystuje potężną analizę opartą na danych, opartą na miliardach zdarzeń związanych z odbiciem, dostawą i zaangażowaniem każdego dnia, aby szkolić nasz algorytm, dostarczając jedno z najbardziej potężnych narzędzi do walidacji email na rynku, dzięki czemu możesz mądrzej wysyłać e-maile. To reprezentuje najnowszą ewolucję w technikach walidacji email, przechodząc poza proste kontrole składni do zaawansowanych podejść opartych na danych, które zapewniają dokładniejsze wyniki.

Ten artykuł wyjaśnia, jak możesz maksymalnie wykorzystać dane, które otrzymasz dla każdego zweryfikowanego odbiorcy – zobaczysz, że klasyfikujemy adresy jako „valid”, „risky”, „neutral”, „undeliverable” i „typo”. Dajemy Ci kod „reason”, a także „did_you_mean” dla znanych literówek adresów.

Żądania API

W aplikacji webowej SparkPost możesz przeciągnąć i upuścić całą listę do walidacji. Możesz również użyć API, aby zweryfikować pojedyncze adresy, dzięki czemu możesz wbudować walidację bezpośrednio w swój proces wprowadzania adresów.

Jakiś czas temu stworzyliśmy narzędzie wiersza poleceń Python wykorzystujące to API. Rozmawialiśmy o tym, co powinniśmy zrobić dla innych języków – i oto jesteśmy! Zaczynajmy.

Ten folder repozytorium Github zawiera działające przykłady wywołań API Walidacji Odbiorcy w około tuzinie różnych języków. Staramy się uwzględniać najbardziej popularne odpowiednie języki.

Ogólny sposób pracy z tymi wszystkimi przykładami jest następujący:

  • Pobierz swój klucz z zmiennej środowiskowej SPARKPOST_API_KEY

  • Zrób wywołanie API na /api/v1/recipient-validation/single/, aby zweryfikować odbiorcę

  • Otrzymasz z powrotem ciąg odpowiedzi zawierający dane w formacie JSON z wynikiem

  • Wydrukuj wynik

SparkPost ma biblioteki dla niektórych, ale nie wszystkich języków objętych tutaj. Zdecydowaliśmy się napisać te przykłady „natomiast”, abyśmy mogli a) objąć więcej języków, b) pokazać, jak prosty może być kod źródłowy, oraz c) umożliwić ci wyraźne zobaczenie podobieństw i różnic między językami.

Bash / Curl

To wygrywa nagrodę za najkrótszy kod – po prostu używa narzędzia wiersza poleceń „curl” do wykonania żądania i bezpośredniego wyświetlenia odpowiedzi na terminalu. Widać, że dane wyjściowe to ciąg znaków zawierający JSON; tak naprawdę nie analizujemy poszczególnych atrybutów wynikowych.

To wygrywa nagrodę za najkrótszy kod – po prostu używa narzędzia wiersza poleceń „curl” do wykonania żądania i bezpośredniego wyświetlenia odpowiedzi na terminalu. Widać, że dane wyjściowe to ciąg znaków zawierający JSON; tak naprawdę nie analizujemy poszczególnych atrybutów wynikowych.

To wygrywa nagrodę za najkrótszy kod – po prostu używa narzędzia wiersza poleceń „curl” do wykonania żądania i bezpośredniego wyświetlenia odpowiedzi na terminalu. Widać, że dane wyjściowe to ciąg znaków zawierający JSON; tak naprawdę nie analizujemy poszczególnych atrybutów wynikowych.

PHP

Trusty PHP ma kilka różnych sposobów na wykonywanie wywołań API HTTPS. Tutaj zdecydowaliśmy się użyć curl_setopt razem z curl_exec.

Jeśli wolisz HTTP_Request2 lub pecl_http, to Postman ma wbudowany generator kodu, którego możesz użyć do tworzenia podobnych przykładów – wystarczy skonfigurować działające żądanie GET i użyć przycisku „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

To wykorzystuje popularny moduł requests, który jest na wysokim poziomie, a więc łatwy w użyciu. Ten przykład sprawdza zwrócony kod statusu, konwertuje wyniki JSON z powrotem na obiekt słownika Python i drukuje wynikowy obiekt, a nie tylko ciąg znaków.

Jeśli wolisz wbudowaną bibliotekę http.client, Postman może również wygenerować do tego kod; nie jest to o wiele dłuższe.

Node.js

Istnieje wiele różnych bibliotek HTTP(S) dla node.js. Zacząłem od starszego pakietu request (używającego funkcji zwrotnej), ale został on wycofany i nie jest już aktywnie utrzymywany.  Wybrałem nowszy pakiet axios (używający promises). 

Postman może również zapewnić Ci przykład natywny dla Javascript i Unirest, jeśli wolisz tamte.

Ponieważ ten kod wymaga dostępu do Twojego klucza API, zdecydowanie zalecamy wywołanie naszego API z serwera, nigdy z klienta (przeglądarka / urządzenie mobilne).

Go

Go dąży do filozofii „jednego dobrego sposobu” na zrobienie czegoś; w tym przypadku poprzez używanie wbudowanych bibliotek „z bateriami” takich jak net/http, encoding/json i innych.

Długość wynika głównie z wyraźnych klauzul sprawdzających błędy if err != nil {} wszędzie ( brak wyjątków LOL).

Deklarujemy również strukturę obiektu wynikowego z tagami pól, aby umożliwić nam „odpakowanie” zwróconego łańcucha JSON. Nakładamy tagi „results” i „errors”, aby dopuścić oba rodzaje zwrotu.

Podoba mi się szybkość, bezpieczeństwo typów i przejrzystość Go, nawet jeśli kod jest dłuższy niż w naszych poprzednich przykładach.

C#

Nie jestem zbyt zaznajomiony z C# – dla mnie wygląda dość podobnie do Java, niż do C. Udało mi się to złożyć, korzystając z przykładów pokazanych w bibliotece request System.Net.Http.

Postman może automatycznie generować przykładowy kod, używając RestSharp, jeśli to preferujesz.

Ruby

To była moja pierwsza próba kodu w Ruby; użyłem biblioteki Net::http i postępowałem zgodnie z tym przykładem (który okazuje się być bardzo zbliżony do kodu, który generuje automatycznie Postman).

Natrafiłem na jedną osobliwość języka / biblioteki, która jest warta wyjaśnienia. Samo użycie URI, który zaczyna się od „https://” nie wystarczy, trzeba konkretnie ustawić http.use_ssl = true

Bez tego, Twój kod spróbuje wykonać żądanie na porcie 443 – ale bez użycia SSL/TLS (tj. w zwykłym tekstowym trybie), i SparkPost słusznie odmówi autoryzacji żądania. Nie próbuj tego w domu, ponieważ Twój klucz API znajduje się w nagłówku Autoryzacji. Ta cecha języka / biblioteki wydawała mi się niebezpieczna.

Java

Nie pisałem wcześniej żadnego poważnego kodu w Javie, ale było łatwo to zebrać, śledząc ogólne podejście używane w bibliotece SparkPost dla innych wywołań GET.

Przy okazji, używanie VS Code jako mojego edytora / debugera działało naprawdę dobrze dla wszystkich języków tutaj, zapewniając podświetlanie składni, kroki debugera / podgląd zmiennych itp. Konstrukty InputStreamReader i BufferedReader są podobne do (i zakładam, że zostały skopiowane przez) Go.

C / C++

To była podróż wzdłuż wspomnień, ponieważ pisałem dużo kodu C w latach 90., który nadal działa gdzieś w głębokich sieciach telekomunikacyjnych. Ponieważ historia C poprzedza nowoczesny Web, nie jest zaskoczeniem, że wsparcie bibliotek jest zadaniem ręcznym. Musimy pobrać (i skompilować) najnowszą wersję Libcurl, łącząc ją z biblioteką OpenSSL – zobacz README dla rzeczywistych kroków.

To wydaje się być dużo pracy w porównaniu do nowoczesnych języków, szczególnie gdy Go (lub Lua, lub Python, lub jakikolwiek inny) są wystarczająco szybkie dla takich zadań.

Druga rzecz, o której zapomniałem, mimo że noszę blizny po poprzednich bitwach, to strach przed alokacją pamięci! Aby uprościć przykład, wstępnie przydzieliłem długość ciągu URL do 1024 znaków i sprawdziłem długość adresu e-mail (używając strlen) zanim go połączymy (używając strcat).

Traktujemy ciąg autoryzacji z połączonym kluczem API w ten sam sposób .. mimo że wiemy, że ważny klucz API nigdy nie będzie zbyt długi .. to żadna ochrona! Dane wejściowe użytkownika pochodzące z zmiennej środowiskowej mogą być czymkolwiek. Musisz programować defensywnie.

Bardziej zaawansowany deweloper mógłby użyć malloc zamiast alokacji zmiennych stosu, i dokładnie obliczyć, jak długie powinny być połączone ciągi. Myślenie o tej dodatkowej złożoności dało mi ból w diodach po lewej stronie; przypomniało mi to o ryzykach, jakie codziennie podejmują programiści C, próbując unikać przepełnień bufora i nieoczekiwanych efektów ubocznych. Co prowadzi nas do ..

Lua

Lua jest znane z łatwej koegzystencji obok kodu C, a tutaj w SparkPost używaliśmy Lua intensywnie do niestandardowych personalizacji w naszym lokalnym MTA Momentum. Możesz również używać go jako samodzielnego języka skryptowego, i do tego też się dobrze nadaje.

Z Lua 5.3 i menedżerem pakietów luarocks, używamy bibliotek luasocket i luasec. Pokazując swoje dziedzictwo integracji z C, łączymy się z naszą lokalną biblioteką OpenSSL. Proces instalacji luarocks wywołuje kompilator gcc (lub inny kompilator C, którego używasz), więc dodanie nowych bibliotek trochę trwa.

Kod Lua jest dość prosty. Znaki — oznaczają komentarze. Funkcja https.request zapewnia wiele wartości zwrotnych (trochę jak Python i Go). Konkatenacja ciągów jest wykonywana z operatorem .. (zamiast + w Pythonie).

Treść odpowiedzi z tego wywołania jest obsługiwana z modułem 'ltn12' – zobacz stronę wikipedii Lua o Filtrach, Źródłach i Zlewach. To umożliwia efektywne zarządzanie danymi, które mogą być zwracane w wielu „kawałkach”. Jak wyjaśnia ten artykuł:

Fabryka tabel tworzy zlew, który przechowuje wszystkie uzyskane dane w tabeli. Dane mogą być później efektywnie połączone w jeden ciąg za pomocą funkcji library table.concat.

Nasz przykład po prostu konkatenizuje tabelę t i wypisuje ją na ekranie; możesz użyć filtra, aby przeprowadzić więcej przetwarzania.

Perl

Chociaż Perl jest znany z one liners, to nie jest jeden z nich. Perl został zaprojektowany do bardzo szybkiego przeszukiwania i modyfikacji dokumentów, ale w rzeczywistości potrafi znacznie więcej. Kiedyś napisałem cały pakiet zarządzania zapasami w Perl. Wyobraź sobie. W każdym razie…

Ten skrypt wykorzystuje LWP::UserAgent i HTTP::Request oraz opcjonalnie pakiety JSON i Data::Dumper w zależności od tego, jak chcesz zobaczyć wyniki. Podobnie jak w przypadku wszystkich innych skryptów na tej stronie, powinieneś wcześniej ustawić zmienną środowiskową SPARKPOST_API_KEY na swoją wygenerowaną klucz API, który zawiera funkcję weryfikacji odbiorców. Ten skrypt na stałe koduje $recipient = ‘test@gmail.com’, ale możesz łatwo dodać dane wejściowe z wiersza poleceń lub pobrać je z pliku.

Po zapełnieniu wszystkich zmiennych, ładowany jest HTTP:Request z parametrami GET i wysyłany do LWP:UserAgent. Otrzymana „wiadomość” to wynik testu walidacji e-mail jako tablica. Możesz użyć JSON i DUMPER do wyświetlenia wyniku lub po prostu przekazać tablicę do dalszego przetwarzania.

VB.net

Visual Basic nie jest wizualny i nie jest podstawowy (według mnie), ale jest na #6 miejscu w indeksie języków TIOBE, więc zaczynamy.

Istnieją inne sposoby na to, ale najprostszą drogą do sukcesu jest użycie SDK Visual Studio na platformie Windows. Uruchom Visual Studio, rozpocznij nowy projekt i wybierz Visual Basic, następnie wybierz console.app.  Upewnij się, że używasz wersji VB, nie wersji C# – łatwo to przeoczyć w 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.


W tym momencie możesz edytować linie ręcznie lub skopiować/wkleić kod stąd i zaoszczędzić dużo czasu. Aby ten kod działał, musisz dodać zmienną środowiskową Windows.  Najłatwiej to zrobić, otwierając wiersz poleceń i używając setx.exe w ten sposób: 

C:\Users\me>setx SPARKPOST_API_KEY  "142<redacted<redacted>c531c3"

W Windows 10 jest to stosowane do środowiska użytkownika, ale nie jest od razu dostępne w bieżącej sesji poleceń, więc testowanie tego za pomocą „set” nie zadziała, ale będzie dostępne dla kodu. Jeśli zbudujesz i wykonasz kod zawarty w repozytorium, zobaczysz wynik walidacji. Dla deweloperów budujących konsumentów webhook produkcji potrzebujących walidacji adresów e-mail na dużą skalę, nasz przewodnik konsumentów webhook Azure Functions pokazuje, jak budować bezserwerowe rozwiązania, które mogą efektywnie obsługiwać przepływy walidacji.

Rust

Rust to język do programowania systemów i usług internetowych, który koncentruje się na wydajności, bezpieczeństwie i współbieżności. Jak mówi Wikipedia, Rust był „najbardziej ukochanym językiem programowania” w ankiecie Stack Overflow Developer Survey od 2016 roku.

Kod Rust w naszym repozytorium Github używa biblioteki reqwest z tokio async, podobnie jak przykład w Rust Cookbook. (To nie jest literówka, nazwa biblioteki reqwest jest pisana właśnie w ten sposób). Dołączyliśmy plik konfiguracyjny menedżera pakietów cargo, więc możesz budować i uruchamiać za pomocą:

cd rust_recipient_validation cargo run

To skompiluje pakiet do wykonawczego kodu i uruchomi go:

Finished dev [unoptimized + debuginfo] target(s) in 0.10s
Running `target/debug/rust_recipient_validation`
Status: 200 OK
Body: : (etc)

Kod używa std:env do odczytu zmiennej środowiskowej SPARKPOST_API_KEY. Klauzula match obsługuje sytuację, gdy klucz jest niezdefiniowany. Jeśli wszystko jest w porządku, tworzony jest nowy reqwest::Client i wystawiane jest wywołanie asynchroniczne, po którym następuje .await? (patrz dokumentacja reqwest). Wygląda na to, że Async, zamiast prostszego wywołania blokującego, jest potrzebne do ustawienia nagłówków żądania. Tekst korpusu odpowiedzi odczytywany jest przy pomocy drugiego .await?, zgodnie z tym przykładem.

Podsumowanie

W tym artykule omówiliśmy przykłady kodu Validate Odbiorcy w wielu językach. Oto nasza prośba do Ciebie.

Daj nam znać, jeśli uważasz, że pominęliśmy Twój ulubiony język. Może nie mamy tylu przykładów, co The Fibonacci Project, ale chętnie dodamy więcej. Również, jeśli uważasz, że nasze przykłady można ulepszyć, daj nam znać!

Inne wiadomości

Czytaj więcej z tej kategorii

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

Kompletna, AI-native platforma, która skaluje się wraz z Twoim business.

Produkt

Rozwiązania

Zasoby

Company

Ustawienia prywatności

Już wkrótce

Social

Biuletyn

Bądź na bieżąco z Bird dzięki cotygodniowym aktualizacjom do Twojej skrzynki odbiorczej.

Zarejestruj się

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

Kompletna, AI-native platforma, która skaluje się wraz z Twoim business.

Produkt

Rozwiązania

Zasoby

Company

Ustawienia prywatności

Social

Biuletyn

Bądź na bieżąco z Bird dzięki cotygodniowym aktualizacjom do Twojej skrzynki odbiorczej.

Zarejestruj się