收件人验证:电子邮件验证代码示例

2020年7月8日

电子邮件

1 min read

收件人验证:电子邮件验证代码示例

关键要点

    • 数据驱动的验证,而不是猜测。 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在您的工作流程中以编程方式验证单个地址。

  • 支持哪些编程语言?

    代码示例可用于十多种语言——包括PythonNode.jsPHPGoC#JavaRustPerl——涵盖现代和传统系统。

  • 我应该在哪里存储我的 API key?

    始终使用环境变量(例如SPARKPOST_API_KEY)保持在服务器端。切勿将其嵌入客户端脚本或浏览器代码中。

  • Can this be integrated into 自动化工作流程?

    当然。您可以使用 Bird 的 Flow BuilderAzure Functions 实时验证地址,然后触发后续自动化流程,例如确认电子邮件或 CRM 更新。

  • 为什么企业应该关心验证准确性?

    高质量验证提高了发送者的声誉,防止退信,并通过确保每条消息都到达有效的Inbox来提升活动的投资回报率。

  • 开发者接下来会怎样?

    Bird 邀请社区为新的语言示例和现有示例的改进做出贡献,帮助扩大全球验证可访问性。

SparkPost 收件人验证现在适用于现有 SparkPost 客户和新的非发送客户。它每天对数十亿次退信、投递和参与事件进行强大的数据驱动分析,用以训练我们的算法,为您带来市场上最强大的数据驱动电子邮件验证工具之一,让您能够更智能地发送电子邮件。

SparkPost Recipient Validation 现已同时向现有 SparkPost 客户和新的非发送客户提供。它每天对数十亿次退信、投递和参与事件进行强大的数据驱动分析,以训练我们的算法,为您提供市场上最强大的数据驱动电子邮件验证工具之一,让您的邮件发送更智能。这代表了电子邮件验证技术的最新演变,从简单的语法检查转向复杂的数据驱动方法,提供更准确的结果。

本文将解释如何充分利用您在每个被验证收件人上收到的数据——您将看到我们将地址分类为“有效”、“风险”、“中立”、“无法投递”和“拼写错误”。我们会为您提供“原因”代码以及已知地址拼写错误的“did_you_mean”。

SparkPost Recipient Validation 现已同时向现有 SparkPost 客户和新的非发送客户提供。它每天对数十亿次退信、投递和参与事件进行强大的数据驱动分析,以训练我们的算法,为您提供市场上最强大的数据驱动电子邮件验证工具之一,让您的邮件发送更智能。这代表了电子邮件验证技术的最新演变,从简单的语法检查转向复杂的数据驱动方法,提供更准确的结果。

本文将解释如何充分利用您在每个被验证收件人上收到的数据——您将看到我们将地址分类为“有效”、“风险”、“中立”、“无法投递”和“拼写错误”。我们会为您提供“原因”代码以及已知地址拼写错误的“did_you_mean”。

SparkPost Recipient Validation 现已同时向现有 SparkPost 客户和新的非发送客户提供。它每天对数十亿次退信、投递和参与事件进行强大的数据驱动分析,以训练我们的算法,为您提供市场上最强大的数据驱动电子邮件验证工具之一,让您的邮件发送更智能。这代表了电子邮件验证技术的最新演变,从简单的语法检查转向复杂的数据驱动方法,提供更准确的结果。

本文将解释如何充分利用您在每个被验证收件人上收到的数据——您将看到我们将地址分类为“有效”、“风险”、“中立”、“无法投递”和“拼写错误”。我们会为您提供“原因”代码以及已知地址拼写错误的“did_you_mean”。

C#

我对 C# 不太熟悉——对我来说,它看起来更像 Java,而不是 C。我能够根据请求库 System.Net.Http 中显示的示例把这个组合在一起。

如果你更喜欢的话,Postman 可以使用 RestSharp 自动生成示例代码。

我对 C# 不太熟悉——对我来说,它看起来更像 Java,而不是 C。我能够根据请求库 System.Net.Http 中显示的示例把这个组合在一起。

