G

M

Inizia

Validazione del destinatario: esempi di codice di verifica email

G

M

Inizia

Validazione del destinatario: esempi di codice di verifica email

SparkPost Recipient Validation è ora disponibile sia per i clienti SparkPost esistenti che per i nuovi clienti non mittenti. Utilizza un'analisi potente basata sui dati su miliardi di eventi di rimbalzo, consegna e coinvolgimento giornalieri per addestrare il nostro algoritmo, offrendoti uno degli strumenti di validazione email più potenti disponibili sul mercato, in modo da poter inviare email in modo più intelligente.

Questo articolo spiega come ottenere il massimo dai dati che riceverai su ciascun destinatario validato: vedrai che classifichiamo gli indirizzi come “validi”, “rischiosi”, “neutrali”, “non consegnabili” e “con errore di battitura”. Ti forniamo un codice “reason” e anche un “did_you_mean” per errori noti negli indirizzi.



Richieste API

Nell'app web di SparkPost, puoi trascinare e rilasciare un intero elenco per la validazione. Puoi anche usare l'API per validare singoli indirizzi, così puoi integrare la validazione direttamente nel tuo flusso di inserimento degli indirizzi.

Tempo fa abbiamo sviluppato uno strumento da riga di comando Python utilizzando questa API. Abbiamo discusso cosa fare per altre lingue – ed eccoci qui! Cominciamo.

Questa cartella del repository di Github contiene esempi funzionanti di chiamate all'API di Validazione dei Destinatari in circa una dozzina di lingue diverse. Cerchiamo di coprire le lingue più popolari applicabili.

Il modo comune per lavorare attraverso tutti questi esempi è:

  • Raccogli la tua chiave dalla variabile d'ambiente SPARKPOST_API_KEY

  • Esegui una chiamata API a /api/v1/recipient-validation/single/ per validare un destinatario

  • Ricevi indietro una stringa di risposta, contenente i dati formattati JSON con il risultato

  • Stampa il risultato

SparkPost ha librerie per alcune, ma non tutte le lingue coperte qui. Abbiamo scelto di scrivere questi esempi in modo “nativo”, quindi potevamo a) coprire più lingue, b) mostrare quanto semplice possa essere il codice sottostante, e c) permetterti di vedere chiaramente le somiglianze e le differenze tra le lingue.



Bash / Curl

Questo vince il premio per il codice più breve – utilizza semplicemente lo strumento da riga di comando “curl” per effettuare la richiesta e stampare la risposta direttamente sul terminale. Puoi vedere che l'output è una stringa che contiene JSON; in realtà non eseguiamo il parsing degli attributi individuali del risultato.



PHP

