检验Email是否有效

    前段时间自己做一个检验Email是否有效的工具,通过几天时间的查资料和学习,终于搞定了。主要就是登陆邮箱的smtp服务器,查找邮箱是否存在,在网上很多转载了检验Email有效性的文章,那里就是通过smtp检验的,首先说一下使用telnet登陆smtp服务器发送邮件的过程:

1、连接smtp服务器:telnet smtp.126.com 25

2、发送hello命令: helo 126.com

3、发送mail from命令,表示发件人邮箱:mail from:<[email protected]>

4、发送rcpt to命令,表示收件人邮箱,可以多次使用此命令:rcpt to:<[email protected]>

5、发送data命令,接着就是信件的内容,以“.”结束

6、发送quit命令,结束连接。

上面的每个命令都以/r/n结束,这是smtp协议。但是如今大部分邮件服务器都采用esmtp协议,防止乱发邮件,esmtp也就比smtp多了验证的步骤,在第2步与第3步之间加入验证:

发送auth login命令:auth login

接着发送用户名和密码,用户名和密码都是base64编码的,确认了用户名和密码后就可以发送mail from了。

这样我们就可以通过rcpt to返回的信息判断用户是否存在了。

 

后来我查了一下,有些在线检测邮箱有效性的网站,它们的log中显示的并不用用户名和密码登陆,也就是可以直接利用smtp协议,然后查找到它们是利用MX服务器检测的。

我们可以利用nslookup命令查找到邮箱服务器的MX服务器地址,如nslookup -type=mx 126.com

这样就会显示出126邮箱的MX服务器“126.com MX preference = 50, mail exchanger = 126.mxmail.netease.com”其中126.mxmail.netease.com就是地址了。下面是交互的过程

$ telnet 126.mxmail.netease.com 25
Trying 220.181.15.200...
Connected to 126.mxmail.netease.com.
S:220 126.com Anti-spam GT for Coremail System (126com[20081010])
C:helo localhost
S:250 OK
C:mail from:<[email protected]>           //这个可以随便写,只要不是126的就行
S:250 Mail OK

C:rcpt to:<[email protected]>
S:250 Mail OK                                         //250,表示此邮箱存在
C:rcpt to:<[email protected]>
S:550 User not found: [email protected]              //550,用户不存在
C:quit
S:221 Bye
Connection closed by foreign host.

 

这样如果我们要检测某个邮箱是否有效,我们只要登陆此邮箱的MX服务器,然后检测就OK了。

如果要编程实现的话,只需建立socket连接,然后发送相应的命令,检查接受到的是不是250信息就可以判断邮箱的有效性,这里要注意每次命令都要加上/r/n结束,另外还有一个重点就是要获取MX地址,这个就根据各个开发语言和工具,仁者见仁智者见智,不同的工具实现也不一样的。我用VC和C#实现过,就是运行控制台命令,然后获得命令的标准输出。

你可能感兴趣的:(socket,服务器,email,工具,login,邮件服务器)