邮箱验证 API 与正则表达式:什么才真正有效

朋友解决邮件退信的请求是如何变成一个完整的 Python API 的。

前段时间,一个好朋友带着一个问题来找我。他所在的公司正饱受邮件退信的困扰。他们目前使用的验证服务让大量无效邮箱蒙混过关,这让他们浪费了大量时间和金钱。他问我能不能做个更好的工具。

问题是?在那一刻,我对邮箱验证完全没有经验。我必须从零开始。

我深入研究,最终用 PHP 和 MariaDB 数据库构建了一个自定义验证器。它完美吗?不。但它起作用了。与旧系统相比,该公司的退信率立即下降了。最棒的是,当某些地方出问题或需要调整时,我当天就能修复它。我不用等待第三方支持工单的回复。

但随着我对邮件机制的研究越来越深入,我意识到这个问题实际上有多么极其混乱。如果您正试图构建自己的验证器,以下是我辛苦学到的教训。

正则表达式的陷阱(以及为什么它不够用)

大多数开发者从正则表达式开始。这似乎是合乎逻辑的第一步。您写了类似这样的代码:

import re

def is_valid_email(email):
    pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'
    return bool(re.match(pattern, email))

# 看起来不错,对吧?
print(is_valid_email("user@example.com"))  # True
print(is_valid_email("test@mailinator.com"))  # 也是 True... 但这是垃圾邮箱

这能抓住明显的拼写错误。但它抓不到:

  • 临时域名,如 mailinator.comtempmail.com —— 它们能通过您的正则表达式,但之后会退信。
  • 全捕获服务器,它们接受任何地址 —— 您的正则表达式说“有效”,但邮箱实际上并不存在。
  • 基于角色的地址,如 admin@info@ —— 技术上有效,但通常被真人忽略。

所以您添加了一个黑名单。然后您意识到有数千个临时域名。然后您试图保持列表更新。这是一个无底洞。

SMTP 验证的噩梦

“好吧,”您想,“我直接问邮件服务器这个地址是否存在不就行了。”于是您写了一个 SMTP 握手脚本:

import smtplib
import dns.resolver

def smtp_verify(email):
    domain = email.split('@')[1]

    # 获取 MX 记录
    records = dns.resolver.resolve(domain, 'MX')
    mx_host = str(records[0].exchange)

    # 尝试 SMTP 握手
    server = smtplib.SMTP(mx_host, timeout=10)
    server.set_debuglevel(0)
    server.helo('your-domain.com')
    server.mail('test@example.com')
    code, message = server.rcpt(email)
    server.quit()

    return code == 250

这有时能行……然后您遇到了现实世界:

  • Microsoft 会“说谎”。 Outlook、Hotmail、Live —— 它们在 SMTP 握手期间接受所有地址,之后再退信。您的验证器说“有效”,但邮箱并不存在。
  • Gmail 会限制您。 他们增加了人为延迟来拖慢您。您的验证每个邮箱需要 5–10 秒。
  • Yahoo 直接封锁您。 根本无法进行 SMTP 验证。
  • 您的 IP 被列入黑名单。 探测太多服务器,您看起来就像个垃圾邮件发送者。突然之间,您自己的邮件也开始进入垃圾邮件文件夹。

当我构建那个最初的 PHP 版本时,处理这些边缘情况是每天的噩梦。它对大约 60% 的邮箱有效。另外 40% 呢?要么是误报,要么是漏报。

重构(我现在使用的方法)

最终,我意识到 PHP 脚本只是权宜之计。要真正做好这件事,我需要进行结构性重构。我完全重新设计并用 Python 重写了系统。这成为了 ParheliaWeb 邮箱验证 API 的基础。

以下是现在用 5 行代码实现的样子:

import requests

API_KEY = "your_api_key_here"

response = requests.post(
    "https://parheliaweb.com/v1/email/validate",
    headers={"x-api-key": API_KEY},
    json={"email": "user@example.com"}
)

result = response.json()["result"]
print(f"{result['status']} ({result['confidence']}% confident)")

您不再只收到 true/false,而是获取了完整的画面:

{
  "status": "valid",
  "confidence": 90,
  "syntax_valid": true,
  "domain_check": {
    "blacklisted": false,
    "disposable": false
  },
  "mx_valid": true,
  "smtp_check": {
    "result": true,
    "code": 250
  },
  "risk_factors": []
}

API 处理了我前面提到的所有麻烦事:

  • 临时域名检测 —— 检查数千个已知的临时邮件服务。
  • 全捕获检测 —— 识别接受任何地址的域名。
  • Microsoft/Gmail/Yahoo 处理 —— 对能验证和不能验证的内容保持透明。
  • IP 信誉保护 —— 拥有干净 IP 的专用验证服务器,因此您的 IP 保持安全。
  • 批量验证 —— 通过连接池一次验证最多 100 个邮箱。

透明胜过炒作

我们的系统完美吗?没有系统是完美的。但我们每天都在持续改进它。

如果您阅读我们的 邮箱验证文档,您会注意到一些不同的地方:我们实际上告诉您我们的系统不能做什么。我们对局限性(如 Microsoft 接受所有 SMTP 探测)保持透明。但我们也为我们做到的事情感到自豪。

核心就是透明。您看到价格,也确切地看到您所支付的费用能带来什么。没有游戏,没有隐藏陷阱。本该如此。

真实的成本对比

因素 自己构建 使用 API
获取首个结果的时间 2-4 周 5 分钟
临时域名覆盖 无(需自行维护) 数千个 + 自动更新
全捕获检测 无法实现 内置
Microsoft/Gmail 处理 被封锁或具有误导性 透明的状态
IP 信誉风险 您的 IP 被列入黑名单 由提供商处理
准确性 约 60-70%(根据我的经验) 每个结果都有透明的置信度评分
成本 您的时间 + 基础设施 免费版 → €39/月 (入门版)

我的建议很简单: 如果您只是为了个人项目验证少量邮箱,正则表达式就能搞定。但对于 SaaS 产品、营销列表或任何送达率至关重要的场景,请让专门的 API 处理繁重的工作。

开始使用

免费试用

100 次免费验证,无需信用卡。看看它是否适合您的使用场景。

入门版: 5,000 次验证,每月 €39。 专业版: 25,000 次 + 全捕获检测,每月 €79。

发布优惠:本月所有套餐 8 折。

获取您的免费 API 密钥 →

🚀 在构建初创公司工具?

干净的邮箱数据只是成功的一半。您还需要准确的市场数据来知道该瞄准谁。了解我们是如何构建 初创公司融资信号 API 的,它能在没有脆弱爬虫烦恼的情况下交付经 AI 验证的融资数据。

有问题?

我是 Andy,创始人。我只是个喜欢为人解决问题的 IT 仔。如果您对数据或 API 有任何疑问,随时给我发邮件。

📧 info@parheliaweb.com