电子邮件验证并不是什么秘密。它只需要一点 SMTP 协议和您选择的编程语言的知识。为了证明它有多么简单,我将使用一个简单的 Python 脚本向您介绍基础知识。
警告和免责声明
虽然此过程可以帮助您快速启动并运行,但您需要注意以下风险:
- 如果这样做太多,您将被列入黑名单(例如Spamhaus),尤其是当您使用来自ISP的动态 IP 地址时。
- B2C地址:这对于拥有自己的程序和垃圾邮件规则(eghotmail 和 yahoo)的大公司来说效果不佳。
- 错误结果:某些邮件服务器会给出错误结果,例如,catch-all 服务器会接受所有传入的电子邮件地址,通常会将传入的电子邮件转发到中央邮箱。Yahoo 地址显示了这种 catch-all 行为。
该脚本本身不是企业级电子邮件验证;您将无法使用它处理数百万个地址。
电子邮件验证
句法
在开始进行网络IO之前,我们应该先进行基本检查,看看电子邮件是否确实类似于电子邮件地址。我们可以使用一些简单的正则表达式来执行此操作。
import re
addressToVerify ='info@scottbrady91.com'
match = re.match('^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$', addressToVerify)
if match == None:
print('Bad Syntax')
raise ValueError('Bad Syntax')
DNS
接下来,我们需要获取目标域的MX记录,以便启动电子邮件验证过程。请注意,RFC 允许您在A记录上拥有邮件服务器,但这超出了本文和演示脚本的范围。
import dns.resolver
records = dns.resolver.query('scottbrady91.com', 'MX')
mxRecord = records[0].exchange
mxRecord = str(mxRecord)
邮箱
现在我们已经获得了所需的所有预检信息,我们现在可以查明该电子邮件地址是否存在。
import socket
import smtplib
# Get local server hostname
host = socket.gethostname()
# SMTP lib setup (use debug level for full output)
server = smtplib.SMTP()
server.set_debuglevel(0)
# SMTP Conversation
server.connect(mxRecord)
server.helo(host)
server.mail('me@domain.com')
code, message = server.rcpt(str(addressToVerify))
server.quit()
# Assume 250 as Success
if code == 250:
print('Success')
else:
print('Bad')
我们在这里所做的是用于发送电子邮件的 SMTP 对话的前三个命令,在发送任何数据之前停止。
实际发出的 SMTP 命令是:HELO、MAIL FROM 和 RCPT TO。我们感兴趣的是 RCPT TO 的响应。如果服务器返回 250,则表示我们可以发送电子邮件(电子邮件地址存在),否则服务器将返回不同的状态代码(通常是 550),表示该服务器上不存在电子邮件地址。
这就是电子邮件验证!
GitHub
您可以在GitHub 上找到完整的 Python 脚本。此脚本使用键盘输入电子邮件地址进行验证,并在错误处理和调试方面有一些附加功能。
请注意,该脚本使用 Python 3 和 dnspython3 库。
PHP 电子邮件验证脚本
有一个适用于PHP的类似脚本,您也可以在GitHub上找到它。