
SparkPost 收件人验证现在适用于现有 SparkPost 客户和新的非发送客户。它每天对数十亿次退信、投递和参与事件进行强大的数据驱动分析,用以训练我们的算法,为您带来市场上最强大的数据驱动电子邮件验证工具之一,让您能够更智能地发送电子邮件。
SparkPost Recipient Validation 现已同时向现有 SparkPost 客户和新的非发送客户提供。它每天对数十亿次退信、投递和参与事件进行强大的数据驱动分析,以训练我们的算法,为您提供市场上最强大的数据驱动电子邮件验证工具之一,让您的邮件发送更智能。这代表了电子邮件验证技术的最新演变,从简单的语法检查转向复杂的数据驱动方法,提供更准确的结果。
本文将解释如何充分利用您在每个被验证收件人上收到的数据——您将看到我们将地址分类为“有效”、“风险”、“中立”、“无法投递”和“拼写错误”。我们会为您提供“原因”代码以及已知地址拼写错误的“did_you_mean”。
API请求
在 SparkPost 网络应用中,您可以拖放整个列表进行验证。您也可以使用API来验证单个地址,因此您可以将验证直接构建到您的地址输入工作流程中。
不久前,我们使用这个 API 提出了一个Python 命令行工具。我们讨论了其他语言应该做什么——这就是我们现在的所在!让我们开始吧。
这个Github 仓库文件夹中有接收者验证 API 调用例程的例子,涵盖大约十二种不同的语言。我们努力涵盖最流行的相关语言。
处理所有这些例子的常见方法是:
从环境变量
SPARKPOST_API_KEY
中获取您的密钥调用 API
/api/v1/recipient-validation/single/
验证接收者接收返回的响应字符串,包含 JSON 格式的数据结果
打印输出结果
SparkPost 为其中的一些,但不是所有的语言提供库。我们选择用“本地”的方式编写这些例子,这样可以 a) 涵盖更多语言,b) 显示底层代码的简单性,并且 c) 使您能清楚地了解语言之间的相似与差异。
Bash / Curl
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 也可以为其生成代码;而且并不长。
去
Go 努力追求“唯一正确的方法”这一理念;在这种情况下,使用内置的“电池包含”库 net/http,encoding/json 等。
长度主要是由于到处都有显式错误检查子句 if err != nil {}
(无例外 笑)。
我们还声明了带有字段标签的结果对象结构,以使我们能够“反序列化”返回的 JSON 字符串。我们覆盖“results”和“errors”标签以允许两种返回类型。
我喜欢 Go 的速度、类型安全性和清晰性,尽管代码比我们之前的示例更长。
C#
我对 C# 不太熟悉——对我来说,它看起来更像 Java,而不是 C。我能够根据请求库 System.Net.Http 中显示的示例把这个组合在一起。
如果你更喜欢的话,Postman 可以使用 RestSharp 自动生成示例代码。
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秘钥的Authorization字符串。即使我们知道有效的API秘钥永远不会太长.. 这也不是保护!来自环境变量的用户输入可能是任何东西。你必须进行防御性编程。
一个更高级的开发者可能会使用malloc
而不是堆栈变量分配,并精确计算连接字符串需要的长度。考虑到这个额外的复杂性让我左侧二极管疼痛;这让我想起了C程序员每天都面临的风险,试图避免缓冲区溢出和意外的副作用。这就引出了..
Lua
Lua 以其能够与 C 代码轻松共存而著称,而在 SparkPost,我们 广泛使用了 Lua 来进行我们的 Momentum 内部 MTA 的策略自定义。你也可以将其用作独立的脚本语言,而且这在此用途上也非常不错。
随着 Lua 5.3 和 luarocks 包管理器的出现,我们使用库 luasocket
和 luasec
。它展示了其 C 集成遗产,我们链接到本地的 OpenSSL 库。luarocks 的安装过程会调用 gcc
编译器(或者您正在使用的任何 C 编译器),所以添加新库需要一段时间。
Lua 代码相当简单。字符 — 用于注释。函数 https.request
提供 多个返回值(有点像 Python 和 Go)。字符串拼接是用 运算符 .. (而不是 Python 中的 +)。
此调用的响应体通过 "ltn12" 模块处理 – 请参见 此处。这使得可以高效处理可能以多个“块”返回的数据。正如该文章解释的那样:
表工厂创建一个存储所有获取数据到表中的接收器。稍后可以通过 table.concat 库函数将数据高效地连接成一个字符串。
我们的例子只是合并表 t 并输出;你可以使用过滤器进行更多处理。
Perl
While Perl 是著名的 单行代码,这不是其中之一。 Perl 被设计用于非常快速的文档搜索和修改,但实际上能够做更多。我曾经用 Perl 编写了一个完整的库存控制套件。去想象一下。 总之…
此脚本使用了 LWP::UserAgent 和 HTTP::Request,并根据您希望查看输出的方式,选择性地使用 JSON 和 Data::Dumper 包。与此页面上的所有其他脚本一样,您应该预先设置环境变量SPARKPOST_API_KEY
为您生成的包含 Recipient Validation 功能的 API 密钥。此脚本硬编码了 $recipient = ‘test@gmail.com’,但您可以轻松添加命令行输入或从文件中读取。
在所有变量填充后,我们用 GET 参数加载一个 HTTP:Request 并将其发送到 LWP:UserAgent。结果的“消息”是电子邮件验证测试的结果,作为一个数组。您可以使用 JSON 和 DUMPER 来显示结果,或者仅将数组传递给额外的处理。
VB.net
Visual Basic 既不直观也不基础(IMHO),但它在TIOBE 语言指数中排名第6,所以我们开始吧。
有其他方法可以做到这一点,但成功的最简单路径是使用Windows平台上的Visual Studio SDK。启动 Visual Studio,开始一个新项目并选择 Visual Basic,然后选择 console.app。请务必使用 VB 版本而不是 C# 版本 - 在 SDK 中很容易忽略这一点。