如果你更喜欢的话,Postman 可以使用 RestSharp 自动生成示例代码。

我对 C# 不太熟悉——对我来说,它看起来更像 Java,而不是 C。我能够根据请求库 System.Net.Http 中显示的示例把这个组合在一起。

如果你更喜欢的话,Postman 可以使用 RestSharp 自动生成示例代码。

API请求

在 SparkPost 网络应用程序中,您可以拖放整个列表进行验证。您也可以使用API来验证单个地址,这样您就可以将验证直接构建到您的地址输入工作流程中。

前一阵子,我们使用此 API 编写了一个Python 命令行工具。我们讨论了我们应该为其他语言做些什么——于是我们在这里!让我们开始吧。

这个Github 仓库文件夹中有大约十几种不同语言的有效收件人验证 API 调用示例。我们尽量覆盖最流行的适用语言

通过这些示例的常用方法是:

  • 从环境变量SPARKPOST_API_KEY中获取您的密钥

  • 调用/api/v1/recipient-validation/single/API 验证收件人

  • 接收回包含 JSON 格式数据的响应字符串,其中包含结果

  • 打印出结果

SparkPost 为此处涵盖的部分语言提供,但不是全部。我们选择编写这些“原生”示例,以便 a) 覆盖更多语言,b) 展示底层代码的简单性,以及 c) 使您能够清楚地看到语言之间的异同。

在 SparkPost 网络应用程序中,您可以拖放整个列表进行验证。您也可以使用API来验证单个地址,这样您就可以将验证直接构建到您的地址输入工作流程中。

前一阵子,我们使用此 API 编写了一个Python 命令行工具。我们讨论了我们应该为其他语言做些什么——于是我们在这里!让我们开始吧。

这个Github 仓库文件夹中有大约十几种不同语言的有效收件人验证 API 调用示例。我们尽量覆盖最流行的适用语言

通过这些示例的常用方法是:

  • 从环境变量SPARKPOST_API_KEY中获取您的密钥

  • 调用/api/v1/recipient-validation/single/API 验证收件人

  • 接收回包含 JSON 格式数据的响应字符串,其中包含结果

  • 打印出结果

SparkPost 为此处涵盖的部分语言提供,但不是全部。我们选择编写这些“原生”示例,以便 a) 覆盖更多语言,b) 展示底层代码的简单性,以及 c) 使您能够清楚地看到语言之间的异同。

在 SparkPost 网络应用程序中,您可以拖放整个列表进行验证。您也可以使用API来验证单个地址,这样您就可以将验证直接构建到您的地址输入工作流程中。

前一阵子,我们使用此 API 编写了一个Python 命令行工具。我们讨论了我们应该为其他语言做些什么——于是我们在这里!让我们开始吧。

这个Github 仓库文件夹中有大约十几种不同语言的有效收件人验证 API 调用示例。我们尽量覆盖最流行的适用语言

通过这些示例的常用方法是:

  • 从环境变量SPARKPOST_API_KEY中获取您的密钥

  • 调用/api/v1/recipient-validation/single/API 验证收件人

  • 接收回包含 JSON 格式数据的响应字符串,其中包含结果

  • 打印出结果

SparkPost 为此处涵盖的部分语言提供,但不是全部。我们选择编写这些“原生”示例,以便 a) 覆盖更多语言,b) 展示底层代码的简单性,以及 c) 使您能够清楚地看到语言之间的异同。

Bash / Curl

这段代码赢得了最短代码奖——它只是使用命令行工具“curl”来发出请求并将回复直接打印到终端。你可以看到输出是一个字符串,包含JSON;我们实际上并不解析各个结果属性。

这段代码赢得了最短代码奖——它只是使用命令行工具“curl”来发出请求并将回复直接打印到终端。你可以看到输出是一个字符串,包含JSON;我们实际上并不解析各个结果属性。

这段代码赢得了最短代码奖——它只是使用命令行工具“curl”来发出请求并将回复直接打印到终端。你可以看到输出是一个字符串,包含JSON;我们实际上并不解析各个结果属性。

PHP

