
La validación de destinatarios de SparkPost ya está disponible tanto para los clientes existentes de SparkPost como para los nuevos clientes que no envían. Utiliza un análisis impulsado por datos en miles de millones de eventos de rebote, entrega y compromiso diariamente para entrenar nuestro algoritmo, ofreciéndote una de las herramientas de validación de correo electrónico más potentes impulsadas por datos en el mercado, para que puedas enviar correos electrónicos de manera más inteligente.
SparkPost Recipient Validation ahora está disponible tanto para los clientes existentes de SparkPost como para nuevos clientes que no envían. Utiliza un potente análisis basado en datos de miles de millones de eventos de rebote, entrega y compromiso diariamente para entrenar nuestro algoritmo, ofreciéndote una de las herramientas de validación de correo electrónico basadas en datos más potentes del mercado, para que puedas enviar correos electrónicos de manera más inteligente. Esto representa la última evolución en técnicas de validación de correo electrónico, yendo más allá de las simples verificaciones de sintaxis hacia enfoques sofisticados basados en datos que brindan resultados más precisos.
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”, “neutrales”, “no entregables” y “error tipográfico”. Te proporcionamos un código de “razón” y también un “did_you_mean” para errores tipográficos de dirección conocidos.
API requests
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, de modo que puedas 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 usando esta API. Hablamos sobre lo que deberíamos hacer para otros idiomas – ¡y aquí estamos! Empecemos.
Esta carpeta del repositorio de Github tiene ejemplos de llamadas de la API de Validación de Destinatarios en alrededor de una docena de idiomas diferentes. Tratamos de cubrir los idiomas más populares aplicables.
La forma común de trabajar con todos estos ejemplos es:
Recoge tu clave del 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 en formato JSON con el resultado
Imprime el resultado
SparkPost tiene bibliotecas para algunos, pero no todos los idiomas cubiertos aquí. Elegimos escribir estos ejemplos de manera “nativa” en su lugar, para poder a) cubrir más idiomas, b) mostrar lo simple que puede ser el código subyacente, y c) permitirte ver claramente las similitudes y diferencias entre los lenguajes.
Bash / Curl
PHP
El confiable PHP tiene algunas formas diferentes de realizar 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 integrado que puedes usar para crear ejemplos similares: solo configura una solicitud GET funcionando y usa el botón “Code”.

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 el resultado JSON de nuevo en un objeto de 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) de node.js. Comencé con el paquete más antiguo request (usando una función de callback) pero está en desuso y ya no es mantenido activamente. Elegí el paquete más nuevo axios (usando promesas).
Postman también puede proporcionarte 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 por una filosofía de “una buena manera” de hacer algo; en este caso, utilizando las bibliotecas integradas “baterías incluidas” net/http, encoding/json y otras.
La longitud se debe principalmente a las cláusulas de verificación de errores explícitas if err != nil {}
en todos lados (sin excepciones LOL).
También declaramos la estructura del objeto de resultados con etiquetas de campo, para permitirnos “deserializar” la cadena devuelta de JSON. Superponemos las etiquetas “results” y “errors” para permitir ambos tipos de retorno.
Me gusta la velocidad, seguridad de tipos y 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 Java, en lugar de C. Pude armar esto siguiendo ejemplos mostrados en la biblioteca de solicitudes System.Net.Http.
Postman puede generar automáticamente código de ejemplo usando RestSharp, si lo prefieres.
Ruby
Este fue mi primer intento con el código de Ruby; usé la biblioteca Net::http, y seguí este ejemplo (que resulta ser muy similar al código que Postman autogenera).
Me encontré con una peculiaridad de idioma / biblioteca que vale la pena explicar. Configurar solo usando un URI que comience con "https://" no es suficiente, tienes que establecer específicamente http.use_ssl = true
.
Sin esto, tu código intentará una solicitud en el puerto 443 - pero sin usar SSL/TLS (es decir, en texto claro), y SparkPost rechazará correctamente autorizar la solicitud. No intentes esto en casa, porque tu clave API está en el encabezado de Autorización. Esta característica de idioma / biblioteca me pareció insegura.
Java
No he escrito ningún Java serio antes, pero fue fácil juntarlo siguiendo el enfoque general utilizado en la SparkPost library para otras llamadas GET.
Por cierto, usar VS Code como mi editor / depurador funcionó realmente bien para todos los idiomas aquí, dándome resaltado de sintaxis, depuración paso a paso / 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 carril de la memoria, ya que escribí mucho código en C en la década de 1990, algo que todavía se ejecuta en las redes de telecomunicaciones en algún lugar. Como la historia de C precede a la Web moderna, no es sorprendente que el soporte de bibliotecas sea una tarea manual. Necesitamos descargar (y compilar) una versión reciente de Libcurl, vinculando a una biblioteca OpenSSL – vea el README para los pasos reales.
Esto parece mucho trabajo comparado con los lenguajes modernos, particularmente cuando Go (o Lua, o Python, o cualquiera de los otros) son suficientemente rápidos para tareas como esta.
La otra cosa que había olvidado, a pesar de llevar las cicatrices de batallas anteriores, es el espanto de 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 la 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 .. aunque sabemos que una clave API válida nunca será demasiado larga .. ¡eso no es protección! La entrada del usuario que proviene 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 la asignación de variables de 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 de mi lado izquierdo; me recordó los riesgos que los programadores de C enfrentan cada día, tratando de evitar desbordamientos de buffer 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, usamos Lua extensivamente para personalizaciones de políticas dentro de nuestro MTA Momentum en las instalaciones. También puedes usarlo como un lenguaje de scripting independiente, y es bastante bueno para eso también.
Con Lua 5.3 y el administrador de paquetes luarocks, usamos las bibliotecas luasocket
y luasec
. Mostrando su herencia de integración con C, enlazamos con nuestra biblioteca local de OpenSSL. El proceso de instalación de luarocks llama al compilador gcc
(o cualquier compilador C que estés utilizando), 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 múltiples valores de retorno (un poco como Python y Go). La concatenación de cadenas se realiza con el operador .. (en lugar de + en Python).
El cuerpo de la respuesta de esta llamada se maneja con el módulo “ltn12” – ver aquí. Eso permite un manejo eficiente de los datos que podrían ser retornados en múltiples “trozos”. Como explica ese artículo:
La fábrica de tablas crea un sumidero que almacena todos los datos obtenidos en una tabla. Los datos pueden luego ser concatenados eficientemente en una sola 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 que Perl es famoso por sus one liners, este no es uno de ellos. Perl fue diseñado para una búsqueda y modificación de documentos muy rápida, pero en realidad es capaz de mucho más. Una vez escribí un conjunto completo de control de Inventario en Perl. Vaya figura. D e t o d a s f o r m a s…
Este script hace uso de LWP::UserAgent y HTTP::Request y opcionalmente los paquetes JSON y Data::Dumper dependiendo de cómo quieras ver el resultado. Como con todos los otros scripts en esta página, deberías preestablecer una variable de entorno SPARKPOST_API_KEY
a tu clave API generada que incluye la función de Validación de Receptores. Este script codifica $recipient = ‘test@gmail.com’ pero fácilmente puedes agregar entrada por línea de comandos o consumir de un archivo.
Después de que todas las variables están pobladas, cargamos un HTTP:Request con parámetros GET y lo enviamos al LWP:UserAgent. El “message” resultante es el resultado de la prueba de validación del correo electrónico como un array. Puedes usar JSON y DUMPER para mostrar el resultado o simplemente pasar el array para procesamiento adicional.
VB.net
Visual Basic no es visual y no es básico (IMHO), pero está en el puesto #6 en el índice de lenguajes TIOBE, así que aquí vamos.
Hay otras maneras de hacer esto, pero el camino más fácil hacia el éxito es usar el SDK de Visual Studio en una plataforma Windows. Inicie Visual Studio, comience un nuevo proyecto y seleccione Visual Basic, luego seleccione console.app. Asegúrese de usar la versión VB, no la versión C# – es fácil perder eso en el SDK.

