前段时间,一个好朋友带着一个问题来找我。他所在的公司正饱受邮件退信的困扰。他们目前使用的验证服务让大量无效邮箱蒙混过关,这让他们浪费了大量时间和金钱。他问我能不能做个更好的工具。
问题是?在那一刻,我对邮箱验证完全没有经验。我必须从零开始。
我深入研究,最终用 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.com或tempmail.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 有任何疑问,随时给我发邮件。