可靠的PHP有几种不同的方法来进行HTTPS API调用。在这里,我们选择使用curl_setoptcurl_exec一起使用。

如果您更喜欢HTTP_Request2pecl_http,那么Postman有一个内置的代码生成器,您可以使用它来创建类似的示例——只需设置一个工作中的GET请求并使用“Code”按钮。

Postman interface used for API testing, featuring a "Single Address Validation" endpoint with GET parameters, a Headers section showing Authorization and Accept keys, and a highlighted area labeled "Cookies" and "Code" on the right side.

可靠的PHP有几种不同的方法来进行HTTPS API调用。在这里,我们选择使用curl_setoptcurl_exec一起使用。

如果您更喜欢HTTP_Request2pecl_http,那么Postman有一个内置的代码生成器,您可以使用它来创建类似的示例——只需设置一个工作中的GET请求并使用“Code”按钮。

Postman interface used for API testing, featuring a "Single Address Validation" endpoint with GET parameters, a Headers section showing Authorization and Accept keys, and a highlighted area labeled "Cookies" and "Code" on the right side.

可靠的PHP有几种不同的方法来进行HTTPS API调用。在这里,我们选择使用curl_setoptcurl_exec一起使用。

如果您更喜欢HTTP_Request2pecl_http,那么Postman有一个内置的代码生成器,您可以使用它来创建类似的示例——只需设置一个工作中的GET请求并使用“Code”按钮。

Postman interface used for API testing, featuring a "Single Address Validation" endpoint with GET parameters, a Headers section showing Authorization and Accept keys, and a highlighted area labeled "Cookies" and "Code" on the right side.

Python

这使用了广受欢迎的requests模块,该模块是高级的,因此易于使用。此示例检查返回的状态代码,将结果JSON转换回Python字典对象,并打印结果对象,而不仅仅是一个字符串。

如果您更喜欢内置的http.client库,Postman也可以为其生成代码;这不会长很多。

这使用了广受欢迎的requests模块,该模块是高级的,因此易于使用。此示例检查返回的状态代码,将结果JSON转换回Python字典对象,并打印结果对象,而不仅仅是一个字符串。

如果您更喜欢内置的http.client库,Postman也可以为其生成代码;这不会长很多。

这使用了广受欢迎的requests模块,该模块是高级的,因此易于使用。此示例检查返回的状态代码,将结果JSON转换回Python字典对象,并打印结果对象,而不仅仅是一个字符串。

如果您更喜欢内置的http.client库,Postman也可以为其生成代码;这不会长很多。

Node.js

许多不同的node.js HTTP(S)库。我开始使用较旧的request包(使用回调函数),但它已被弃用且不再积极维护。我选择了较新的axios包(使用promises)。

Postman也可以为你提供一个Javascript原生示例和Unirest,如果你更喜欢那些的话。

因为这段代码需要访问你的API密钥,我们强烈建议从你的服务器端调用我们的API,千万不要从客户端(浏览器/移动设备)调用。

许多不同的node.js HTTP(S)库。我开始使用较旧的request包(使用回调函数),但它已被弃用且不再积极维护。我选择了较新的axios包(使用promises)。

Postman也可以为你提供一个Javascript原生示例和Unirest,如果你更喜欢那些的话。

因为这段代码需要访问你的API密钥,我们强烈建议从你的服务器端调用我们的API,千万不要从客户端(浏览器/移动设备)调用。

许多不同的node.js HTTP(S)库。我开始使用较旧的request包(使用回调函数),但它已被弃用且不再积极维护。我选择了较新的axios包(使用promises)。

Postman也可以为你提供一个Javascript原生示例和Unirest,如果你更喜欢那些的话。

因为这段代码需要访问你的API密钥,我们强烈建议从你的服务器端调用我们的API,千万不要从客户端(浏览器/移动设备)调用。

Go 努力追求“唯一正确的方法”这一理念;在这种情况下,使用内置的“电池包含”库 net/httpencoding/json 等。

长度主要是由于到处都有显式错误检查子句 if err != nil {} (无例外 笑)。