Il fidato PHP ha alcuni modi diversi di effettuare chiamate API HTTPS. Qui abbiamo scelto di usare curl_setopt e curl_exec. (https://www.php.net/manual/en/function.curl-exec.php)

Se preferisci HTTP_Request2 o pecl_http, allora Postman ha un generatore di codice integrato che puoi usare per creare esempi simili – basta impostare una richiesta GET funzionante e utilizzare il pulsante “Code”.



Python

Questo utilizza il popolare modulo requests, che è di alto livello e quindi facile da usare. Questo esempio verifica il codice di stato restituito, converte il JSON dei risultati di nuovo in un oggetto dizionario Python e stampa l'oggetto risultante piuttosto che solo una stringa.

Se preferisci la libreria integrata http.client, Postman può generare codice anche per quella; non è molto più lungo.



Node.js

Ci sono molte diverse librerie HTTP(S) per node.js. Ho iniziato con il vecchio pacchetto request (utilizzando una funzione di callback) ma è deprecato e non è più mantenuto attivamente. Ho scelto il pacchetto più recente axios (usando promises). 

Postman può anche darti un esempio nativo Javascript e Unirest, nel caso tu preferisca quelli.

Poiché questo codice necessita di accesso alla tua chiave API, consigliamo vivamente di chiamare la nostra API dal tuo lato server, mai dal lato client (browser/dispositivo mobile).



Go

Go mira a una filosofia di “un buon modo” per fare qualcosa; in questo caso, utilizzando le librerie “batterie incluse” integrate net/http, encoding/json e altre.

La lunghezza è dovuta principalmente alle clausole di controllo degli errori esplicite if err != nil {} ovunque (nessuna eccezione LOL).

Declariamo anche la struttura dell'oggetto dei risultati con tag di campo, per permetterci di “smontare” la stringa JSON restituita. Sovrapponiamo i tag “results” e “errors” per consentire entrambi i tipi di ritorno.

Mi piacciono la velocità, la sicurezza tipologica e la chiarezza di Go, anche se il codice è più lungo rispetto ai nostri esempi precedenti.



C#

Non sono molto familiare con C# – per me, sembra abbastanza simile a Java, piuttosto che a C. Sono stato in grado di mettere insieme questo seguendo gli esempi mostrati nella libreria di richieste System.Net.Http.

Postman può generare automaticamente il codice d'esempio usando RestSharp, se preferisci quello.



Ruby

Questa è stata la mia prima prova con il codice Ruby; ho utilizzato la libreria Net::http e seguito questo esempio (che si rivela molto vicino al codice che Postman genera automaticamente).

Mi sono imbattuto in una particolarità del linguaggio/libreria che vale la pena spiegare. Solo impostando un URI che inizia con “https://” non è sufficiente, devi specificare esplicitamente http.use_ssl = true

Senza questo, il tuo codice tenterà una richiesta sulla porta 443 – ma senza usare SSL/TLS (cioè in chiaro), e SparkPost giustamente rifiuterà di autorizzare la richiesta. Non provare questo a casa, perché la tua chiave API è nell'intestazione di Autorizzazione. Questa caratteristica di linguaggio/libreria mi è sembrata poco sicura.



Java

Non ho scritto alcun programma serio in Java prima, ma è stato facile metterlo insieme seguendo l'approccio generale utilizzato nella libreria di SparkPost per altre chiamate GET.

Tra l'altro, utilizzare VS Code come editor/debugger ha funzionato davvero bene per tutte le lingue qui, fornendomi evidenziazione della sintassi, debug step-by-step/visualizzazione delle variabili ecc. Costrutti InputStreamReader e BufferedReader sono simili a (e suppongo siano stati copiati da) Go.



C / C++

Questo è stato un tuffo nel passato, dato che ho scritto molto codice C negli anni '90, alcuni ancora in esecuzione in profondità nelle reti di telecomunicazioni da qualche parte. Poiché la storia di C precede il Web moderno, non sorprende che il supporto delle librerie sia un compito manuale. Dobbiamo scaricare (e compilare) una versione recente di Libcurl, collegandosi a una libreria OpenSSL – vedere il README per i passaggi effettivi.

Questo sembra molto lavoro rispetto ai linguaggi moderni, specialmente quando Go (o Lua, o Python, o qualsiasi altro) sono abbastanza veloci per compiti come questo.

L'altra cosa che avevo dimenticato, nonostante i segni di battaglie precedenti, è la difficoltà dell'allocazione della memoria! Per mantenere semplice l'esempio, ho preallocato la lunghezza della stringa URL come 1024 caratteri, e ho controllato la lunghezza degli indirizzi email (utilizzando strlen) prima di concatenare in esso (utilizzando strcat).

Trattiamo la stringa di Autorizzazione con una chiave API concatenata allo stesso modo .. anche se sappiamo che una chiave API valida non sarà mai troppo lunga .. ciò non è protezione! L'input dell'utente proveniente da una variabile d'ambiente potrebbe essere qualsiasi cosa. È necessario programmare in modo difensivo.

Uno sviluppatore più sofisticato potrebbe usare malloc invece dell'allocazione della variabile stack, e calcolare quanto devono essere lunghi esattamente i caratteri uniti. Dover pensare a questa complessità extra mi ha dato un dolore ai diodi sul mio lato sinistro; mi ha ricordato dei rischi che i programmatori C corrono ogni giorno, cercando di evitare buffer overflow e effetti collaterali inattesi. Che ci porta a ..



Lua

Lua è conosciuto per la sua facile coesistenza accanto a un corpo di codice C, e qui in SparkPost, abbiamo usato Lua ampiamente per personalizzazioni di Policy all'interno del nostro MTA on-premises Momentum. Puoi anche usarlo come linguaggio di scripting stand-alone, ed è piuttosto bello anche per quello.

Con Lua 5.3 e il gestore di pacchetti luarocks, utilizziamo le librerie luasocket e luasec. Mostrando la sua eredità di integrazione C, ci colleghiamo alla nostra libreria OpenSSL locale. Il processo di installazione di luarocks chiama il compilatore gcc (o qualsiasi compilatore C tu stia usando), quindi aggiungere nuove librerie richiede tempo.

Il codice Lua è piuttosto semplice. I caratteri — segnano i commenti.  La funzione https.request fornisce valori di ritorno multipli (un po' come Python e Go). La concatenazione delle stringhe è fatta con l'operatore .. (invece di + in Python).

Il corpo della risposta di questa chiamata viene gestito con il modulo “ltn12” – vedi qui. Ciò consente una gestione efficiente dei dati che potrebbero essere restituiti in “blocchi” multipli. Come spiega quell'articolo:

La fabbrica della tabella crea un sink che memorizza tutti i dati ottenuti in una tabella. I dati possono successivamente essere concatenati in modo efficiente in una stringa singola con la funzione di libreria table.concat.

Il nostro esempio concatena semplicemente la tabella t e lo stampa; potresti usare un filtro per eseguire più elaborazioni.



Perl

Mentre Perl è famoso per i suoi one-liner, questo non è uno di loro.  Perl è stato progettato per una ricerca e modifica molto veloce dei documenti, ma è in realtà capace di molto di più.  Una volta ho scritto un intero suite di controllo dell'inventario in Perl.  Provaci.   In ogni caso…

Questo script utilizza LWP::UserAgent e HTTP::Request e opzionalmente i pacchetti JSON e Data::Dumper a seconda di come desideri visualizzare l'output. Come con tutti gli altri script in questa pagina, dovresti impostare in precedenza una variabile d'ambiente SPARKPOST_API_KEYalla tua chiave API generata che include la funzione di Validazione dei Destinatari. Questo script codifica la variabile $recipient = ‘test@gmail.com’ ma puoi facilmente aggiungere input da riga di comando o consumare da un file.

Dopo che tutte le variabili sono popolati, carichiamo una richiesta HTTP con parametri GET e la inviamo all'LWP::UserAgent.  Il “messaggio” risultante è il risultato del test di validazione email come array.  Puoi usare JSON e DUMPER per visualizzare il risultato o semplicemente passare l'array per ulteriori elaborazioni.



VB.net

Visual Basic non è visuale e non è di base (IMHO), ma è il numero 6 nell'indice delle lingue TIOBE quindi eccoci qui.

Ci sono modi diversi per farlo, ma il percorso più semplice verso il successo è utilizzare l'SDK Visual Studio in una piattaforma Windows. Avvia Visual Studio, avvia un nuovo progetto e seleziona Visual Basic, quindi seleziona console.app.  Assicurati di usare la versione VB non la versione C# – è facile perdere di vista nell'SDK.



A questo punto puoi modificare le linee manualmente o copiare/incollare il codice da qui su VS e risparmiare un sacco di tempo. Per far funzionare questo codice, devi aggiungere una variabile di ambiente di Windows.  Il modo più semplice per farlo è aprire un prompt dei comandi e usare setx.exe in questo modo: 

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

In Windows 10, questo viene applicato al tuo ambiente utente, ma non è immediatamente disponibile nella sessione del comando corrente, quindi testarlo con un “set” non funzionerà, ma sarà disponibile per il codice. Se costruisci ed esegui il codice incluso nel repo, vedrai il risultato della validazione.



Rust

Rust è un linguaggio per la programmazione di sistemi e servizi web focalizzato su prestazioni, sicurezza e concorrenza. Come Wikipedia dice, Rust è stato il “linguaggio di programmazione più amato” nel sondaggio degli sviluppatori di Stack Overflow dal 2016.

Il codice Rust nel nostro repo di Github utilizza la libreria reqwest con tokio async, simile a questo esempio dal ricettario Rust. (Non è un errore di battitura, il nome della libreria reqwest è scritto proprio così). Abbiamo incluso un file di configurazione del gestore dei pacchetti cargo, così puoi costruire ed eseguire con:

cd rust_recipient_validation cargo run

Questo compilerà il pacchetto in codice eseguibile e lo eseguirà:

Dev [non ottimizzato + info debug] obiettivi in 0,10s In esecuzione `target/debug/rust_recipient_validation` Stato: 200 OK Corpo: : (ecc)

Il codice utilizza std:env per leggere la variabile d'ambiente SPARKPOST_API_KEY. Una clausola di corrispondenza gestisce il caso in cui la chiave non è definita. Se tutto va bene, viene creato un nuovo reqwest::Client e viene emessa una chiamata async, seguita da un .await?  (vedi qui). L'async, piuttosto che la più semplice chiamata di blocco, sembra necessaria per impostare le intestazioni delle richieste. Il testo del corpo della risposta viene letto con un secondo .await?, come questo esempio.



Riassunto

In questo articolo, abbiamo esaminato esempi di codice di Validazione dei Destinatari in molte lingue. Ecco la nostra richiesta a voi.

Fateci sapere se pensate che ci sia sfuggita la vostra lingua preferita. Potremmo non avere tanti esempi quanto Il Progetto Fibonacci, ma ci piacerebbe aggiungerne alcuni di più. Inoltre, se pensate che i nostri esempi possano essere migliorati, fatecelo sapere!

Scopri Bird

Prenota una demo e scopri come Bird può trasformare la tua azienda.

Automate

Newsletter

Rimani aggiornato con Bird attraverso aggiornamenti settimanali nella tua inbox.

Bird numero di partita IVA: NL 850209092B01, numero KVK: 51874474

Scopri Bird

Prenota una demo e scopri come Bird può trasformare la tua azienda.

Automate

Newsletter

Rimani aggiornato con Bird attraverso aggiornamenti settimanali nella tua inbox.

Bird numero di partita IVA: NL 850209092B01, numero KVK: 51874474

Scopri Bird

Prenota una demo e scopri come Bird può trasformare la tua azienda.

Reach

Grow

Manage

Automate

Risorse

Company

Newsletter

Rimani aggiornato con Bird attraverso aggiornamenti settimanali nella tua inbox.

Bird numero di partita IVA: NL 850209092B01, numero KVK: 51874474