
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ągać i upuszczać całą listę do walidacji. Możesz również użyć API do walidacji pojedynczych adresów, dzięki czemu możesz zintegrować walidację bezpośrednio z przepływem wpisywania adresu.
Jakiś czas temu stworzyliśmy narzędzie wiersza poleceń Python korzystające z tego API. Rozmawialiśmy o tym, co powinniśmy zrobić dla innych języków – i oto jesteśmy! Zaczynajmy.
Ten folder repozytorium na Githubie zawiera działające przykłady wywołań API walidacji odbiorców w około tuzinie różnych języków. Staramy się obejmować najpopularniejsze odpowiednie języki.
Typowy sposób pracy z tymi wszystkimi przykładami to:
Pobierz swój klucz z zmiennej środowiskowej
SPARKPOST_API_KEY
Wykonaj wywołanie API do
/api/v1/recipient-validation/single/
aby zwalidować odbiorcęOdbierz odpowiedź w formacie JSON z wynikiem
Wydrukuj wynik
SparkPost ma biblioteki dla niektórych, ale nie wszystkich języków tutaj omówionych. Zdecydowaliśmy się napisać te przykłady „w sposób rodzimy”, aby a) objąć więcej języków, b) pokazać, jak prosty może być kod bazowy, oraz c) umożliwić Ci wyraźne zobaczenie podobieństw i różnic między językami.
Bash / Curl
PHP
Zaufane PHP ma kilka różnych sposobów na wykonywanie wywołań API HTTPS. Tutaj wybraliśmy użycie curl_setopt
i curl_exec
. (https://www.php.net/manual/en/function.curl-exec.php)
Jeśli wolisz HTTP_Request2 lub pecl_http, to Postman ma wbudowany generator kodu, którego można użyć do tworzenia podobnych przykładów – wystarczy skonfigurować działające żądanie GET i użyć przycisku „Code”.

Python
To wykorzystuje popularny moduł requests, który jest wysokopoziomowy i dzięki temu łatwy w użyciu. Ten przykład sprawdza zwrócony kod statusu, konwertuje wynik JSON z powrotem na obiekt słownika Pythona i drukuje wynikowy obiekt zamiast samego ciągu znaków.
Jeśli wolisz wbudowaną bibliotekę http.client, Postman może również wygenerować kod dla niej; nie jest to dużo dłuższe.
Node.js
Istnieje wiele różnych bibliotek node.js HTTP(S). Zacząłem od starszego pakietu request (używając funkcji zwrotnej), ale jest przestarzały i nie jest już aktywnie utrzymywany. Wybrałem nowszy pakiet axios (używając promises).
Postman może również dostarczyć Ci przykład natywny w Javascript i Unirest, w razie gdybyś wolał te.
Ponieważ ten kod wymaga dostępu do Twojego klucza API, zdecydowanie zalecamy wywoływanie 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 z kodem Ruby; użyłem biblioteki Net::http i śledziłem ten przykład (który okazuje się być bardzo zbliżony do kodu, który Postman generuje automatycznie).
Napotkałem na pewną osobliwość języka/biblioteki, która jest warta wyjaśnienia. Samo ustawienie użycia URI, które zaczyna się od „https://” nie wystarczy, musisz 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 formie niezaszyfrowanej), 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 funkcja języka/biblioteki wydawała mi się niebezpieczna.
Java
Nie napisałem żadnego poważnego kodu w Javie wcześniej, ale łatwo było to poskładać, podążając za ogólnym podejściem używanym w SparkPost library dla innych wywołań GET.
Przy okazji, używanie VS Code jako mojego edytora/debuggera działało naprawdę dobrze dla wszystkich języków tutaj, dając mi podświetlanie składni, kroki debuggera/przeglądanie zmiennych itp. The InputStreamReader
i BufferedReader
konstrukcje są podobne do (i zakładam, że zostały skopiowane przez) Go.
C / C++
To była podróż wzdłuż ścieżki wspomnień, ponieważ napisałem dużo kodu C w latach 90., niektóry z nich nadal działa głęboko w sieciach telekomunikacyjnych gdzieś. Ponieważ historia C poprzedza nowoczesną sieć Web, nie jest zaskoczeniem, że wsparcie bibliotek to zadanie manualne. Musimy pobrać (i skompilować) najnowszą wersję Libcurl, łącząc z biblioteką OpenSSL – zobacz README dla rzeczywistych kroków.
To wydaje się dużo pracy w porównaniu z nowoczesnymi językami, szczególnie gdy Go (lub Lua, lub Python, lub którykolwiek z innych) są wystarczająco szybkie dla tego rodzaju zadań.
Inną rzeczą, którą zapomniałem, mimo że noszę blizny z poprzednich bitew, jest przerażenie związane z alokacją pamięci! Aby uprościć przykład, uprzednio zaalokowałem długość ciągu URL jako 1024 znaki i sprawdziłem długość adresu e-mail (używając strlen
) zanim scaliliśmy do niego (używając strcat
).
Traktujemy ciąg Autoryzacji z połączonym kluczem API w ten sam sposób... nawet gdy wiemy, że prawidłowy klucz API nigdy nie będzie zbyt długi... to nie jest żadne zabezpieczenie! 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 zmiennej stosu i obliczyć, jak długie muszą 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 ryzyku, jakie codziennie podejmują programiści C, starając się unikać przekroczeń bufora i nieoczekiwanych skutków ubocznych. Co prowadzi nas do ..
Lua
Lua jest znany ze swojej łatwej koegzystencji z kodem C i tutaj w SparkPost używaliśmy Lua intensywnie do dostosowywania zasad w naszym oprogramowaniu Momentum na miejscu MTA. Możesz go również używać jako samodzielnego języka skryptowego i jest naprawdę przyjemny również do tego celu.
Z Lua 5.3 i menedżerem pakietów luarocks, używamy bibliotek luasocket
i luasec
. Pokazując swoje dziedzictwo integracji C, łączymy się z naszą lokalną biblioteką OpenSSL. Proces instalacji luarocks wywołuje kompilator gcc
(lub dowolny używany kompilator C), więc dodanie nowych bibliotek zajmuje chwilę.
Kod Lua jest dość prosty. Znak — oznacza komentarze. Funkcja https.request
zapewnia wiele wartości zwracanych (trochę jak w Pythonie i Go). Konkatenacja ciągów jest wykonywana za pomocą operatora .. (zamiast + w Pythonie).
Ciało odpowiedzi z tego wywołania jest obsługiwane za pomocą modułu “ltn12” – zobacz tutaj. To umożliwia efektywne zarządzanie danymi, które mogą być zwracane w wielu „fragmentach”. Jak wyjaśnia ten artykuł:
Fabryka tabel tworzy zbiornik, który przechowuje wszystkie uzyskane dane w tabeli. Dane mogą być później efektywnie połączone w jeden ciąg dzięki funkcji bibliotecznej table.concat.
Nasz przykład po prostu konkatenuje tabelę t i drukuje ją; możesz użyć filtra do dalszego przetwarzania.
Perl
Chociaż Perl jest znany ze swoich one liners, to nie jest jeden z nich. Perl został zaprojektowany do bardzo szybkiego wyszukiwania i modyfikacji dokumentów, ale w rzeczywistości jest zdolny do znacznie więcej. Kiedyś napisałem cały system kontroli zapasów w Perlu. Idź to rozgryźć. W i e c...
Ten skrypt korzysta z LWP::UserAgent i HTTP::Request i opcjonalnie z pakietów JSON i Data::Dumper, w zależności od tego, jak chcesz zobaczyć wynik. Jak w przypadku wszystkich innych skryptów na tej stronie, powinieneś wcześniej ustawić zmienną środowiskową SPARKPOST_API_KEY
na swój wygenerowany klucz API, który zawiera funkcję weryfikacji odbiorców. Ten skrypt twardo koduje $recipient = ‘test@gmail.com’, ale możesz łatwo dodać dane wejściowe z linii poleceń lub je pobrać z pliku.
Po wypełnieniu wszystkich zmiennych ładujemy HTTP:Request z parametrami GET i wysyłamy go do LWP:UserAgent. Wynikową „wiadomością” jest wynik testu weryfikacji e-mail w postaci tablicy. Możesz użyć JSON i DUMPER, aby wyświetlić wynik, lub po prostu przekazać tablicę do dodatkowego przetwarzania.
VB.net
Visual Basic nie jest wizualny i nie jest prosty (IMHO), ale jest na #6 miejscu w TIOBE language index, więc zaczynamy.
Są inne sposoby na zrobienie tego, ale najłatwiejszą ścieżką do sukcesu jest użycie Visual Studio SDK na platformie Windows. Uruchom Visual Studio, rozpocznij nowy projekt i wybierz Visual Basic, a następnie wybierz console.app. Upewnij się, że używasz wersji VB, a nie wersji C# - łatwo to przeoczyć w SDK.

Na tym etapie możesz edytować linie ręcznie lub skopiować/wkleić kod stąd do VS i zaoszczędzić trochę czasu. Aby kod zadziałał, musisz dodać zmienną środowiskową Windows. Najprostszym sposobem na to jest otwarcie okna poleceń i użycie 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 natychmiastowo 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 uruchomisz kod zawarty w repo, zobaczysz wynik walidacji. Dla deweloperów budujących produkcyjnych konsumentów webhooków, którzy muszą skalować walidację adresów email, nasz Azure Functions webhook consumer guide pokazuje, jak budować bezserwerowe rozwiązania, które mogą efektywnie obsługiwać przepływy pracy związane z walidacją.
Rust
Rust to język do programowania systemów i usług internetowych skoncentrowany na wydajności, bezpieczeństwie i współbieżności. Jak mówi Wikipedia, Rust był „najbardziej lubianym językiem programowania” w Stack Overflow Developer Survey od 2016 roku.
Kod Rust w naszym repozytorium Github wykorzystuje bibliotekę reqwest
z tokio
async, podobnie jak ten przykład z książki kucharskiej Rust. (To nie błąd, nazwa biblioteki reqwest
jest tak właśnie napisana). Dołączyliśmy plik konfiguracyjny menedżera pakietów cargo configuration file, dzięki czemu możesz budować i uruchamiać za pomocą:
cd rust_recipient_validation cargo run
To skompiluje pakiet do kodu wykonywalnego i uruchomi go:
Finished dev [unoptimized + debuginfo] target(s) in 0.10s Running `target/debug/rust_recipient_validation` Status: 200 OK Body: : (itp.)
Kod używa std:env
do odczytu zmiennej środowiskowej SPARKPOST_API_KEY
. Klauzula match obsługuje przypadek, gdy klucz nie jest zdefiniowany. Jeśli wszystko jest w porządku, tworzony jest nowy reqwest::Client
i wydawane jest asynchroniczne wywołanie, po którym następuje .await?
(zobacz tutaj). Wywołanie asynchroniczne, zamiast prostszego wywołania blokującego, wydaje się być potrzebne do ustawienia nagłówków żądania. Tekst odpowiedzi jest odczytywany przy użyciu drugiego .await?
, zgodnie z tym przykładem.
Podsumowanie
W tym artykule przedstawiliśmy przykłady kodu weryfikacji odbiorcy w wielu językach. Oto nasze 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 chcielibyśmy dodać więcej. Również, jeśli uważasz, że nasze przykłady można poprawić, daj nam znać!