我们还声明了带有字段标签的结果对象结构,以使我们能够“反序列化”返回的 JSON 字符串。我们覆盖“results”和“errors”标签以允许两种返回类型。

我喜欢 Go 的速度、类型安全性和清晰性,尽管代码比我们之前的示例更长。

Go 努力追求“唯一正确的方法”这一理念;在这种情况下,使用内置的“电池包含”库 net/httpencoding/json 等。

长度主要是由于到处都有显式错误检查子句 if err != nil {} (无例外 笑)。

我们还声明了带有字段标签的结果对象结构,以使我们能够“反序列化”返回的 JSON 字符串。我们覆盖“results”和“errors”标签以允许两种返回类型。

我喜欢 Go 的速度、类型安全性和清晰性,尽管代码比我们之前的示例更长。

Go 努力追求“唯一正确的方法”这一理念;在这种情况下,使用内置的“电池包含”库 net/httpencoding/json 等。

长度主要是由于到处都有显式错误检查子句 if err != nil {} (无例外 笑)。

我们还声明了带有字段标签的结果对象结构,以使我们能够“反序列化”返回的 JSON 字符串。我们覆盖“results”和“errors”标签以允许两种返回类型。

我喜欢 Go 的速度、类型安全性和清晰性,尽管代码比我们之前的示例更长。

Java

我之前没有用Java编写过任何严肃的东西,但通过遵循SparkPost library用于其他GET调用的通用方法,很容易将其拼凑在一起。

顺便说一句,使用VS Code作为我的编辑器/调试器对这里的所有语言都非常有效,为我提供了语法高亮、调试器步进/变量查看等功能。The InputStreamReaderBufferedReader构造与Go类似(我假设是Go复制的)。

我之前没有用Java编写过任何严肃的东西,但通过遵循SparkPost library用于其他GET调用的通用方法,很容易将其拼凑在一起。

顺便说一句,使用VS Code作为我的编辑器/调试器对这里的所有语言都非常有效,为我提供了语法高亮、调试器步进/变量查看等功能。The InputStreamReaderBufferedReader构造与Go类似(我假设是Go复制的)。

我之前没有用Java编写过任何严肃的东西,但通过遵循SparkPost library用于其他GET调用的通用方法,很容易将其拼凑在一起。

顺便说一句,使用VS Code作为我的编辑器/调试器对这里的所有语言都非常有效,为我提供了语法高亮、调试器步进/变量查看等功能。The InputStreamReaderBufferedReader构造与Go类似(我假设是Go复制的)。

C / C++

这是一次回忆之旅,因为我在 1990 年代写了很多 C 代码,其中一些代码仍然在某个地方的电信网络中运行。由于C 的历史早于现代网络,因此库支持是手动任务,这并不令人惊讶。我们需要下载(并编译)Libcurl 的最新版本,并链接到一个 OpenSSL 库 - 请参阅README了解实际步骤。

与现代语言相比,这感觉工作量很大,尤其是当 Go(或 Lua,或 Python,或其他任何语言)对这类任务来说已经足够快时。

即使在经历了以前的战斗留下的伤痕之后,我也忘记了的另一件事是内存分配的可怕性!为了简化示例,我预分配了 1024 个字符的 URL 字符串长度,并在合并电子邮件地址之前(使用strlen)检查长度(使用strcat)。

我们以同样的方式处理带有连接 API 密钥的授权字符串..即使我们知道有效的 API 密钥永远不会太长..这也不是保护措施!来自环境变量的用户输入可以是任何内容。您必须防御性编程。

一个更复杂的开发人员可能会使用malloc而不是堆栈变量分配,并计算连接字符串需要的长度。考虑这种额外的复杂性让我左侧二极管疼痛;这让我想起 C 程序员每天面临的风险,努力避免缓冲区溢出和意外的副作用。 这将我们带到..

这是一次回忆之旅,因为我在 1990 年代写了很多 C 代码,其中一些代码仍然在某个地方的电信网络中运行。由于C 的历史早于现代网络,因此库支持是手动任务,这并不令人惊讶。我们需要下载(并编译)Libcurl 的最新版本,并链接到一个 OpenSSL 库 - 请参阅README了解实际步骤。

