【如何校验邮件地址的有效性】第三篇 :原理二

目标邮件服务器

此过程的第一步是检查是否存在我们要验证的电子邮件地址域的MX记录。MX记录是保存有关处理特定域的邮件的邮件服务器信息的DNS记录。如果域名没有MX记录,则也不存在有效的电子邮件地址。我们来看看使用nslookup 命令的两个例子 请注意,您可以类似地使用其他命令,如 

我们的示例电子邮件测试将是 test@gmail.com  test@nonexistingdomainname123456.com ,我们将使用Google的公共DNS服务器8.8.8.8获取DNS记录。

> nslookup

> server 8.8.8.8
Default Server:  google-public-dns-a.google.com
Address:  8.8.8.8

> set q=mx

> gmail.com
Server:  google-public-dns-a.google.com
Address:  8.8.8.8

Non-authoritative answer:
gmail.com       MX preference = 40, mail exchanger = alt4.gmail-smtp-in.l.google.com
gmail.com       MX preference = 30, mail exchanger = alt3.gmail-smtp-in.l.google.com
gmail.com       MX preference = 10, mail exchanger = alt1.gmail-smtp-in.l.google.com
gmail.com       MX preference = 5, mail exchanger = gmail-smtp-in.l.google.com
gmail.com       MX preference = 20, mail exchanger = alt2.gmail-smtp-in.l.google.com

> nonexistingdomainname123456.com
Server:  google-public-dns-a.google.com
Address:  8.8.8.8

*** google-public-dns-a.google.com can't find nonexistingdomainname123456.com: Non-existent domain

对于非现有域的电子邮件地址,根本找不到任何MX服务器。这自动表示test@nonexistingdomainname123456.com 不是有效的电子邮件地址。对于 test@gmail.com ,情况不同。我们可以看到,对于 gmail.com 域,有5条MX记录。通常只有少量电子邮件的域只能看到1个MX记录,但较大的服务可能有多个邮件服务器。重要的是不要在这里选择一个邮件服务器。为了正确验证电子邮件,我们可能必须使用所有发现的MX记录中的所有服务器。

为什么这么重要?想像一下我们从列表中选出一个MX服务器的情况。可能发生的是,当我们尝试连接到它以验证电子邮件时,服务器将不会因为任何原因而进行响应,或者由于该特定服务器的最近问题,其响应将报告临时错误。如果我们不尝试其他可用的邮件服务器,可能会导致错误的结果。另外一个服务器可能会很好,并且给我们正确的答案。所以,如果一个服务器有任何问题,只要尝试另一个服务器。这些问题包括无法连接到SMTP端口,没有接收到问候,对HELO / EHLO或MAIL FROM命令的无效响应。

处理Greetdelay和HELO / EHLO

在这一步,我们假设我们有一个来自目标域的DNS MX记录的邮件服务器。下一步是将目标邮件服务器连接到其端口25 / TCP的SMTP端口。我们刚才提到,如果无法建立连接,那么我们应该尝试另一台服务器(如果有的话)。

如果TCP连接建立,现在重要的是等待邮件服务器发送我们的问候语。我们不能简单地将我们的命令发送到服务器,因为服务器首先在SMTP协议中规定。一些服务器被配置为拒绝与不尊重的客户端进行协作。这是许多反垃圾邮件技术之一。垃圾邮件发送程序有时被编程为尽可能简单和快速。这就是为什么他们不等待服务器的问候,并在连接建立后立即开始发送命令。拒绝这种客户端的服务器可能在最早阶段摆脱这些垃圾邮件发送者。

另一种相对较新的反垃圾邮件技术叫做Greetdelay。基本思想是基于我们已经提到的同样的事实 - 垃圾邮件发送者用于发送电子邮件的许多程序非常简单和编码,以尽可能快地工作。如果要发送数百万封电子邮件获得一些点击和销售,他们必须快速。Greetdelay的想法是让SMTP协议的RFC规范允许的时间延迟消息传输代理(MTA,想要发送电子邮件的软件)。例如,执行Greetdelay的服务器在向客户端发送问候之前等待30秒。或60秒。或90.不完全符合协议的垃圾邮件软件可能会在允许发送消息之前放弃。可以在SMTP通信的其他阶段实现类似的策略。

因此,为了顺利通过Greetdelay机制,电子邮件验证机引擎必须将其超时设置至少5分钟。问候语应该带有代码SMTP响应代码220.其他代码可能意味着我们应该尝试另一个MX服务器。

收到问候语后,客户端(我们的电子邮件验证引擎)应发送 HELO  EHLO 命令。由于 HELO 命令仅存在于与旧软件的兼容性,所以每次都使用 EHLO 其唯一的参数是客户端的完全限定域名(FQDN)。在我们发送MAIL FROM 命令之后,我们将介绍在下一节中运行电子邮件验证客户端的服务器拥有自己的域名的重要性 但在我们可以这样做之前,我们将等待对我们的EHLO的答复 这里的SMTP代码应该是250,否则我们可以假设这个服务器有问题。

让我们看看当我们和其中一个Gmail的服务器(从S开始的线路  来自服务器,从C开始的线路 来自我们的客户端)时,会发生什么情况:

> nc alt4.gmail-smtp-in.l.google.com 25
S: 220 mx.google.com ESMTP m14si19812165icp.91 - gsmtp
C: EHLO mail.example.com
S: 250-mx.google.com at your service, [198.51.100.123]
S: 250-SIZE 35882577
S: 250-8BITMIME
S: 250-STARTTLS
S: 250-ENHANCEDSTATUSCODES
S: 250-PIPELINING
S: 250-CHUNKING
S: 250 SMTPUTF8

我们使用 Netcat 作为客户端,允许我们手动键入SMTP命令。我们的IP地址是198.51.100.123。MX服务器向我们发送正确的问候语,并使用EHLO 命令回复 服务器的响应代码是250,它向我们发送了一个受支持的扩展名单,这对我们来说并不重要

EmailCamel专注全球邮箱验证,让发邮件更容易!领取+200邮箱验证量,快速体验

扫码关注我们(已有+5000关注),获取邮箱验证及海外群邮干货!