前段时间自己做一个检验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#实现过,就是运行控制台命令,然后获得命令的标准输出。