SparkPost Validación de destinatarios ya está disponible tanto para los clientes existentes de SparkPost como para los nuevos clientes que no envían. Utiliza un análisis poderoso basado en datos sobre miles de millones de eventos de rebote, entrega y participación a diario para entrenar nuestro algoritmo, brindándote una de las herramientas de validación de correos electrónicos basadas en datos más potentes del mercado, para que puedas enviar correos electrónicos de manera más inteligente.
Este artículo explica cómo puedes aprovechar al máximo los datos que recibirás de cada destinatario validado: verás que clasificamos las direcciones como “válidas”, “riesgosas”, “neutras”, “no entregables” y “errores tipográficos”. Te damos un código de “razón” y también un “did_you_mean” para errores tipográficos conocidos en las direcciones.
Solicitudes API
En la aplicación web de SparkPost, puedes arrastrar y soltar una lista completa para validación. También puedes usar la API para validar direcciones individuales, así puedes integrar la validación directamente en tu flujo de trabajo de entrada de direcciones.
Hace un tiempo, creamos una herramienta de línea de comandos de Python utilizando esta API. Hablamos sobre qué deberíamos hacer para otros lenguajes – y aquí estamos. ¡Comencemos!
Esta carpeta del repositorio de Github tiene ejemplos de llamadas a la API de Validación de Destinatarios funcionando en alrededor de una docena de lenguajes diferentes. Intentamos cubrir los lenguajes más populares aplicables.
La forma común de trabajar a través de todos estos ejemplos es:
Obtén tu clave de la variable de entorno
SPARKPOST_API_KEY
Realiza una llamada a la API a
/api/v1/recipient-validation/single/
para validar un destinatarioRecibe de vuelta una cadena de respuesta, conteniendo datos formateados en JSON con el resultado
Imprime el resultado
SparkPost tiene bibliotecas para algunos, pero no todos los lenguajes cubiertos aquí. Elegimos escribir estos ejemplos de manera “nativa” para poder a) cubrir más lenguajes, b) mostrar cuán simple puede ser el código subyacente, y c) permitirte ver claramente las similitudes y diferencias entre lenguajes.
Bash / Curl
Esto gana el premio al código más corto – simplemente utiliza la herramienta de línea de comandos “curl” para hacer la solicitud y imprimir la respuesta directamente en la terminal. Puedes ver que la salida es una cadena, que contiene JSON; en realidad, no analizamos los atributos de resultado individuales.
PHP
PHP confiable tiene algunas maneras diferentes de hacer llamadas API HTTPS. Aquí elegimos usar curl_setopt
y curl_exec
. (https://www.php.net/manual/en/function.curl-exec.php)
Si prefieres HTTP_Request2 o pecl_http, entonces Postman tiene un generador de código incorporado que puedes usar para crear ejemplos similares – solo configura una solicitud GET en funcionamiento y usa el botón “Código”.
Python
Esto utiliza el popular módulo requests, que es de alto nivel y, por lo tanto, fácil de usar. Este ejemplo verifica el código de estado devuelto, convierte los resultados de JSON de vuelta a un objeto diccionario de Python y imprime el objeto resultante en lugar de solo una cadena.
Si prefieres la biblioteca incorporada http.client, Postman también puede generar código para eso; no es mucho más largo.
Node.js
Hay muchas diferentes bibliotecas HTTP(S) para node.js. Comencé con el antiguo paquete request (usando una función de devolución de llamada) pero está en desuso y ya no se mantiene activamente. Elegí el paquete más nuevo axios (usando promesas).
Postman también puede darte un ejemplo nativo de Javascript y Unirest, en caso de que prefieras esos.
Debido a que este código necesita acceso a tu clave API, recomendamos encarecidamente llamar a nuestra API desde tu servidor, nunca desde el lado del cliente (navegador/dispositivo móvil).
Go
Go se esfuerza hacia una filosofía de “una buena manera” de hacer algo; en este caso, utilizando las bibliotecas integradas “con baterías incluidas” net/http, encoding/json y otras.
La longitud se debe principalmente a las cláusulas explícitas de comprobación de errores if err != nil {}
en todas partes (sin excepciones LOL).
También declaramos la estructura del objeto de resultados con etiquetas de campo, para permitirnos “deserializar” la cadena JSON devuelta. Superponemos las etiquetas “resultados” y “errores” para permitir ambos tipos de retorno.
Me gusta la velocidad, la seguridad de tipo y la claridad de Go, incluso si el código es más largo que nuestros ejemplos anteriores.
C#
No estoy tan familiarizado con C# – para mí, parece bastante similar a Java, en lugar de a C. Pude ensamblar esto siguiendo ejemplos mostrados en la biblioteca de solicitud System.Net.Http.
Postman puede generar ejemplos de código automáticamente usando RestSharp, si prefieres eso.
Ruby
Este fue mi primer intento con código Ruby; utilicé la biblioteca Net::http, y seguí este ejemplo (que resulta ser muy parecido al código que Postman genera automáticamente).
Me encontré con una rareza del lenguaje / biblioteca que vale la pena explicar. Simplemente configurar usando una URI que comienza con “https://” no es suficiente, debes establecer específicamente http.use_ssl = true
.
Sin esto, tu código intentará realizar una solicitud en el puerto 443 – pero sin usar SSL/TLS (es decir, en plano), y SparkPost con razón se negará a autorizar la solicitud. No intentes esto en casa, porque tu clave API está en el encabezado de autorización. Esta característica del lenguaje / biblioteca me pareció insegura.
Java
No he escrito ningún Java serio antes, pero fue fácil ensamblar esto siguiendo el enfoque general utilizado en la biblioteca de SparkPost para otras llamadas GET.
Por cierto, usar VS Code como mi editor / depurador funcionó muy bien para todos los lenguajes aquí, brindándome resaltado de sintaxis, pasos de depuración / visualización de variables, etc. The InputStreamReader
y BufferedReader
son similares a (y supongo que fueron copiados por) Go.
C / C++
Este fue un viaje por el camino de la memoria, ya que escribí mucho código C en los años 90, algo que aún se ejecuta en redes de telecomunicaciones en algún lugar. Como la historia del C es anterior a la Web moderna, no es sorprendente que el soporte para bibliotecas sea una tarea manual. Necesitamos descargar (y compilar) una versión reciente de Libcurl, enlazando a una biblioteca OpenSSL – consulta el README para los pasos reales.
Esto parece mucho trabajo en comparación con los lenguajes modernos, especialmente cuando Go (o Lua, o Python, o cualquiera de los demás) son lo suficientemente rápidos para tareas como esta.
La otra cosa que había olvidado, a pesar de llevar las cicatrices de batallas anteriores, es lo aterrador que es la asignación de memoria. Para mantener el ejemplo simple, preasigné la longitud de la cadena URL como 1024 caracteres, y verifiqué los límites de longitud de la dirección de correo electrónico (usando strlen
) antes de concatenar en ella (usando strcat
).
Tratamos la cadena de autorización con una clave API concatenada de la misma manera .. a pesar de que sabemos que una clave API válida nunca será demasiado larga .. ¡eso no es protección! La entrada del usuario proveniente de una variable de entorno podría ser cualquier cosa. Debes programar defensivamente.
Un desarrollador más sofisticado podría usar malloc
en lugar de asignación de variables en la pila, y calcular exactamente cuán largas necesitan ser las cadenas unidas. Tener que pensar en esta complejidad adicional me dio un dolor en los diodos del lado izquierdo; me recordó los riesgos que los programadores de C enfrentan todos los días, tratando de evitar desbordes de búfer y efectos secundarios inesperados. Lo que nos lleva a ..
Lua
Lua es conocido por su fácil coexistencia junto a un cuerpo de código C, y aquí en SparkPost, utilizamos Lua ampliamente para personalizaciones de políticas dentro de nuestro MTA Momentum local. También puedes usarlo como un lenguaje de script independiente, y es bastante agradable para eso, también.
Con Lua 5.3 y el administrador de paquetes luarocks, utilizamos las bibliotecas luasocket
y luasec
. Mostrando su herencia de integración en C, vinculamos a nuestra biblioteca OpenSSL local. El proceso de instalación de luarocks llama al compilador gcc
(o cualquier compilador C que estés usando), por lo que agregar nuevas bibliotecas toma un tiempo.
El código Lua es bastante simple. Los caracteres — marcan comentarios. La función https.request
proporciona valores de retorno múltiples (un poco como Python y Go). La concatenación de cadenas se realiza con el operador .. (en lugar de + en Python).
El cuerpo de respuesta de esta llamada se maneja con el módulo “ltn12” – consulta aquí. Eso permite un manejo eficiente de datos que podrían ser devueltos en múltiples “fragmentos”. Como explica ese artículo:
La fábrica de tablas crea un desagüe que almacena todos los datos obtenidos en una tabla. Los datos se pueden concatenar de manera eficiente en una única cadena con la función de biblioteca table.concat.
Nuestro ejemplo simplemente concatena la tabla t y la imprime; podrías usar un filtro para realizar más procesamiento.
Perl
Mientras Perl es famoso por sus una línea, este no es uno de ellos. Perl fue diseñado para la búsqueda y modificación de documentos muy rápida, pero en realidad es capaz de mucho más. Una vez escribí una suite de control de inventario completa en Perl. Puedes imaginar. D e s e o m a r e f l e x i b l e i m p o r t a n c i a.
Este script utiliza LWP::UserAgent y HTTP::Request y opcionalmente los paquetes JSON y Data::Dumper dependiendo de cómo quieras ver la salida. Al igual que todos los otros scripts en esta página, debes preestablecer una variable de entorno SPARKPOST_API_KEY
a tu clave API generada que incluye la función de Validación de Destinatarios. Este script codifica en duro $recipient = ‘test@gmail.com’ pero puedes agregar fácilmente la entrada de línea de comandos o consumir desde un archivo.
Después de que se pobló todas las variables, cargamos un HTTP:Request con parámetros GET y lo enviamos a LWP:UserAgent. El “mensaje” resultante es el resultado de la prueba de validación de correo electrónico como un array. Puedes usar JSON y DUMPER para mostrar el resultado o simplemente pasar el array para un procesamiento adicional.
VB.net
Visual Basic no es visual y no es básico (en mi opinión), pero es el #6 en el índice de lenguajes TIOBE, así que aquí vamos.
Hay otros modos de hacer esto, pero el camino más fácil al éxito es utilizar el SDK de Visual Studio en una plataforma Windows. Inicia Visual Studio, comienza un nuevo proyecto y selecciona Visual Basic, luego selecciona console.app. Asegúrate de usar la versión de VB, no la versión de C# – es fácil perderse eso en el SDK.
En este punto, puedes editar líneas manualmente o copiar/pegar el código desde aquí en VS y ahorrar mucho tiempo. Para hacer que este código funcione, necesitas agregar una variable de entorno de Windows. La forma más fácil de hacerlo es abrir un símbolo del sistema y usar setx.exe así:
C:\Users\me>setx SPARKPOST_API_KEY "142<redacted<redacted>c531c3"
En Windows 10, esto se aplica a tu entorno de usuario, pero no está inmediatamente disponible en la sesión de comando actual, así que probarlo con un “set” no funcionará, pero estará disponible para el código. Si compilas y ejecutas el código incluido en el repositorio, verás el resultado de la validación.
Rust
Rust es un lenguaje para programación de sistemas y servicios web que se centra en el rendimiento, la seguridad y la concurrencia. Como Wikipedia dice, Rust ha sido el “lenguaje de programación más amado” en la Encuesta de Desarrolladores de Stack Overflow desde 2016.
El código Rust en nuestro repositorio de Github utiliza la biblioteca reqwest
con tokio
asíncrono, similar a este ejemplo del libro de cocina de Rust. (Eso no es un error tipográfico, el nombre de la biblioteca reqwest
se escribe así). Hemos incluido un archivo de configuración para el administrador de paquetes cargo, para que puedas construir y ejecutar con:
cd rust_recipient_validation cargo run
Esto compilará el paquete en código ejecutable y lo ejecutará:
Finalizado dev [sin optimizar + info de depuración] objetivo(s) en 0.10s Ejecutando `target/debug/rust_recipient_validation` Estado: 200 OK Cuerpo: : (etc)
El código utiliza std:env
para leer la variable de entorno SPARKPOST_API_KEY
. Una cláusula de coincidencia maneja el caso donde la clave no está definida. Si todo está bien, se crea un nuevo reqwest::Client
y se emite una llamada asíncrona, seguida de un .await?
(consulta aquí). Asíncrono, en lugar de la llamada más simple de bloqueo, parece ser necesario para establecer encabezados de solicitud. El texto del cuerpo de la respuesta se lee con un segundo .await?
, como en este ejemplo.
Resumen
En este artículo, hemos recorrido ejemplos de código de Validación de Destinatarios en muchos lenguajes. Aquí está nuestra petición para ti.
Déjanos saber si crees que omitimos tu lenguaje favorito. Puede que no tengamos tantos ejemplos como El Proyecto Fibonacci, pero nos encantaría agregar algunos más. Además, si crees que nuestros ejemplos se pueden mejorar, ¡háznoslo saber!