SparkPost Walidacja Odbiorców jest teraz dostępna zarówno dla istniejących klientów SparkPost, jak i dla nowych klientów, którzy nie wysyłają. Wykorzystuje potężną analizę opartą na danych na miliardach zdarzeń związanych z odbiciem, dostarczeniem i zaangażowaniem codziennie, aby wytrenować nasz algorytm, dostarczając Ci jedno z najpotężniejszych narzędzi do walidacji e-maili opartych na danych na rynku, dzięki czemu możesz wysyłać e-maile w bardziej inteligentny sposób.
Ten artykuł wyjaśnia, jak możesz wykorzystać maksymalnie dane, które otrzymasz na temat każdego zwalidowanego odbiorcy – zobaczysz, że klasyfikujemy adresy jako „ważne”, „ryzykowne”, „neutralne”, „niedostarczalne” oraz „literówka”. Podajemy również kod „powodu” oraz „did_you_mean” dla znanych literówek adresów.
Żądania API
W aplikacji internetowej SparkPost możesz przeciągnąć i upuścić całą listę do walidacji. Możesz również skorzystać z API, aby zweryfikować pojedyncze adresy, dzięki czemu możesz wbudować walidację bezpośrednio w swój proces wprowadzania adresu.
Jakiś czas temu opracowaliśmy narzędzie wiersza poleceń Python używające tego 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 odbiorców w około tuzinie różnych języków. Staramy się obejmować najpopularniejsze stosowane języki.
Typowy sposób pracy z tymi przykładami jest następujący:
Pobierz swój klucz z zmiennej środowiskowej
SPARKPOST_API_KEY
Wyślij żądanie API do
/api/v1/recipient-validation/single/
, aby zweryfikować odbiorcęOtrzymaj odpowiedź jako ciąg zawierający dane w formacie JSON z wynikiem
Wydrukuj wynik
SparkPost ma biblioteki dla niektórych, ale nie wszystkich języków omówionych tutaj. Zdecydowaliśmy się napisać te przykłady „w rodzimym stylu”, abyśmy mogli a) objąć więcej języków, b) pokazać, jak prosty może być podstawowy kod i c) umożliwić Ci jasne zobaczenie podobieństw i różnic między językami.
Bash / Curl
To zdobywa nagrodę za najkrótszy kod – po prostu używa narzędzia wiersza poleceń „curl” do składania żądania i bezpośredniego drukowania odpowiedzi w terminalu. Możesz zobaczyć, że wynik to ciąg, zawierający JSON; w rzeczywistości nie analizujemy poszczególnych atrybutów wyniku.
PHP
Funkcjonalny PHP ma kilka różnych sposobów na wykonywanie żądań API HTTPS. Tutaj zdecydowaliśmy się użyć curl_setopt
i curl_exec
. (https://www.php.net/manual/en/function.curl-exec.php)
Jeśli preferujesz HTTP_Request2 lub pecl_http, wtedy Postman ma wbudowany generator kodu, który możesz wykorzystać do tworzenia podobnych przykładów – wystarczy skonfigurować działające żądanie GET i użyć przycisku „Kod”.
Python
To wykorzystuje popularny moduł requests, który jest wysokopoziomowy i dlatego łatwy w użyciu. Ten przykład sprawdza zwrócony kod statusu, konwertuje wyniki JSON z powrotem na obiekt słownika Pythona i drukuje uzyskany obiekt, a nie tylko ciąg.
Jeśli wolisz wbudowaną bibliotekę http.client, Postman może również wygenerować kod dla tego; nie jest to dużo dłuższe.
Node.js
Jest wiele różnych bibliotek HTTP(S) dla node.js. Zacząłem od starszego pakietu request (używając funkcji zwrotnej), ale jest on przestarzały i już nie jest aktywnie utrzymywany. Wybrałem nowszy pakiet axios (używając obietnic).
Postman może również dostarczyć Ci przykład w natywnym JavaScript i Unirest, na wypadek gdybyś wolał je.
Ponieważ ten kod potrzebuje dostępu do Twojego klucza API, zdecydowanie zalecamy wywoływanie naszego API z serwera, nigdy z klienta (przeglądarki / urządzenia mobilnego).
Go
Go dąży do filozofii „jednego dobrego sposobu” robienia czegoś; w tym przypadku, korzystając z wbudowanych bibliotek „w komplecie” net/http, encoding/json i innych.
Długość wynika głównie z jawnych klauzul sprawdzania błędów if err != nil {}
wszędzie (brak wyjątków LOL).
Ogłaszamy również strukturę obiektów wyników z tagami pól, aby umożliwić nam „rozpakowanie” zwróconego ciągu JSON. Nakładamy tagi „wyniki” i „błędy”, aby umożliwić oba rodzaje powrotów.
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 to dość podobnie do Javy, a nie C. Udało mi się to złożyć, postępując zgodnie z przykładami pokazanymi w bibliotece żądań System.Net.Http.
Postman może automatycznie generować przykładowy kod z użyciem RestSharp, jeśli wolisz to.
Ruby
To była moja pierwsza próba kodu w Ruby; użyłem biblioteki Net::http, i podążyłem za tym przykładem (który okazuje się być bardzo podobny do kodu generowanego automatycznie przez Postman).
Napotkałem jedną osobliwość językową/biblioteczną, którą warto wyjaśnić. Samo skonfigurowanie za pomocą URI, które zaczyna się od „https://” nie jest wystarczające, musisz jawnie 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 czystym), a SparkPost słusznie odmówi autoryzacji żądania. Nie próbuj tego w domu, ponieważ twój klucz API jest w nagłówku autoryzacji. Ta cecha językowa/biblioteki wydawała mi się niebezpieczna.
Java
Nigdy nie pisałem poważnego kodu w Javie, ale było łatwo to złożyć, śledząc ogólną metodę używaną w bibliotece SparkPost do innych wywołań GET.
Przy okazji, używanie VS Code jako edytora / debuggera dobrze sprawdziło się we wszystkich językach tutaj, dając mi podświetlanie składni, kroki debugowania / widoki zmiennych itp. The InputStreamReader
oraz BufferedReader
są podobne do (i przypuszczam, że zostały skopiowane przez) Go.
C / C++
To była podróż w przeszłość, ponieważ napisałem wiele kodu C w latach 90., część nadal działa gdzieś w sieciach telekomunikacyjnych. Ponieważ historia C wyprzedza nowoczesny Internet, nie jest zaskoczeniem, że wsparcie biblioteczne to zadanie ręczne. Musimy pobrać (i skompilować) najnowszą wersję Libcurl, łącząc się z biblioteką OpenSSL – zobacz README w celu uzyskania rzeczywistych kroków.
To wydaje się być dużą ilością pracy w porównaniu z nowoczesnymi językami, szczególnie gdy Go (lub Lua, lub Python, lub którekolwiek z innych) są wystarczająco szybkie do zadań takich jak to.
Inną rzeczą, o której zapomniałem, mimo że noszę blizny z poprzednich bitew, jest straszność alokacji pamięci! Aby zachować prostotę przykładu, zarezerwowałem długość ciągu URL jako 1024 znaki i sprawdziłem długość adresu e-mail (używając strlen
) przed skopiowaniem do niego (używając strcat
).
Traktujemy ciąg Autoryzacji z połączonym kluczem API w ten sam sposób .. chociaż wiemy, że ważny klucz API nigdy nie będzie zbyt długi .. to nie jest żadne zabezpieczenie! Wejście użytkownika pochodzące z zmiennej środowiskowej może być czymkolwiek. Musisz programować defensywnie.
Bardziej wyrafinowany programista może użyć malloc
zamiast alokacji zmiennej stosowej i obliczyć, jak długo muszą być połączone ciągi. Myślenie o tym dodatkowym rozrachunku sprawiło, że poczułem ból w diodach po lewej stronie; przypomniało mi to ryzyko, które programiści C ponoszą każdego dnia, próbując unikać przepełnień bufora i nieoczekiwanych skutków ubocznych. A to nas prowadzi do ..
Lua
Lua jest znana z łatwego współistnienia obok ciała kodu C, a tutaj w SparkPost użyliśmy Lua intensywnie do dostosowywania Polityki w naszym Momentum na nieprzypadkowym MTA. Możesz również używać go jako samodzielnego języka skryptowego, i to też jest całkiem miłe.
Z Lua 5.3 i menedżerem pakietów luarocks korzystamy z bibliotek luasocket
i luasec
. Pokazując swoje dziedzictwo integracyjne C, łączymy się z naszą lokalną biblioteką OpenSSL. Proces instalacji luarocks wywołuje kompilator gcc
(lub jakikolwiek kompilator C, który używasz), więc dodawanie nowych bibliotek zajmuje trochę czasu.
Kod Lua jest dość prosty. Znaki — oznaczają komentarze. Funkcja https.request
zapewnia wiele wartości zwracanych (trochę jak Python i Go). Łączenie ciągów wykonuje się za pomocą operatora .. (zamiast + w Pythonie).
Treść odpowiedzi z tego wywołania jest obsługiwana za pomocą modułu „ltn12” – zobacz tutaj. Umożliwia to efektywne przetwarzanie danych, które mogą być zwrócone w wielu „kawałkach”. Jak wyjaśnia ten artykuł:
Fabryka tabeli tworzy zlew, który przechowuje wszystkie pobrane dane w tabeli. Dane mogą być później wydajnie scalone w jeden ciąg za pomocą funkcji bibliotecznej table.concat.
Nasz przykład po prostu łączy tabelę t i wypisuje ją; możesz użyć filtru do dalszego przetwarzania.
Perl
Podczas gdy Perl jest znany ze swoich jednolinijek, to nie jest jedna z nich. Perl został zaprojektowany do bardzo szybkiego przeszukiwania i modyfikacji dokumentów, ale w rzeczywistości potrafi znacznie więcej. Raz napisałem cały zestaw kontroli zapasów w Perl. A tak w ogóle…
Ten skrypt wykorzystuje LWP::UserAgent i HTTP::Request oraz opcjonalnie pakiety JSON i Data::Dumper w zależności od tego, jak chcesz widzieć wyjście. Jak z wszystkimi innymi skryptami na tej stronie, powinieneś wcześniej ustawić zmienną środowiskową SPARKPOST_API_KEY
na swój wygenerowany klucz API, który zawiera funkcję walidacji odbiorców. Ten skrypt twardo koduje $recipient = ‘test@gmail.com’, ale możesz łatwo dodać wejście linii poleceń lub pobierać z pliku.
Po wypełnieniu wszystkich zmiennych ładujemy żądanie HTTP:Request z parametrami GET i wysyłamy je do LWP:UserAgent. Powstała „wiadomość” jest wynikiem testu walidacji e-mail jako tablica. Możesz użyć JSON i DUMPER do wyświetlenia wyniku lub po prostu przesłać tablicę do dalszego przetwarzania.
VB.net
Visual Basic nie jest wizualny i nie jest podstawowy (moim zdaniem), ale jest #6 na indeksie języków TIOBE, więc zaczynajmy.
Jest wiele sposobów na to, ale najłatwiejszą drogą do sukcesu jest wykorzystanie SDK Visual Studio 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ć sporo czasu. Aby ten kod działał, musisz dodać zmienną środowiskową systemu Windows. Najłatwiej to zrobić, otwierając wiersz polecenia i używając setx.exe w ten sposób:
C:\Users\me>setx SPARKPOST_API_KEY "142<redacted<redacted>c531c3"
W systemie Windows 10 to jest stosowane do środowiska użytkownika, ale nie jest od razu dostępne w bieżącej sesji poleceń, więc testowanie za pomocą „set” nie zadziała, ale będzie dostępne w kodzie. Jeśli zbudujesz i wykonasz kod zawarty w repozytorium, zobaczysz wynik walidacji.
Rust
Rust jest językiem 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 jest od 2016 roku „najbardziej kochanym językiem programowania” w badaniach Stack Overflow dla programistów.
Kod Rust w naszym repozytorium Github używa biblioteki reqwest
z tokio
async, podobnie jak ten przykład z książki kucharskiej Rust. (To nie jest błąd, nazwa biblioteki reqwest
jest napisana w ten sposób). Dołączyliśmy plik konfiguracji menedżera pakietów cargo, abyś mógł zbudować i uruchomić przy pomocy:
cd rust_recipient_validation cargo run
To skompiluje pakiet do kodu wykonywalnego i uruchomi go:
Ukończono cel [nieoptymalny + informacje debugowania] w 0.10s Uruchomienie `target/debug/rust_recipient_validation` Status: 200 OK Ciało: : (itd)
Ten kod używa std:env
do odczytania zmiennej środowiskowej SPARKPOST_API_KEY
. Klauzula match obsługuje sytuację, gdy klucz nie jest zdefiniowany. Jeśli wszystko jest w porządku, tworzony jest nowy reqwest::Client
i wydawane jest wywołanie asynchroniczne, które jest następnie oczekiwane za pomocą .await?
(zobacz tutaj). Wywołanie asynchroniczne, zamiast prostszego wywołania blokującego, wydaje się być potrzebne do ustawienia nagłówków żądania. Tekst ciała odpowiedzi odczytuje się za pomocą drugiego .await?
, zgodnie z tym przykładem.
Podsumowanie
W tym artykule przeszliśmy przez przykłady kodu walidacji odbiorców 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 Projekt Fibonacciego, ale chętnie dodamy więcej. Jeśli uważasz, że nasze przykłady można poprawić, daj nam znać!