En este punto, puede editar líneas manualmente o copiar/pegar el código desde aquí en VS y ahorrar una gran cantidad de tiempo. Para que este código funcione, necesita agregar una variable de entorno de Windows. La forma más fácil de hacer esto 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 su entorno de usuario, pero no está inmediatamente disponible en la sesión de comando actual, por lo que probarlo con un “set” no funcionará, pero estará disponible para el código. Si compila y ejecuta el código incluido en el repositorio, verá el resultado de la validación. Para desarrolladores que construyen consumidores de webhook de producción que necesitan validar direcciones de correo electrónico a escala, nuestra guía del consumidor de webhook de Azure Functions muestra cómo construir soluciones sin servidor que pueden manejar flujos de trabajo de validación de manera eficiente.
Rust
Rust es un lenguaje para la programación de sistemas y servicios web que se centra en el rendimiento, la seguridad y la concurrencia. Como dice Wikipedia, Rust ha sido el “lenguaje de programación más querido” 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
async, similar a este ejemplo del manual de Rust. (No es un error tipográfico, el nombre de la biblioteca reqwest
se escribe así). Hemos incluido un archivo de configuración del gestor 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 [no optimizado + infodepuración] target(s) en 0.10s Corriendo `target/debug/rust_recipient_validation` Estado: 200 OK Cuerpo: : (etc)
El código usa std:env
para leer la variable de entorno SPARKPOST_API_KEY
. Una cláusula match maneja el caso en que la clave no está definida. Si todo va bien, se crea un nuevo reqwest::Client
y se emite una llamada asíncrona, seguida por un .await?
(ver aquí). Async, en lugar de la llamada de bloqueo más simple, parece ser necesario para establecer los encabezados de solicitud. El texto del cuerpo de la respuesta se lee con un segundo .await?
, según este ejemplo.
Resumen
En este artículo, hemos recorrido ejemplos de código de Validación de Destinatarios en muchos idiomas. Aquí está nuestra solicitud para usted.
Háganos saber si cree que hemos pasado por alto su idioma favorito. Puede que no tengamos tantos ejemplos como The Fibonacci Project, pero nos encantaría agregar algunos más. Además, si cree que nuestros ejemplos pueden mejorarse, ¡háznoslo saber!