跳转到内容
Guide

验证电子邮件地址而不发送任何消息

| 7 min read

使用三个 API 调用检查电子邮件语法、MX 记录和一次性域。 没有 SMTP 连接,没有验证电子邮件,没有退回风险。 免费电子邮件验证 API。

Email inbox with verification badges
Photo by Stephen Phillips on Unsplash

您的注册表单会收集一个电子邮件地址。 您存储它,发送欢迎消息和电子邮件 弹跳。 地址是一个错字。 或者该域名不存在。 或者它是一次性的 @mailinator.com 十分钟后就会失效的地址。 你现在有一个垃圾 数据库中的记录、受损的发件人声誉以及永远不会回来的用户。

传统的解决方法是发送验证电子邮件:“单击此链接以确认您的地址。” 它有效,但会增加摩擦。 转化率下降。 直到之后它才发现错字 您已经向错误地址发送了一条消息。

您可以在发送任何内容之前验证电子邮件地址。 三个API调用检查语法,MX 记录和一次性域。 整个过程不到200毫秒并捕获问题 90% 的电子邮件发送失败都是由这引起的。

三层电子邮件验证

每一层都会捕获不同类别的不良电子邮件地址。 将它们一起使用以获得完整的 电子邮件验证管道,或选择您需要的。

  • 语法验证。 地址是否遵循有效格式? 是否有域名 有已知的拼写错误吗? 这 /v1/email/validate 端点检查 RFC 5322 合规性, 检测基于角色的地址(admin@, support@),并建议 常见域拼写错误的更正,例如 gmial.com 或者 hotmal.com
  • MX 记录验证。 该域可以接收电子邮件吗? 这 /v1/email-mx/verify 端点查询 DNS 的 MX 记录并回退到 A 记录。 如果该域没有邮件服务器,则该地址无法投递; 无需重试 会修复它。
  • 一次性电子邮件检测。 该地址是否来自一次性服务? 这 /v1/disposable-email/check 针对 700 多个已知一次性域进行端点检查 和模式匹配的变化。 它还标记该域名是否是免费提供商(Gmail、 Outlook),以便您可以区分个人地址和一次性地址。

检查电子邮件语法并发现拼写错误

/v1/email/validate 端点在一次调用中完成大部分工作。 它验证了 格式、查找 MX 记录、检查一次性域并检测流行的拼写错误 提供商域。

回复:

电子邮件 jamie@gmial.com 具有有效的语法,但域是一个拼写错误。 应用程序编程接口 回报 is_valid: false 因为不存在 MX 记录 gmial.com, 它建议正确的地址 jamie@gmail.com。 在中显示此建议 您的注册表单并将用户从死帐户中拯救出来。

验证 MX 记录以检查电子邮件是否真实

/v1/email-mx/verify 端点专注于 DNS。 它返回 MX 的完整列表 具有优先级和a的记录 deliverable 告诉您该域是否 可以收到邮件。

回复:

deliverable 字段返回三个值之一: "likely" (MX 找到的记录), "unknown" (不存在 MX,但存在 A 记录,因此该域可能 接受邮件),或 "unlikely" (没有 MX 和 A 记录)。 将其用于 MX 记录 当您需要原始 DNS 数据时进行验证。

检测一次性和一次性地址

/v1/disposable-email/check 端点标识临时电子邮件服务。 这些地址可以工作几分钟或几小时,然后停止接受邮件。

回复:

is_free field 将一次性域名与免费提供商分开。 一个 Gmail 地址返回 is_free: trueis_disposable: false。 邮寄者 地址返回 is_disposable: trueis_free: false。 这个 区别问题; 阻止所有免费提供商将锁定大部分互联网。

在 Node.js 中构建验证管道

将所有三个检查合并到一个函数中。 该管道按顺序运行每个检查 并在第一次故障时短路。

