收件人验证:电子邮件验证代码示例
电子邮件
·
2020年7月8日

关键要点
数据驱动的验证,而不是猜测。 Bird的(前称SparkPost的)Recipient Validation使用数十亿真实的投递和互动事件来确定电子邮件地址是否有效、有风险、无法投递或包含拼写错误。
比语法检查更聪明。 与传统的基于正则表达式的工具不同,该模型使用真实数据来分类投递能力,甚至通过“did_you_mean”功能建议更正。
实时集成。 通过 /recipient-validation/single/ API 端点直接在您的注册表单、CRM或批量列表中验证电子邮件地址。
开发者优先的示例。 提供多种编程语言的代码示例,包括Python、Node.js、PHP、Go、C#、Ruby、Java、Rust等,为集成提供便利。
安全最佳实践。 API 密钥应始终存储在服务器端(不要在客户端代码中暴露),使用诸如SPARKPOST_API_KEY的环境变量。
超越验证。 将Recipient Validation与webhook消费者或Azure Functions结合,构建适合生产使用的可扩展无服务器验证工作流。
持续改进。 鼓励开发人员贡献其他语言的示例,确保跨生态系统的全球可访问性。
Q&A 精华
什么是 Recipient Validation?
这是 Bird 的基于API的电子邮件验证系统,将地址分类为有效的、风险的、中性的、无法投递的或拼写错误的,利用来自数十亿真实投递事件的数据。
这与基本语法验证有何不同?
传统验证器仅检查格式;Bird’s系统评估实时数据,例如退信率、参与度指标和递送模式,以做出更智能的预测。
API 返回什么类型的信息?
每个验证响应包括:
状态分类(valid,risky,等)
原因代码(为什么地址被标记)
可选的“did_you_mean” 拼写错误更正
元数据,如定价、国家和状态原因字段
我可以批量验证emails吗?
是的。您可以在网页应用中上传整个列表,或者使用API在您的工作流程中以编程方式验证单个地址。
支持哪些编程语言?
代码示例可用于十多种语言——包括Python、Node.js、PHP、Go、C#、Java、Rust和Perl——涵盖现代和传统系统。
我应该在哪里存储我的 API key?
始终使用环境变量(例如
SPARKPOST_API_KEY)保持在服务器端。切勿将其嵌入客户端脚本或浏览器代码中。Can this be integrated into 自动化工作流程?
当然。您可以使用 Bird 的 Flow Builder 或 Azure Functions 实时验证地址,然后触发后续自动化流程,例如确认电子邮件或 CRM 更新。
为什么企业应该关心验证准确性?
高质量验证提高了发送者的声誉,防止退信,并通过确保每条消息都到达有效的Inbox来提升活动的投资回报率。
开发者接下来会怎样?
Bird 邀请社区为新的语言示例和现有示例的改进做出贡献,帮助扩大全球验证可访问性。
SparkPost 收件人验证现在适用于现有 SparkPost 客户和新的非发送客户。它每天对数十亿次退信、投递和参与事件进行强大的数据驱动分析,用以训练我们的算法,为您带来市场上最强大的数据驱动电子邮件验证工具之一,让您能够更智能地发送电子邮件。
SparkPost Recipient Validation 现已同时向现有 SparkPost 客户和新的非发送客户提供。它每天对数十亿次退信、投递和参与事件进行强大的数据驱动分析,以训练我们的算法,为您提供市场上最强大的数据驱动电子邮件验证工具之一,让您的邮件发送更智能。这代表了电子邮件验证技术的最新演变,从简单的语法检查转向复杂的数据驱动方法,提供更准确的结果。
本文将解释如何充分利用您在每个被验证收件人上收到的数据——您将看到我们将地址分类为“有效”、“风险”、“中立”、“无法投递”和“拼写错误”。我们会为您提供“原因”代码以及已知地址拼写错误的“did_you_mean”。
C#
我对 C# 不太熟悉——对我来说,它看起来更像 Java,而不是 C。我能够根据请求库 System.Net.Http 中显示的示例把这个组合在一起。
如果你更喜欢的话,Postman 可以使用 RestSharp 自动生成示例代码。
API请求
在 SparkPost 网络应用程序中,您可以拖放整个列表进行验证。您还可以使用 API 验证单个地址,因此您可以将验证直接构建到您的地址输入工作流程中。
一段时间前,我们用这个 API 开发了一个 Python 命令行工具。我们讨论了其他语言的解决方案——现在我们来了!让我们开始吧。
这个 Github 存储库文件夹 包含了大约十几种不同语言的工作 Recipient Validation API 调用示例。我们尽力覆盖 最流行的适用语言。
处理所有这些示例的常见方法是:
从环境变量获取您的密钥
SPARKPOST_API_KEY进行 API 调用至
/api/v1/recipient-validation/single/验证接收者接收回响应字符串,其中包含 JSON 格式的数据和结果
输出结果
语言 | 使用的 HTTP 库 | 验证发生位置 | 显著的考虑因素 |
|---|---|---|---|
Bash / Curl | curl CLI | 仅限终端使用 | 不解析响应 JSON |
PHP | curl_setopt | 服务器端 | 有多种库选项可用 |
Python | requests | 脚本或后端应用 | 自动将 JSON 转换为字典 |
Node.js | axios(推荐) | 仅限服务器端 | 避免在客户端暴露 API 密钥 |
Go | net/http + encoding/json | 后端服务 | 使用自定义结构体进行强类型安全 |
C# | System.Net.Http | 服务器应用 | Postman 可以生成 RestSharp 版本 |
Java | HttpURLConnection | 服务器服务 | 冗长但广泛部署 |
C / C++ | libcurl + OpenSSL | 系统级工具 | 需要手动 memory safety |
Lua | luasocket + luasec | 脚本配套 | 可以有效地流式传输分块响应 |
Perl | LWP::UserAgent | 遗留系统 | JSON 解析可选 |
VB.net | Visual Studio SDK | Windows 控制台应用 | 需要环境变量设置 |
Rust | reqwest + tokio async | 现代网络服务 | 处理头需要异步 |
SparkPost 为其中的一些,但并不是全部的语言提供 库。我们选择用“原生”示例来编写这些示例,以便 a) 覆盖更多语言,b) 显示底层代码的简单性,以及 c) 使您能够清楚地看到语言之间的相似性和差异。
Bash / Curl
这段代码赢得了最短代码奖——它只是使用命令行工具“curl”来发出请求并将回复直接打印到终端。你可以看到输出是一个字符串,包含JSON;我们实际上并不解析各个结果属性。
PHP
可靠的PHP有几种不同的方法来进行HTTPS API调用。在这里,我们选择使用curl_setopt和curl_exec一起使用。
如果您更喜欢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 的速度、类型安全性和清晰性,尽管代码比我们之前的示例更长。
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' 模块处理 - 参见Lua wiki 页面关于过滤器、来源和接收器。这使得可以有效地处理可能以多个“块”返回的数据。正如那篇文章所解释的:
表工厂创建一个存储接收到的数据到表中的接收器。稍后可以使用 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
Rust
总结
在本文中,我们已经通过多种语言展示了Recipient Validation代码示例。 以下是我们对您的请求。
如果您认为我们遗漏了您喜欢的语言,请告知我们。 我们可能没有像The Fibonacci Project那么多的例子,但我们很乐意添加更多。 同样,如果您认为我们的示例可以改进,请告知我们!




