SparkPost 收件人验证现在对现有SparkPost客户和新非发送客户提供。它每天对数十亿次反弹、交付和参与事件进行强大的数据驱动分析,以训练我们的算法,为您提供市场上最强大的数据驱动电子邮件验证工具之一,从而使您能够更智能地发送电子邮件。
本文解释了如何从每个经过验证的收件人那里获得最大的数据 - 您会看到我们将地址分类为“有效”、“风险”、“中立”、“不可投递”和“拼写错误”。我们给您一个“原因”代码,以及已知地址拼写错误的“did_you_mean”。
API 请求
在SparkPost网页版应用中,您可以拖放整个列表进行验证。您还可以使用API来验证单个地址,因此您可以将验证直接构建到地址输入工作流中。
不久前,我们使用这个API想出了一个Python命令行工具。我们讨论了对其他语言应该做什么 - 现在我们就开始吧!
这个Github存储库文件夹中有约十种不同语言的有效收件人验证API调用示例。我们尽量覆盖最流行的适用语言。
工作流程的常见方式是:
从环境变量
SPARKPOST_API_KEY
中获取您的密钥对
/api/v1/recipient-validation/single/
进行API调用以验证收件人接收响应字符串,包含结果的JSON格式数据
打印结果
SparkPost为一些语言提供了库,但并不是所有这里覆盖的语言。我们选择编写这些示例为“原生”,以便我们可以a)覆盖更多语言,b)展示基础代码的简单性,c)使您清晰地看到语言之间的相似性和差异。
Bash / Curl
这是最短代码的赢家 - 它简单地使用命令行工具“curl”来发起请求,并将回复直接打印到终端。您可以看到输出是一个字符串,包含JSON;我们实际上没有解析各个结果属性。
PHP
值得信赖的PHP有几种不同的方法来进行HTTPS API调用。这里我们选择使用curl_setopt
和curl_exec
。(https://www.php.net/manual/en/function.curl-exec.php)
如果您更喜欢HTTP_Request2或pecl_http,那么Postman有一个内置代码生成器,您可以使用它来创建类似的示例 - 只需设置一个可工作的GET请求并使用“代码”按钮。
Python
这使用流行的requests模块,这是一个高级模块,因此易于使用。此示例检查返回的状态代码,将结果JSON转换回Python字典对象,并打印出结果对象,而不仅仅是一个字符串。
如果您更喜欢内置的http.client库,Postman也可以生成代码;代码并没有太长。
Node.js
有许多不同的node.js HTTP(S)库。我开始使用较旧的request包(使用回调函数),但它已被弃用,不再积极维护。 我选择了更新的axios包(使用promise)。
Postman还可以为您提供JavaScript本机示例和Unirest,以防您更喜欢这些。
由于这段代码需要访问您的API密钥,我们强烈建议从服务器端调用我们的API,而不是从客户端(浏览器/移动设备)侧调用。
Go
Go追求“一种好的方式”来做某事;在这种情况下,使用内置的“配备电池”的库net/http、encoding/json等。
长度主要是由于每个地方都有显式的错误检查条款if err != nil {}
(无异常,哈哈)。
我们还声明了结果对象的结构及字段标签,以便能够“解组”返回的JSON字符串。我们叠加“结果”和“错误”标签,以同时允许两种类型的返回。
尽管代码比我们之前的示例长,我还是喜欢Go的速度、安全类型和清晰性。
C#
我对C#不太熟悉 - 对我来说,它看起来更像Java,而不是C。按照请求库System.Net.Http中展示的示例,我能够把这个组合在一起。
如果您偏好,Postman可以使用RestSharp自动生成示例代码。
Ruby
这是我第一次尝试Ruby代码;我使用了Net::http库,并遵循了这个示例(结果非常接近Postman自动生成的代码)。
我遇到了一些语言/库的奇特之处值得解释。仅仅设置一个以“https://”开头的URI是不够的,您必须特别设置http.use_ssl = true
。
没有这一点,您的代码将尝试在443端口发起请求 - 但是不使用SSL/TLS(也就是以明文),SparkPost将正确拒绝授权请求。你最好不要在家里试这个,因为您的API密钥是在授权头中。这个语言/库的特性让我觉得不安全。
Java
我之前没有写过任何严肃的Java代码,但是通过遵循SparkPost库中其他GET调用使用的一般方法很容易将其组合在一起。
顺便说一下,使用VS Code作为我的编辑器/调试器在这里的所有语言中都非常有效,给我提供了语法高亮、调试步骤/变量查看等功能。The InputStreamReader
和BufferedReader
构造与Go非常相似(我假设它们是被模仿的)。
C / C++
这是一次追溯记忆的旅程,因为在1990年代我写了很多C代码,其中一些仍在某处的电信网络中运行。由于C的历史早于现代网络,因此早已不令人惊讶的是库支持是一项手动任务。我们需要下载(并编译)最近版本的Libcurl,链接到OpenSSL库 - 请参阅README以获取实际步骤。
这与现代语言相比感觉像是很多工作,特别是Go(或Lua,或Python,或任何其他语言)在执行此类任务时速度足够快。
我还忘记了一件事情,尽管在之前的战斗中有过伤痕,那就是内存分配的恐怖!为了保持示例简单,我预分配了URL字符串长度为1024个字符,并在连接到它之前(使用strlen
)检查电子邮件地址的长度(使用strcat
)。
我们以相同的方式处理具有连接的API密钥的授权字符串...尽管我们知道有效的API密钥永远不会太长...这并没有保护!来自环境变量的用户输入可以是任何东西。您必须以防范的方式编程。
更复杂的开发者可能会使用malloc
来代替栈变量分配,并计算合并字符串的确切长度。必须考虑这个额外的复杂性让我感到一阵疼痛在我左侧二极管上下肢;这让我想起了C程序员每天面临的风险,试图避免缓冲区溢出和意外副作用。这 приводит我们到……
Lua
Lua以其与C代码的良好共存而闻名,在SparkPost,我们在Momentum内部 MTA 中广泛使用 Lua进行策略自定义。您还可以将其用作独立脚本语言,并且它在这方面也相当不错。
使用Lua 5.3和luarocks包管理器,我们使用luasocket
和luasec
库。展示出它的C集成遗产,我们链接到本地OpenSSL库。luarocks安装过程调用gcc
编译器(或您使用的任何C编译器),因此添加新库需要一些时间。
Lua代码相当简单。字符 — 标记注释。 函数https.request
提供多个返回值(有点像Python和Go)。字符串连接通过运算符 ..(而不是Python的+)完成。
此调用的响应主体通过“ltn12”模块处理 - 请参见这里。这使得可以有效处理可能以多个“块”返回的数据。正如那篇文章所解释的:
表工厂创建一个存储所有获得数据的接收器。该数据可以稍后使用表.concat库函数高效地连接成一个单一字符串。
我们的示例只连接了表t并将其打印出来;您可以使用过滤器进行更多处理。
Perl
虽然Perl以单行代码而闻名,但这并不是其中之一。 Perl的原设计是为了快速文档搜索和修改,但实际上能够做更多的事情。 我曾经用Perl编写过整个库存控制套件。 无论如何……
此脚本使用LWP::UserAgent和HTTP::Request,并根据您想如何查看输出选择性地使用JSON和Data::Dumper软件包。与此页面上的所有其他脚本一样,您应该预先设置一个环境变量SPARKPOST_API_KEY
,以您的生成的API密钥(包括收件人验证功能)。此脚本硬编码了$recipient = ‘test@gmail.com’,但您可以轻松添加命令行输入或从文件中读取。
填充所有变量后,我们使用GET参数加载HTTP:Request并将其发送到LWP:UserAgent。 结果“消息”是电子邮件验证测试的结果,作为一个数组。 您可以使用JSON和DUMPER显示结果,或者仅将数组传递给其他处理。
VB.net
Visual Basic不是可视化的,也不是基础(个人观点),但它在TIOBE语言指数中排名第6,所以我们开始吧。
有其他方式来做到这一点,但成功的最简单路径是使用Visual Studio SDK在Windows平台上启动。启动Visual Studio,启动新项目并选择Visual Basic,然后选择console.app。 确保使用的是VB版本而不是C#版本 - 这在SDK中很容易被忽略。
此时,您可以手动编辑行或将代码从这里复制/粘贴到VS中并节省大量时间。为了使这段代码工作,您需要添加一个Windows环境变量。 最简单的方法是打开命令提示符,并使用setx.exe像这样:
C:\Users\me>setx SPARKPOST_API_KEY "142<被删除<redacted>c531c3"
在Windows 10中,这会应用到您的用户环境,但在当前命令会话中不会立即可用,因此使用“set”进行测试将无效,但它将在代码中可用。如果您构建并执行存储库中包含的代码,您将看到验证结果。
Rust
Rust是一种以性能、安全性和并发性为重点的系统和网络服务编程语言。正如维基百科所说,自2016年以来,Rust在Stack Overflow开发者调查中一直是“最受欢迎的编程语言”。
我们的Rust代码在我们的Github存储库中使用reqwest
库和tokio
异步,类似于这个来自Rust烹饪书的示例。(那不是错别字,reqwest
库的名称就是这样拼写的)。我们包含了一个cargo包管理器配置文件,因此您可以构建并运行:
cd rust_recipient_validation cargo run
这会将包编译为可执行代码,并运行它:
完成dev [未优化 + 调试信息]目标(s)在0.10秒内运行`target/debug/rust_recipient_validation`状态:200 OK主体:(等等)
该代码使用std:env
读取SPARKPOST_API_KEY
环境变量。一个匹配子句处理密钥未定义的情况。如果一切正常,将创建新的reqwest::Client
并发出异步调用,随后进行.await?
(请参见这里)。异步而不是更简单的阻塞调用似乎是设置请求头所必需的。响应正文文本通过第二个.await?
读取,按照这个例子。
总结
在本文中,我们介绍了多种语言的收件人验证代码示例。这是我们向您的请求。
如果您认为我们错过了您最喜欢的语言,请告知我们。我们可能没有斐波那契项目这样多的示例,但我们乐意添加更多。如果您认为我们可以改进这些示例,请告诉我们!