
SparkPost 收件人验证现在适用于现有 SparkPost 客户和新的非发送客户。它每天对数十亿次退信、投递和参与事件进行强大的数据驱动分析,用以训练我们的算法,为您带来市场上最强大的数据驱动电子邮件验证工具之一,让您能够更智能地发送电子邮件。
SparkPost Recipient Validation 现已同时向现有 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
PHP
可靠的 PHP 有几种不同的方法来进行 HTTPS API 调用。这里我们选择使用 curl_setopt
和 curl_exec
。 (https://www.php.net/manual/en/function.curl-exec.php)
如果您更喜欢 HTTP_Request2 或 pecl_http,那么 Postman 有一个内置的代码生成器,您可以用它来创建类似的示例—只需设置一个工作中的 GET 请求并使用“Code”按钮。

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 library用于其他GET调用的通用方法,很容易将其拼凑在一起。
顺便说一句,使用VS Code作为我的编辑器/调试器对这里的所有语言都非常有效,为我提供了语法高亮、调试器步进/变量查看等功能。The InputStreamReader
和BufferedReader
构造与Go类似(我假设是Go复制的)。
C / C++
这是一次回忆之旅,因为我在 1990 年代写了很多 C 代码,其中一些代码仍然在某个地方的电信网络中运行。由于C 的历史早于现代网络,因此库支持是手动任务,这并不令人惊讶。我们需要下载(并编译)Libcurl 的最新版本,并链接到一个 OpenSSL 库 - 请参阅README了解实际步骤。
与现代语言相比,这感觉工作量很大,尤其是当 Go(或 Lua,或 Python,或其他任何语言)对这类任务来说已经足够快时。
即使在经历了以前的战斗留下的伤痕之后,我也忘记了的另一件事是内存分配的可怕性!为了简化示例,我预分配了 1024 个字符的 URL 字符串长度,并在合并电子邮件地址之前(使用strlen
)检查长度(使用strcat
)。
我们以同样的方式处理带有连接 API 密钥的授权字符串..即使我们知道有效的 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
虽然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,所以我们来了。
有其他方式可以做到这一点,但最简单的成功之路是使用 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<redacted<redacted>c531c3"
在 Windows 10 中,此设置将应用于您的用户环境,但在当前命令会话中不会立即可用,因此无法通过“set”进行测试,但代码可以使用。如果您构建并执行仓库中包含的代码,您将看到验证结果。对于需要大规模验证电子邮件地址的开发者,我们的Azure Functions webhook consumer guide展示了如何构建能够有效处理验证工作流的无服务器解决方案。
Rust
Rust 是一种用于系统和网络服务编程的语言,专注于性能、安全性和并发性。正如Wikipedia所说,自2016年以来,Rust 一直是 Stack Overflow 开发者调查中“最受喜爱的编程语言”。
我们的 Github 仓库中的 Rust 代码使用reqwest
库与tokio
异步,类似于 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那么多的例子,但我们很乐意添加更多。 同样,如果您认为我们的示例可以改进,请告知我们!