python-3.x - 如何使这个电子邮件地址验证脚本更准确?
问题描述
给定的脚本未正确验证某些电子邮件地址。
例如
himanshu.jain@traveldglobe.com
jobbuzz@timesjobs.com
根据我的脚本无效,但我在leopathu.com/verify-email上验证了这些,这些验证正确无误。
import re
import dns.resolver
import socket
import smtplib
def email_verifier(email):
match = re.match(r'([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$', email)
if(match == None):
return "Invalid Email."
else:
splitEmail = email.split('@')
domain = str(splitEmail[1])
records = dns.resolver.query(domain, 'MX')
mxRecord = records[0].exchange
mxRecord = str(mxRecord)
# 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('sender@gmail.com')
code, message = server.rcpt(str(email))
server.quit()
#returns 250 if valid
if code == 250:
return ('Valid Email Address')
else:
return ('invalid Email Address')
email = input("Enter email address : ")
print(email_verifier(email))
怎么做才能更准确?
解决方案
这两个地址都使我机器上的脚本失败:
[cam@tindall ~]$ python3 verify-email.py
Enter email address : jobbuzz@timesjobs.com
invalid Email Address. Error: 552
b'5.2.2 The email account that you tried to reach is over quota. Please direct the recipient to 5.2.2 https://support.google.com/mail/?p=OverQuotaPerm d3-v6si12074514edj.156 - gsmtp'
[cam@tindall ~]$ python3 verify-email.py
Enter email address : himanshi.jain@traveldglobe.com
invalid Email Address. Error: 550
b'5.1.1 <himanshi.jain@traveldglobe.com> User unknown'
第一个错误看起来像是一个真正的错误(该用户的邮箱已满),但第二个错误可能意味着来自我的机器的测试“邮件”已基于某种垃圾邮件启发式被阻止。这将因连接而异,并且在大多数不起眼的云盒(即 ec2 实例或一小时前启动的 DO droplets)和住宅连接上都会失败。
并非全局电子邮件图上的所有节点都是平等创建的,并且可从过去发送过大量信誉良好的邮件的可信赖邮件主机传递的邮件,通过 SSL 连接并且其所有 DMARC 鸭子都按顺序排列,等等将被处理现实世界的邮件服务器与通过 Comcast 连接调用并声称是“sender@gmail.com”的勉强兼容的 Python 脚本大不相同。
如果,正如我所怀疑的,您正在尝试“清理”您打算用于“批量邮件”(眨眼眨眼)的电子邮件列表,那么您最好使用接近最终发送的设置进行此类检查尽可能设置。换句话说,使用您打算发送活动的实际机器、IP 地址等使用实际的发件人地址进行测试。如果您尝试清理列表以与 Mailchimp 或 Convertkit 等服务一起使用,这当然是不可能的。不幸的是,对于那些在上流社会边缘运作并做着可疑合法性的事情的人来说,这就是生活。
如果您有兴趣半途而废,您可以将验证链接发送到您的链接,并删除任何不关注它的人。这当然会减少列表,但您最终可能会获得更集中的受众和可以在 Mailchimp 等人上安全使用的列表。
如果您只是想验证给定用户是否实际控制给定地址(鉴于此处的上下文似乎不太可能),那么您当然需要向该用户发送一封带有验证令牌的电子邮件。只有通过实际向某人发送邮件,您才能全面验证地址是否 100% 合法。如果这是您的计划,我有一个简单的服务可以让您将此类功能添加到您的站点,而无需维护任何这种繁琐的邮件基础架构。更多细节可以在http://clicktoverify.net/找到。
推荐阅读
- curl - 缓冲区 API:不允许的键字符
- html - 如何指定 W3.CSS 悬停在下拉菜单中的间距?
- c++ - 将 std::function* 传递给模板参数
- ruby-on-rails-4 - 需要 rest-client 到 Chef 中的模块
- python - 将元素作为其他两个 numpy 数组形成 numpy 数组时出现广播错误
- c - Cortex-M4F MCU 启动中关键部分的内存屏障
- c# - 如何使用关闭的 WinForms C# App 发送 toast 通知?
- c++ - 转储 C++ 对象的内存布局在 clang 中不起作用
- python - 如何输出`micro`字符python json.dumps
- python-3.x - 如何在内存中创建类共享方法而不是为python3中的每个对象复制