async function validateEmail(email) {
  const headers = { "Content-Type": "application/json" };
  const body = JSON.stringify({ email });

  // Step 1: Syntax validation + typo detection
  const syntaxRes = await fetch("https://api.botoi.com/v1/email/validate", {
    method: "POST", headers, body,
  });
  const syntax = await syntaxRes.json();

  if (!syntax.data.format_valid) {
    return { valid: false, reason: "Invalid email format" };
  }

  if (syntax.data.suggestion) {
    return {
      valid: false,
      reason: \`Did you mean \${syntax.data.suggestion}?\`,
    };
  }

  // Step 2: MX record verification
  const mxRes = await fetch("https://api.botoi.com/v1/email-mx/verify", {
    method: "POST", headers, body,
  });
  const mx = await mxRes.json();

  if (!mx.data.has_mx) {
    return { valid: false, reason: "Domain cannot receive email" };
  }

  // Step 3: Disposable email detection
  const dispRes = await fetch("https://api.botoi.com/v1/disposable-email/check", {
    method: "POST", headers, body,
  });
  const disp = await dispRes.json();

  if (disp.data.is_disposable) {
    return {
      valid: false,
      reason: \`Disposable email detected (\${disp.data.provider})\`,
    };
  }

  return { valid: true, reason: null };
}

// Usage
const result = await validateEmail("test@mailinator.com");
console.log(result);
// { valid: false, reason: "Disposable email detected (Mailinator)" }

顺序方法是可读的并且提前退出。 如果语法失败,则跳过网络 要求进行 MX 和一次性检查。 如果您更喜欢速度而不是提前终止,请运行所有 三个并联:

async function validateEmail(email) {
  const headers = { "Content-Type": "application/json" };
  const body = JSON.stringify({ email });

  // Run all three checks in parallel
  const [syntaxRes, mxRes, dispRes] = await Promise.all([
    fetch("https://api.botoi.com/v1/email/validate", {
      method: "POST", headers, body,
    }),
    fetch("https://api.botoi.com/v1/email-mx/verify", {
      method: "POST", headers, body,
    }),
    fetch("https://api.botoi.com/v1/disposable-email/check", {
      method: "POST", headers, body,
    }),
  ]);

  const [syntax, mx, disp] = await Promise.all([
    syntaxRes.json(), mxRes.json(), dispRes.json(),
  ]);

  const errors = [];

  if (!syntax.data.format_valid) errors.push("Invalid format");
  if (syntax.data.suggestion) errors.push(\`Typo: try \${syntax.data.suggestion}\`);
  if (!mx.data.has_mx) errors.push("No MX records");
  if (disp.data.is_disposable) errors.push("Disposable domain");

  return {
    valid: errors.length === 0,
    errors,
    details: { syntax: syntax.data, mx: mx.data, disposable: disp.data },
  };
}

并行版本使用以下命令同时触发所有三个请求 Promise.all。 总延迟等于最慢的请求而不是总延迟。 对于大多数情况,这三个都 在 100 毫秒内完成。

Python 验证管道

Python 中同样的三步验证。 此示例使用 requests 图书馆 为了清楚起见。

import requests

API_BASE = "https://api.botoi.com/v1"

def validate_email(email: str) -> dict:
    headers = {"Content-Type": "application/json"}
    payload = {"email": email}

    # Step 1: Syntax + typo check
    syntax = requests.post(
        f"{API_BASE}/email/validate", json=payload, headers=headers
    ).json()

    if not syntax["data"]["format_valid"]:
        return {"valid": False, "reason": "Invalid email format"}

    suggestion = syntax["data"].get("suggestion")
    if suggestion:
        return {"valid": False, "reason": f"Did you mean {suggestion}?"}

    # Step 2: MX record check
    mx = requests.post(
        f"{API_BASE}/email-mx/verify", json=payload, headers=headers
    ).json()

    if not mx["data"]["has_mx"]:
        return {"valid": False, "reason": "Domain cannot receive email"}

    # Step 3: Disposable check
    disp = requests.post(
        f"{API_BASE}/disposable-email/check", json=payload, headers=headers
    ).json()

    if disp["data"]["is_disposable"]:
        provider = disp["data"]["provider"]
        return {"valid": False, "reason": f"Disposable email ({provider})"}

    return {"valid": True, "reason": None}

# Usage
result = validate_email("jamie@gmial.com")
print(result)
# {'valid': False, 'reason': 'Did you mean jamie@gmail.com?'}

何时验证电子邮件地址

不同的接触点需要不同的验证深度。 这是每张支票的适用范围。

接触点 句法 MX检查 一次性的 为什么
注册表单 是的 是的 是的 在创建记录之前发现拼写错误、死域和一次性帐户
结帐/付款 是的 是的 选修的 收据需要可送达地址; 一次性支票取决于您的退款政策
联系表 是的 选修的 基本格式检查可防止明显的垃圾; MX 检查是一个奖励
订阅时事通讯 是的 是的 是的 保护发件人声誉; 高跳出率会让您被 ESP 标记
潜在客户导入/CRM 是的 是的 是的 在数据进入管道之前对其进行清理可节省下游成本
内部工具 是的 语法检查捕获数据输入错误; 内部用户值得信赖

要点

  • 存储前验证。 数据库中的每封不良电子邮件都会让您付出代价:存储、 发送失败、退回处理和发件人声誉受损。 抓住问题点 的条目。
  • 拼写错误检测可以拯救用户。/v1/email/validate 终点 捕获常见的域拼写错误并返回建议。 浮出水面“你的意思是 jamie@gmail.com?” 防止用户流失。
  • MX 检查快速且免费。 DNS 查找在几毫秒内解析。 有 没有理由跳过它们。 没有 MX 记录的地址永远不会收到您的电子邮件。
  • 一次性检测可以保护试验滥用。 如果您提供免费试用或 免费增值计划,一次性电子邮件检测可阻止同一个人无限创建 具有一次性地址的帐户。
  • 无需 API 密钥即可启动。 所有三个端点均在 5 处匿名工作 每分钟的请求数。 无需注册即可测试完整管道。 添加一个 Authorization: Bearer YOUR_KEY 当您需要更高的吞吐量时。
  • 并行运行检查速度。 三个端点是独立的。 使用 Promise.all 将总延迟减少到最慢的单个请求,而不是 三者之和。

所有三个端点的完整文档位于 交互式 API 文档。 每个端点接受一个带有 email 字段并返回结果 Cloudflare 边缘网络的速度低于 100 毫秒。

FAQ

您可以在不发送电子邮件的情况下验证电子邮件地址吗?
是的。 您可以在不发送任何内容的情况下检查三件事:地址是否遵循有效语法 (RFC 5322)、域是否具有配置为接收邮件的 MX 记录以及域是否属于已知的一次性电子邮件提供商。 这三项检查在注册时捕获了大多数错误地址。
botoi 电子邮件验证 API 是免费的吗?
是的。 匿名访问的速度为每分钟 5 个请求,并具有基于 IP 的速率限制。 无需 API 密钥、无需注册、无需信用卡。 为了获得更高的吞吐量,付费计划的起价为 9 美元/月,包括对所有 150 多个 API 端点的访问。
MX记录验证和SMTP验证有什么区别?
MX 记录验证检查域是否具有配置为接受电子邮件的邮件服务器。 它确认该域通常可以接收邮件。 SMTP 验证更进一步,连接到邮件服务器并询问特定邮箱是否存在。 MX 检查速度快(低于 100 毫秒)并且免费。 SMTP 检查速度较慢,可能会被邮件服务器阻止,并且可能会触发速率限制或垃圾邮件标志。
一次性电子邮件检测的准确度如何?
botoi 一次性电子邮件端点会检查 700 多个已知的一次性域,并使用模式匹配来捕获变化(包含“temp”、“trash”、“throaway”等的域)。 它还区分一次性域名和 Gmail 或 Outlook 等免费提供商。 没有一个检测列表是 100% 完整的,但它涵盖了所有广泛使用的一次性服务。
我应该在客户端还是服务器上验证电子邮件?
两个都。 在客户端上运行基本格式检查以获得即时反馈。 在写入数据库之前,在服务器上运行 MX 和一次性检查。 客户端验证改善用户体验; 服务器端验证可以保护您的数据。 永远不要单独信任客户端检查,因为它们可以被绕过。

开始使用 botoi 构建

150+ 个 API 端点,涵盖查询、文本处理、图片生成和开发者工具。免费套餐,无需信用卡。