与现代语言相比,这感觉工作量很大,尤其是当 Go(或 Lua,或 Python,或其他任何语言)对这类任务来说已经足够快时。

即使在经历了以前的战斗留下的伤痕之后,我也忘记了的另一件事是内存分配的可怕性!为了简化示例,我预分配了 1024 个字符的 URL 字符串长度,并在合并电子邮件地址之前(使用strlen)检查长度(使用strcat)。

我们以同样的方式处理带有连接 API 密钥的授权字符串..即使我们知道有效的 API 密钥永远不会太长..这也不是保护措施!来自环境变量的用户输入可以是任何内容。您必须防御性编程。

一个更复杂的开发人员可能会使用malloc而不是堆栈变量分配,并计算连接字符串需要的长度。考虑这种额外的复杂性让我左侧二极管疼痛;这让我想起 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包管理器,我们使用库luasocketluasec。展示其 C 集成遗产,我们链接到我们的本地 OpenSSL 库。luarocks 安装过程调用gcc编译器(或您正在使用的任何 C 编译器),因此添加新库需要一些时间。

Lua 代码非常简单。字符 — 表示注释。函数https.request提供多个返回值(有点像 Python 和 Go)。字符串连接是通过运算符 .. 完成的(而不是 Python 中的 +)。

此调用的响应体通过 'ltn12' 模块处理 - 参见Lua wiki 页面关于过滤器、来源和接收器。这使得可以有效地处理可能以多个“块”返回的数据。正如那篇文章所解释的:

表工厂创建一个存储接收到的数据到表中的接收器。稍后可以使用 table.concat 库函数将这些数据有效地连接成一个单一字符串。

我们的示例只是连接表 t 并输出;你可以使用一个过滤器来执行更多的处理。

Lua 以其与 C 代码的容易共存而闻名,在 SparkPost,我们广泛使用 Lua用于我们的 Momentum 本地 MTA 内的策略定制。你也可以将其用作独立的脚本语言,这也很好。

使用 Lua 5.3 和luarocks包管理器,我们使用库luasocketluasec。展示其 C 集成遗产,我们链接到我们的本地 OpenSSL 库。luarocks 安装过程调用gcc编译器(或您正在使用的任何 C 编译器),因此添加新库需要一些时间。

Lua 代码非常简单。字符 — 表示注释。函数https.request提供多个返回值(有点像 Python 和 Go)。字符串连接是通过运算符 .. 完成的(而不是 Python 中的 +)。

此调用的响应体通过 'ltn12' 模块处理 - 参见Lua wiki 页面关于过滤器、来源和接收器。这使得可以有效地处理可能以多个“块”返回的数据。正如那篇文章所解释的:

表工厂创建一个存储接收到的数据到表中的接收器。稍后可以使用 table.concat 库函数将这些数据有效地连接成一个单一字符串。

我们的示例只是连接表 t 并输出;你可以使用一个过滤器来执行更多的处理。

Lua 以其与 C 代码的容易共存而闻名,在 SparkPost,我们广泛使用 Lua用于我们的 Momentum 本地 MTA 内的策略定制。你也可以将其用作独立的脚本语言,这也很好。

使用 Lua 5.3 和luarocks包管理器,我们使用库luasocketluasec。展示其 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 显示结果,或者只是将数组传递给其他处理。

虽然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 显示结果,或者只是将数组传递给其他处理。

虽然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语言指数中排名第六,所以我们来看看。

其他方式可以做到这一点,但最简单的成功路径是使用Windows平台中的Visual Studio SDK。启动Visual Studio,开始一个新项目,选择Visual Basic,然后选择console.app。一定要使用VB版本,而不是C#版本——在SDK中很容易错过这一点。

Visual Studio interface for creating a new project, highlighting options such as Console App (.NET Core) and ASP.NET Web Application, with sections for selecting the language, platform, and project type.


此时,您可以手动编辑行或从这里复制粘贴代码到VS中,并节省大量时间。为了使此代码正常工作,您需要添加一个Windows环境变量。最简单的方法是打开命令提示符并像这样使用setx.exe:

C:\Users\me>setx SPARKPOST_API_KEY  "142<redacted<redacted>c531c3"

在Windows 10中,这将应用于您的用户环境,但在当前命令会话中不会立即可用,因此使用“set”进行测试将不起作用,但它将对代码可用。如果您构建并执行repo中包含的代码,您将看到验证结果。对于需要大规模验证电子邮件地址的生产webhook消费者的开发者,我们的Azure Functions webhook consumer guide展示了如何构建可以有效处理验证工作流程的无服务器解决方案。

Visual Basic不是可视化的,也不是基础的(恕我直言),但它在TIOBE语言指数中排名第六,所以我们来看看。

其他方式可以做到这一点,但最简单的成功路径是使用Windows平台中的Visual Studio SDK。启动Visual Studio,开始一个新项目,选择Visual Basic,然后选择console.app。一定要使用VB版本,而不是C#版本——在SDK中很容易错过这一点。

Visual Studio interface for creating a new project, highlighting options such as Console App (.NET Core) and ASP.NET Web Application, with sections for selecting the language, platform, and project type.


此时,您可以手动编辑行或从这里复制粘贴代码到VS中,并节省大量时间。为了使此代码正常工作,您需要添加一个Windows环境变量。最简单的方法是打开命令提示符并像这样使用setx.exe:

C:\Users\me>setx SPARKPOST_API_KEY  "142<redacted<redacted>c531c3"

在Windows 10中,这将应用于您的用户环境,但在当前命令会话中不会立即可用,因此使用“set”进行测试将不起作用,但它将对代码可用。如果您构建并执行repo中包含的代码,您将看到验证结果。对于需要大规模验证电子邮件地址的生产webhook消费者的开发者,我们的Azure Functions webhook consumer guide展示了如何构建可以有效处理验证工作流程的无服务器解决方案。

Visual Basic不是可视化的,也不是基础的(恕我直言),但它在TIOBE语言指数中排名第六,所以我们来看看。

其他方式可以做到这一点,但最简单的成功路径是使用Windows平台中的Visual Studio SDK。启动Visual Studio,开始一个新项目,选择Visual Basic,然后选择console.app。一定要使用VB版本,而不是C#版本——在SDK中很容易错过这一点。

Visual Studio interface for creating a new project, highlighting options such as Console App (.NET Core) and ASP.NET Web Application, with sections for selecting the language, platform, and project type.


此时,您可以手动编辑行或从这里复制粘贴代码到VS中,并节省大量时间。为了使此代码正常工作,您需要添加一个Windows环境变量。最简单的方法是打开命令提示符并像这样使用setx.exe:

C:\Users\me>setx SPARKPOST_API_KEY  "142<redacted<redacted>c531c3"

在Windows 10中,这将应用于您的用户环境,但在当前命令会话中不会立即可用,因此使用“set”进行测试将不起作用,但它将对代码可用。如果您构建并执行repo中包含的代码,您将看到验证结果。对于需要大规模验证电子邮件地址的生产webhook消费者的开发者,我们的Azure Functions webhook consumer guide展示了如何构建可以有效处理验证工作流程的无服务器解决方案。

Rust

Rust 是一种用于系统和网络服务编程的语言,专注于性能、安全性和并发性。正如Wikipedia所说,Rust 自 2016 年以来一直是 Stack Overflow 开发者调查中“最受喜爱的编程语言”。

我们的 Github 仓库中的 Rust 代码使用 reqwest 库和 tokio 异步,类似于Rust Cookbook 中的示例。(这不是拼写错误,reqwest 库名就是这样拼写的)。我们已经包含了一个 Cargo 包管理器配置文件,因此您可以使用以下命令构建并运行:

cd rust_recipient_validation cargo run

这将编译包为可执行代码,并运行它:

Finished dev [unoptimized + debuginfo] target(s) in 0.10s
Running `target/debug/rust_recipient_validation`
Status: 200 OK
Body: : (etc)