此时,您可以手动编辑行或将代码从这里复制/粘贴到 VS 中,以节省大量时间。为了使此代码有效,您需要添加一个 Windows 环境变量。最简单的方法是打开命令提示符并像这样使用 setx.exe:
C:\Users\me>setx SPARKPOST_API_KEY "142<已编辑<已编辑>c531c3"
在 Windows 10 中,这应用于您的用户环境,但在当前命令会话中不可立即使用,因此用“set”测试它将不起作用,但代码可以使用它。如果您在仓库中构建并执行包含的代码,您将看到验证结果。对于需要大规模验证电子邮件地址的生产 webhook 消费者开发人员,我们的Azure Functions webhook 消费者指南展示了如何构建能够有效处理验证工作流的无服务器解决方案。
Rust
Rust 是一种用于系统和网络服务编程的语言,专注于性能、安全性和并发性。正如 Wikipedia 所说,自 2016 年以来,Rust 一直是 Stack Overflow 开发者调查中“最受欢迎的编程语言”。
我们 Github 仓库中的 Rust 代码 使用了带有 tokio
异步的 reqwest
库,类似于 Rust Cookbook 中的这个示例。(这不是拼写错误,reqwest
库名就是这样拼写的)。我们已经包含了一个 cargo 包管理器配置文件,所以你可以这样构建和运行:
cd rust_recipient_validation cargo run
这将会把包编译成可执行代码并运行:
已完成 dev [未优化 + 调试信息] 目标在 0.10s 内运行 `target/debug/rust_recipient_validation` 状态:200 OK 内容:: (等等)
代码使用std:env
读取SPARKPOST_API_KEY
环境变量。一个匹配子句处理密钥未定义的情况。如果一切顺利,将创建一个新的reqwest::Client
并发出异步调用,随后进行.await?
(见这里)。似乎需要使用异步,而不是更简单的阻塞调用来设置请求头。响应主体文本按照此示例使用第二个.await?
读取。
总结
在本文中,我们介绍了多种语言中的Recipient Validation代码示例。以下是我们对您的请求。
如果您认为我们遗漏了您喜爱的语言,请告知我们。我们可能没有像The Fibonacci Project那么多的例子,但我们愿意添加更多。此外,如果您认为我们的示例可以改进,请让我们知道!