
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 entrada de direcciones.
Hace un tiempo creamos una herramienta de línea de comandos en Python usando esta API. Hablamos sobre lo que deberíamos hacer para otros lenguajes, ¡y aquí estamos! Empecemos.
Esta carpeta del repositorio de Github tiene ejemplos de llamadas de la API de Validación de Destinatarios en aproximadamente una docena de lenguajes diferentes. Intentamos cubrir los lenguajes aplicables más populares.
La forma común de trabajar con todos estos ejemplos es:
Obtén tu clave del entorno de variables
SPARKPOST_API_KEY
Haz 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 los lenguajes.
Bash / Curl
PHP
Trusty 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 funcional y utiliza 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 JSON de resultados nuevamente en un objeto diccionario de Python y imprime el objeto resultante en lugar de solo una cadena.
Si prefieres la biblioteca integrada 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 se mantiene activamente. Elegí el paquete más nuevo axios (usando promises).
Postman también te puede dar 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
This was my first attempt at Ruby code; I used the Net::http library, and followed este ejemplo (que resulta ser muy parecido al código que Postman auto-genera).
Me encontré con una peculiaridad del lenguaje / biblioteca que vale la pena explicar. Simplemente configurar usando un URI que comienza 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 plano), y SparkPost rechazará la autorización de la solicitud. No intentes esto en casa, porque tu clave de 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 armar esto siguiendo el enfoque general utilizado en la biblioteca SparkPost para otras llamadas GET.
Por cierto, usar VS Code como mi editor / depurador funcionó muy bien para todos los lenguajes aquí, dándome resaltado de sintaxis, depuración paso a paso / visualización de variables, etc. The InputStreamReader
y BufferedReader
constructos son similares a (y supongo que fueron copiados por) Go.
C / C++
Esto fue un viaje por el camino de los recuerdos, ya que escribí mucho código en C en la década de 1990, algunos todavía funcionan en redes de telecomunicaciones en algún lugar. Como el 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, enlazando a una biblioteca OpenSSL – vea el README para los pasos reales.
Esto parece ser mucho trabajo comparado con 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 lo aterrador 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 deben ser las cadenas unidas. Tener que pensar en esta complejidad adicional me dio un dolor en los diodos por mi lado izquierdo; me recordó los riesgos que los programadores de C enfrentan todos los días, tratando de evitar desbordamientos de búfer y efectos secundarios inesperados. Lo que nos lleva a ..
Lua
Lua es conocido por su fácil convivencia junto a un cuerpo de código C, y aquí en SparkPost, usamos Lua extensivamente para personalizaciones de Policy dentro de nuestro MTA Momentum en las instalaciones. También puedes usarlo como un lenguaje de scripting independiente, y es bastante agradable para eso, también.
Con Lua 5.3 y el gestor de paquetes luarocks, usamos las librerías luasocket
y luasec
. Mostrando su herencia de integración con C, enlazamos a nuestra biblioteca local OpenSSL. El proceso de instalación de luarocks llama al compilador gcc
(o cualquier compilador C que estés usando), así que agregar nuevas bibliotecas lleva 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 respuesta de esta llamada se maneja con el módulo “ltn12” – ver aquí. Eso permite un manejo eficiente de datos que podrían ser devueltos en múltiples “chunks”. Como explica ese artículo:
La fábrica de tablas crea un sumidero que almacena todos los datos obtenidos en una tabla. Los datos luego pueden ser concatenados eficientemente 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 que Perl es famoso por sus one liners, este no es uno de ellos. Perl fue diseñado para búsquedas y modificaciones de documentos muy rápidas, 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 o s m o d o 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, debes preestablecer una variable de entorno SPARKPOST_API_KEY
a tu clave API generada que incluye la función de Validación de Recipientes. Este script codifica de forma rígida $recipient = ‘test@gmail.com’ pero puedes fácilmente agregar entrada desde la línea de comandos o consumir desde 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 “mensaje” 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 (en mi humilde opinión), pero es el número 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. Inicia Visual Studio, comienza un nuevo proyecto y selecciona Visual Basic, luego selecciona console.app. Asegúrate de usar la versión VB, no la versión C# - es fácil perder eso en el SDK.

En este punto puedes editar las líneas manualmente o copiar/pegar el código desde aquí en VS y ahorrar mucho tiempo. Para que este código funcione, necesitas 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 al entorno de tu usuario, pero no está disponible inmediatamente en la sesión de comando actual, así que probarlo con un “set” no funcionará, pero estará disponible para el código. Si construyes y ejecutas el código incluido en el repo, verás el resultado de validación. Para los desarrolladores que construyen consumidores de webhook de producción que necesitan validar direcciones de correo electrónico a escala, nuestra guía para consumidores webhook de Azure Functions muestra cómo construir soluciones sin servidor que pueden manejar flujos de trabajo de validación eficientemente.
Rust
Rust es un lenguaje para programación de sistemas y servicios web que está enfocado en el rendimiento, seguridad y concurrencia. Como dice Wikipedia, 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 usa la biblioteca reqwest
con tokio
async, similar a este ejemplo del recetario 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, así que puedes construir y ejecutar con:
cd rust_recipient_validation cargo run
Esto compilará el paquete en código ejecutable y lo ejecutará:
dev terminado [sin optimizar + información debug] objetivo(s) en 0.10s Ejecutando `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 el que la clave no está definida. Si todo está bien, se crea un nuevo reqwest::Client
y se emite una llamada async, seguida de un .await?
(ver aquí). Async, en lugar de la simple llamada bloqueante, parece ser necesaria para establecer 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 Recipientes en muchos idiomas. Aquí está nuestra solicitud para ti.
Dinos si crees que hemos pasado por alto tu idioma favorito. Quizás no tengamos tantos ejemplos como The Fibonacci Project, pero nos encantaría añadir algunos más. Además, si crees que nuestros ejemplos pueden mejorarse, ¡háznoslo saber!