代码使用 std:env 读取 SPARKPOST_API_KEY 环境变量。 一个匹配子句处理密钥未定义的情况。如果一切正常,将创建一个新的 reqwest::Client 并发出异步调用,随后是 .await?(请参阅reqwest 文档)。 异步而不是简单的阻塞调用似乎是设置请求标头所必需的。根据这个示例,使用第二个 .await? 读取响应体文本。

Rust 是一种用于系统和网络服务编程的语言,专注于性能、安全性和并发性。正如Wikipedia所说,Rust 自 2016 年以来一直是 Stack Overflow 开发者调查中“最受喜爱的编程语言”。

我们的 Github 仓库中的 Rust 代码使用 reqwest 库和 tokio 异步,类似于Rust Cookbook 中的示例。(这不是拼写错误,reqwest 库名就是这样拼写的)。我们已经包含了一个 Cargo 包管理器配置文件,因此您可以使用以下命令构建并运行:

cd rust_recipient_validation cargo run

这将编译包为可执行代码,并运行它:

Finished dev [unoptimized + debuginfo] target(s) in 0.10s
Running `target/debug/rust_recipient_validation`
Status: 200 OK
Body: : (etc)

代码使用 std:env 读取 SPARKPOST_API_KEY 环境变量。 一个匹配子句处理密钥未定义的情况。如果一切正常,将创建一个新的 reqwest::Client 并发出异步调用,随后是 .await?(请参阅reqwest 文档)。 异步而不是简单的阻塞调用似乎是设置请求标头所必需的。根据这个示例,使用第二个 .await? 读取响应体文本。

Rust 是一种用于系统和网络服务编程的语言,专注于性能、安全性和并发性。正如Wikipedia所说,Rust 自 2016 年以来一直是 Stack Overflow 开发者调查中“最受喜爱的编程语言”。

我们的 Github 仓库中的 Rust 代码使用 reqwest 库和 tokio 异步,类似于Rust Cookbook 中的示例。(这不是拼写错误,reqwest 库名就是这样拼写的)。我们已经包含了一个 Cargo 包管理器配置文件,因此您可以使用以下命令构建并运行:

cd rust_recipient_validation cargo run

这将编译包为可执行代码,并运行它:

Finished dev [unoptimized + debuginfo] target(s) in 0.10s
Running `target/debug/rust_recipient_validation`
Status: 200 OK
Body: : (etc)

代码使用 std:env 读取 SPARKPOST_API_KEY 环境变量。 一个匹配子句处理密钥未定义的情况。如果一切正常,将创建一个新的 reqwest::Client 并发出异步调用,随后是 .await?(请参阅reqwest 文档)。 异步而不是简单的阻塞调用似乎是设置请求标头所必需的。根据这个示例,使用第二个 .await? 读取响应体文本。

总结

在本文中,我们已经通过多种语言展示了Recipient Validation代码示例。 以下是我们对您的请求。

如果您认为我们遗漏了您喜欢的语言,请告知我们。 我们可能没有像The Fibonacci Project那么多的例子,但我们很乐意添加更多。 同样,如果您认为我们的示例可以改进,请告知我们!

在本文中,我们已经通过多种语言展示了Recipient Validation代码示例。 以下是我们对您的请求。

如果您认为我们遗漏了您喜欢的语言,请告知我们。 我们可能没有像The Fibonacci Project那么多的例子,但我们很乐意添加更多。 同样,如果您认为我们的示例可以改进,请告知我们!

在本文中,我们已经通过多种语言展示了Recipient Validation代码示例。 以下是我们对您的请求。

如果您认为我们遗漏了您喜欢的语言,请告知我们。 我们可能没有像The Fibonacci Project那么多的例子,但我们很乐意添加更多。 同样,如果您认为我们的示例可以改进,请告知我们!

其他新闻

阅读更多来自此类别的内容

A person is standing at a desk while typing on a laptop.

完整的AI原生平台,可与您的业务一起扩展。

© 2025 Bird

A person is standing at a desk while typing on a laptop.

完整的AI原生平台,可与您的业务一起扩展。

© 2025 Bird