VB.NET验证邮件地址的合法性实现代码
VB.NET验证邮件地址的合法性实现代码
发布时间:2016-12-29 来源:查字典编辑
摘要:一、提出问题现在,对于用户在Web页面上或电话中给出的Email地址,我们越来越不敢肯定它是否真的有效。在今天这个垃圾邮件泛滥成灾的年代,人...

一、提出问题

现在,对于用户在Web页面上或电话中给出的Email地址,我们越来越不敢肯定它是否真的有效。在今天这个垃圾邮件泛滥成灾的年代,人们完全有理由舍不得轻易透露Email地址。

另一方面,对于通过正规途径得到的邮件地址,当我们将它用于合法的目的时,也常常要为邮件地址是否有效而烦恼,用户可能有意或无意地写错地址,也可能由于长时间不访问而导致邮箱失效。对于少量的邮件地址,也许可以手工验证其合法性,例如发送测试email;但是,当邮件地址的数量达到数万甚至更多时,手工验证就不可能了,必须用专门的工具或自己编写程序自动执行验证。

常规的验证方法只从email地址的格式判断其合法性,例如检查它是否包含“@”和“.”符号。显然,这种检查是不充分的,邮件地址格式正确并不证明它一定有效。由于这个原因,一些网站采取了用email发送密码、特殊资源的URL等办法,或者要求用户回复email,以此确保email地址的有效性。但是,这些办法不见得任何时候都有效,例如,你可能不是从自己的网站上收集用户email,而是通过第三者获得。

考虑到这些原因,验证email地址合法性最根本的办法是查询邮件服务器。本文将给出完成这一任务的完整VB.NET代码。

二、邮件服务器之合法性

对于任何邮件地址,判断其合法性的第一步当然是看看它的格式是否正确,例如是否包含“@”和“.”符号,这方面的资料很多,甚至还有现成的控件,所以本文不再赘述。我们的任务从判断邮件地址的域是否合法开始,例如对于abc@sina.com.cn这个地址,首先判断sina.com.cn的邮件服务器是否有效。

每一个域有一个MX记录,即邮件交换器(Mail Exchanger)记录,它指向该域内处理email的服务器,我们只要查询DNS服务器即可获得该信息。Windows本身带来的nslookup命令非常适合于完成该任务,例如,要查找sina.com.cn的邮件服务器,只需执行nslookup -type=mx sina.com.cn,其中-type=MX表示要查找MX记录,输出结果如图一所示。Windows的nslookup命令要安装了TCP/IP协议后才可用,详细说明可参见Windows帮助。

VB.NET验证邮件地址的合法性实现代码1

下面的GetMailServer函数封装了调用Windows nslookup命令的操作,根据参数中指定的域名返回邮件服务器。

Private Function GetMailServer(ByVal sDomain As String) As String

Dim info As New ProcessStartInfo()

Dim ns As Process

'调用Windows的nslookup命令,查找邮件服务器

info.UseShellExecute = False

info.RedirectStandardInput = True

info.RedirectStandardOutput = True

info.FileName = "nslookup"

info.CreateNoWindow = True

'查找类型为MX。关于nslookup的详细说明,请参见

'Windows帮助

info.Arguments = "-type=MX " + sDomain.ToUpper.Trim

'启动一个进行执行Windows的nslookup命令()

ns = Process.Start(info)

Dim sout As StreamReader

sout = ns.StandardOutput

' 利用正则表达式找出nslookup命令输出结果中的邮件服务器信息

Dim reg As Regex = New Regex("mail exchanger = (?[^s]+)")

Dim mailserver As String

Dim response As String = ""

Do While (sout.Peek() > -1)

response = sout.ReadLine()

Dim amatch As Match = reg.Match(response)

If (amatch.Success) Then

mailserver = amatch.Groups("server").Value

Exit Do

End If

Loop

Return mailserver

End Function

三、邮件地址之合法性

只要邮件地址中指定的域合法,我们就可以连接邮件服务器,试着发送一个email。如果邮件服务器回答说该用户非法或不存在,表明邮件地址无效。这一步的主要操作包括创建一个连接邮件服务器的Socket,然后按照SMTP邮件传输协议的要求与服务器通信,完成邮件发送操作。关于SMTP协议的详细说明,有兴趣的读者可参见SMTP规范(RFC 821):http://www.ietf.org/rfc/rfc821.txt。

下面CheckEmail函数的输入参数是一个邮件地址,函数的返回值表示该地址是否合法。该函数有两个数值可随意调整:在发送邮件的过程中,我们要向对方的邮件服务器提供一个合法的域名以表明自己的身份,这里选择的是sina.com.cn;根据网络和对方邮件服务器的忙闲程度,响应时间也会发生变化,这里选择的等待时间是3秒。当网络或对方服务器非常忙时,减小等待时间会增加测试失败的可能性。

Public Function CheckEmail(ByVal sEmail As String) As Long

Dim oStream As NetworkStream

Dim sFrom As String '发件人

Dim sTo As String '收件人

Dim sResponse As String '邮件服务器的应答

Dim Remote_Addr As String '发件人的域名

Dim mserver As String '邮件服务器

Dim sText As String()

sTo = "<" + sEmail + ">"

' 从邮件地址分离出帐户名和域名

sText = sEmail.Split(CType("@", Char))

' 查找该域的邮件服务器

mserver = GetMailServer(sText(1))

'mserver为空值表明查找邮件服务器失败

If mserver = "" Then

Return 4

Exit Function

End If

'发件人地址的域名必须合法

Remote_Addr = "sina.com.cn"

sFrom = "

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新asp.net教程学习
热门asp.net教程学习
编程开发子分类