Reach

Grow

Manage

Automate

Reach

Grow

Manage

Automate

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

电子邮件

1 min read

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

电子邮件

1 min read

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

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

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

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

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

PHP

可靠的PHP有几种不同的方法来进行HTTPS API调用。这里我们选择使用curl_setoptcurl_exec。 (https://www.php.net/manual/en/function.curl-exec.php)

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

Python

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

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

Node.js

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

Postman 也可以提供 JavaScript 原生示例,以及 Unirest,如果您更喜欢那些。

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

Go 力求一种“唯一正确的方法”来做某事;在这种情况下,使用内置的“附带电池”库net/http, encoding/json 等。

长度主要是由于明确的错误检查子句 if err != nil {} 无处不在(没有例外 LOL)。

我们还声明了带有字段标签的结果对象结构,以便能够“解组”返回的 JSON 字符串。我们覆盖“results”和“errors”标签以允许这两种返回。

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

C#

我对 C# 不太熟悉——对我来说,它看起来更像 Java,而不是 C。我能够根据请求库中显示的示例将其整理出来 System.Net.Http

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

Ruby

这是我第一次尝试Ruby代码;我使用了Net::http库,并遵循了这个例子(事实证明这与Postman自动生成的代码非常相似)。

我遇到了一个值得解释的语言/库的特殊性。仅仅使用以“https://”开头的URI设置是不够的,你必须特别设置http.use_ssl = true

如果没有这一点,你的代码将尝试在443端口发起请求——但不使用SSL/TLS(即明文),而SparkPost将拒绝授权请求。在家不要这样尝试,因为你的API密钥在授权头中。这个语言/库功能让我感到不安全。

Java

我之前没有写过任何严肃的Java代码,但通过借鉴SparkPost库中用于其他GET调用的一般方法,很容易拼凑出这个。

顺便说一下,使用VS Code作为我的编辑器/调试器在这里的所有语言中都非常有效,给了我语法高亮、调试器步进/变量查看等功能。The InputStreamReaderBufferedReader结构类似于(我假设是被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包管理器,我们使用库luasocketluasec。显示其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那么多的例子,但我们愿意添加更多。此外,如果您认为我们的示例可以改进,请让我们知道!

加入我们的Newsletter。

通过每周更新到您的收件箱,随时了解 Bird 的最新动态。

通过提交,您同意 Bird 可能会就我们的产品和服务与您联系。

您可以随时取消订阅。查看Bird的隐私声明以获取有关数据处理的详细信息。

加入我们的Newsletter。

通过每周更新到您的收件箱,随时了解 Bird 的最新动态。

通过提交,您同意 Bird 可能会就我们的产品和服务与您联系。

您可以随时取消订阅。查看Bird的隐私声明以获取有关数据处理的详细信息。

加入我们的Newsletter。

通过每周更新到您的收件箱,随时了解 Bird 的最新动态。

通过提交,您同意 Bird 可能会就我们的产品和服务与您联系。

您可以随时取消订阅。查看Bird的隐私声明以获取有关数据处理的详细信息。

Pinterest 标志
Uber 标志
Square 徽标
Adobe 标志
Meta logo
PayPal 标志

Newsletter

通过每周更新到您的收件箱,随时了解 Bird 的最新动态。

通过提交,您同意 Bird 可能会就我们的产品和服务与您联系。

您可以随时取消订阅。查看Bird的隐私声明以获取有关数据处理的详细信息。

Uber 标志
Square 徽标
Adobe 标志
Meta logo

Newsletter

通过每周更新到您的收件箱,随时了解 Bird 的最新动态。

通过提交,您同意 Bird 可能会就我们的产品和服务与您联系。

您可以随时取消订阅。查看Bird的隐私声明以获取有关数据处理的详细信息。

Uber 标志
Adobe 标志
Meta logo

Reach

Grow

Manage

Automate

资源

公司

Newsletter

通过每周更新到您的收件箱,随时了解 Bird 的最新动态。

通过提交,您同意 Bird 可能会就我们的产品和服务与您联系。

您可以随时取消订阅。查看Bird的隐私声明以获取有关数据处理的详细信息。