
SparkPost 收件人验证现在适用于现有 SparkPost 客户和新的非发送客户。它每天对数十亿次退信、投递和参与事件进行强大的数据驱动分析,用以训练我们的算法,为您带来市场上最强大的数据驱动电子邮件验证工具之一,让您能够更智能地发送电子邮件。
Business in a box.
探索我们的解决方案。
与我们的销售团队交谈
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请求并使用“Code”按钮。

Python
这使用了流行的requests模块,它是高级的,因此易于使用。此示例检查返回的状态代码,将结果JSON转换回Python字典对象,并打印结果对象而不是仅仅一个字符串。
如果您更喜欢内置的http.client库,Postman 也可以为其生成代码;而且并不长。
去
Go 力求一种“唯一正确的方法”来做某事;在这种情况下,使用内置的“附带电池”库net/http, encoding/json 等。
长度主要是由于明确的错误检查子句 if err != nil {}
无处不在(没有例外 LOL)。
我们还声明了带有字段标签的结果对象结构,以便能够“解组”返回的 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的历史早于现代Web,因此图书馆支持需要手动处理也就不足为奇了。我们需要下载(并编译)Libcurl的最新版本,并链接到OpenSSL库—实际步骤请参见README。
与现代语言相比,这感觉像是很多工作,特别是当Go(或Lua,或Python,或任何其他语言)对这种任务已经足够快时。
另一件我忘记了的事情,尽管之前的战斗让我留下了伤疤,就是内存分配的可怕!为了保持示例简单,我预先分配了URL字符串长度为1024字符,并在我们将其连接到一起之前(使用strcat
)对电子邮件地址长度进行了边界检查(使用strlen
)。
我们以相同的方式处理带有API key的Authorization字符串..即使我们知道一个有效的API key绝不会太长..那也不是保护!来自环境变量的用户输入可能是任何东西。您必须以防御方式编程。
一个更复杂的开发人员可能会使用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不是视觉的,也不是基础的(恕我直言),但它在TIOBE语言指数中排名第六,所以我们来看看。
有其他方法可以做到这一点,但最简单的成功途径是在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”进行测试不会有效,但这将对代码可用。如果您构建并执行repo中包含的代码,您将看到验证结果。
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那么多的例子,但我们愿意添加更多。此外,如果您认为我们的示例可以改进,请让我们知道!