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

一、提出问题
  现在,对于用户在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帮助。
  
 
  下面的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 = "  '尽可能延迟创建对象的时间
  Dim oConnection As New TcpClient()
  Try
  '超时时间
  oConnection.SendTimeout = 3000
  '连接SMTP端口
  oConnection.Connect(mserver, 25)
  '收集邮件服务器的应答信息
  oStream = oConnection.GetStream()
  sResponse = GetData(oStream)
  sResponse = SendData(oStream, "HELO " & Remote_Addr & vbCrLf)
  sResponse = SendData(oStream, "MAIL FROM: " & sFrom & vbCrLf)
  '如果对MAIL FROM指令有肯定的应答,
  '至少表明邮件地址的域名正确
  If ValidResponse(sResponse) Then
  sResponse = SendData(oStream, "RCPT TO: " & sTo & vbCrLf)
  '如果对RCPT TO指令有肯定的应答
  '表明邮件服务器已认可该地址
  If ValidResponse(sResponse) Then
  Return 1 '邮件地址有效
  Else
  Return 2 '只有域名有效
  End If
  End If
  '结束与邮件服务器的会话
  SendData(oStream, "QUIT" & vbCrLf)
  oConnection.Close()
  oStream = Nothing
  Catch
  Return 3 '错误!
  End Try
  End Function
  
  '获取服务器应答数据,并将其转换为String
  Private Function GetData(ByRef oStream As NetworkStream) As String
  
  Dim bResponse(1024) As Byte
  Dim sResponse As String
  
  Dim lenStream As Integer = oStream.Read(bResponse, 0, 1024)
  If lenStream > 0 Then
  sResponse = Encoding.ASCII.GetString(bResponse, 0, 1024)
  End If
  Return sResponse
  End Function
  '向邮件服务器发送数据
  Private Function SendData(ByRef oStream As NetworkStream, ByVal sToSend As String) As String
  Dim sResponse As String
  '将String转换成Byte数组
  Dim bArray() As Byte = Encoding.ASCII.GetBytes(sToSend.ToCharArray)
  '发送数据
  oStream.Write(bArray, 0, bArray.Length())
  sResponse = GetData(oStream)
  '返回应答
  Return sResponse
  End Function
  
  '服务器是否返回肯定的回答?
  Private Function ValidResponse(ByVal sResult As String) As Boolean
  Dim bResult As Boolean
  Dim iFirst As Integer
  If sResult.Length > 1 Then
  iFirst = CType(sResult.Substring(0, 1), Integer)
  '如果服务器返回应答的第一个字符小于'3'
  '我们认为服务器已认可刚才的操作
  If iFirst < 3 Then bResult = True
  End If
  Return bResult
  End Function
  
  CheckEmail函数的返回值表示测试结果:1表示邮件地址合法,2表示只有域名正确(可能是用户的邮件帐户无效),3表示出现了错误,4表示无法找到邮件服务器。
  
  四、用户界面
  以上我们完成了测试邮件地址是否合法的核心功能,这些函数可用于各种形式的应用程序,包括Web服务、Windows应用程序、控件等,最多只要修改一下声明方式。为便于测试这些函数,下面我们要做一个Windows应用形式的简单用户界面。
  
  启动VS.NET,选择新建Visual Basic项目、Windows应用程序,如图二,输入项目名称CheckMail以及保存位置,点击“确定”按钮,VS.NET创建一个新的项目。
  
 
  从工具箱把一个文本标签、一个输入框和一个按钮拖到VS.NET自动创建的窗体上。将窗体的TEXT属性改为“Email地址测试”,文本标签的TEXT属性改为“邮件地址”,按钮的TEXT属性改为“Check!”,调整各个控件的位置,使其看起来整齐美观,如图三。
  
 
  双击按钮,输入点击按钮时执行的Button1_Cli

(0)

相关推荐

  • vb.net 数组参与SQL语句的查询范例

    首先定义数组,我是同事session传值的 复制代码 代码如下: Dim struser As New List(Of String)struser = Session("chooseuser")strruser = "" For a = 0 To struser.Count - 1If a = 0 Thenstrruser = "'" & struser.Item(a).ToString.Trim & "'"

  • VB.NET进度条的方法代码

    1.创建进度条: 复制代码 代码如下: <DIV id="Lay1" style="Z-INDEX: 1; LEFT: 1%; VISIBILITY: hidden; WIDTH: 99%; CURSOR: crosshair; POSITION: absolute; TOP: 32px; HEIGHT: 95%; BACKGROUND-COLOR: #ffffff"><FONT face="宋体"></FONT&g

  • VB.net 查询获取数据库数据信息

    复制代码 代码如下: '数据操作执行 Public Sub getConn(ByVal SqlStr As String, ByVal TableName As String) Try objCommand.CommandText = SqlStr objDataSet.Clear() objDataAdapter.SelectCommand = objCommand objDataAdapter.Fill(objDataSet, TableName) Catch ex As Exception

  • VB.NET 中删除DataGridView中所选行的小例子

    复制代码 代码如下: For Each r As DataGridViewRow In DataGridView1.SelectedRows    If Not r.IsNewRow Then        DataGridView1.Rows.Remove(r)    End IfNext 其实就是一个IsNewRow属性,判断是不是为新选中的行,如果不是,remove!

  • VB.net读取Word文档属性的方法

    复制代码 代码如下: '对自定义属性进行读取         Dim Properties = SourceDoc.CustomDocumentProperties            Dim PropertyType As Type = Properties.GetType Try            Dim Authorprop = PropertyType.InvokeMember("Item", Reflection.BindingFlags.Default Or Refl

  • asp.net(vb.net)获取真实IP的函数

    aspx vb.net获取真实IP的函数如下: 复制代码 代码如下: <script runat="server"> Public Function CheckIp(ByVal ip As String) As Boolean Dim pat As String = "^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$" Dim reg As Regex = New Regex(pat) if ip = "

  • VB.NET中Caching的使用方法

    ASP.NET通过两种方式支持缓存:通过Cache API存储任意数据,通过页面输出缓存经常被访问的页面.让我们来看一个例子. 一个电子商务的站点, 它的目录一般一周更新一次.站点提供了一套用户界面让客户订购产品.当一个客户浏览目录时,系统将通过网络去查询数据库,进行各种计算,最后返回结果. 从服务器查询这些目录数据的操作是很频繁的.我们知道,这些数据一周才变化一次.所以以下的几种操作将带来性能上的损失. 1. 执行ASP.NET的程序生成对数据库的查询语句.2. 通过网络,和数据库服务器进行通

  • asp.net 验证码的简单制作(vb.net+C#)

    网站上验证码效果一般制作方法是: 1)使用HttpHandler(一般处理程序)绘制随机验证码的图,以及产生随机码,并输出到页面的OutputStream中. 2)页面中使用异步方式(js等)进行刷新当前页面的验证码. [示例] 1)创建一个"一般应用处理程序ashx",代码如下: [C#] 复制代码 代码如下: public class ValidationCode : IHttpHandler { //随机发生器 static Random r = new Random(Guid.

  • VB.NET中TextBox的智能感知应用实例

    本文实例形式介绍了VB.NET中TextBox的智能感知实现方法,功能非常实用,具体如下: 该实例主要实现:在TextBox中键入字符,可以智能感知出列表,同时对不存在的单词(没有出现智能感知的)自动显示"Not Found". 对此功能首先想到的是利用TextBox的AutoComplete功能.该功能允许你设置不同形式的AutoComplete智能感知,譬如: 1)AutoCompleteSource:设置感知源头类型(这里是CustomSource). 2)AutoComplet

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

    一.提出问题 现在,对于用户在Web页面上或电话中给出的Email地址,我们越来越不敢肯定它是否真的有效.在今天这个垃圾邮件泛滥成灾的年代,人们完全有理由舍不得轻易透露Email地址. 另一方面,对于通过正规途径得到的邮件地址,当我们将它用于合法的目的时,也常常要为邮件地址是否有效而烦恼,用户可能有意或无意地写错地址,也可能由于长时间不访问而导致邮箱失效.对于少量的邮件地址,也许可以手工验证其合法性,例如发送测试email:但是,当邮件地址的数量达到数万甚至更多时,手工验证就不可能了,必须用专门

  • js正则表达式验证邮件地址

    我们最经常遇到的验证,就是电子邮件地址验证.网站上常见.各种网页脚本也都常用"正则表达式"(regular expression)对我们输入的电子邮件地址进行验证,判断是否合法.有的还能分解出用户名和域名.现在用JavaScript语言实现一下电子邮件地址验证程序,用的是JavaScript语言的正则表达式库. 效果图: 不合法的情况: 合法的情况: 源代码如下,该网页已在IE.Firefox.Chrome上验证通过: <!DOCTYPE html PUBLIC "-/

  • AJAX和WebService实现邮箱验证(无刷新验证邮件地址是否合法)

    首先在项目里面添加服务引用 ---------------------------验证 Email 地址是否正确.aspx----------------- 复制代码 代码如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id=

  • javascript验证邮件地址和MX记录的方法

    本文实例讲述了javascript验证邮件地址和MX记录的方法.分享给大家供大家参考.具体如下: // Tests for a valid email address and optionally tests for valid MX records, too. function is_valid_email($email, $test_mx = false) { if(eregi("^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+

  • javascript实现验证IP地址等相关信息代码

    本代码是从个人项目中提取出来的,应该可以算的上是相当全面有效的IP相关信息的验证代码了,用来前端验证 /* ****************** */ /* 判断IP地址是否合法 */ var judgeIpIsLegal = function(ipAddr){ var regIps = /^(((25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|[0-9])\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]\d|[0-9]))$/; return regIp

  • C# 邮件地址是否合法的验证

    复制代码 代码如下: /// <summary> /// 检测输入的邮件地址strEmail是否合法,非法则返回true. /// </summary> public bool CheckEmail(string strEmail) { int i, j; string strTmp, strResult; string strWords = "abcdefghijklmnopqrstuvwxyz_-.0123456789"; //定义合法字符范围 bool b

  • php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)

    本文实例需要验证的内容:邮件地址.Url地址.电话号码.邮政编码,验证方法分享给大家供大家参考,具体内容如下 1.电子邮件地址的校验 <?php /* 校验邮件地址*/ function checkMail($email) { //用户名,由"\w"格式字符."-"或"."组成 $email_name= "\w|(\w[-.\w]*\w)"; //域名中的第一段,规则和用户名类似,不包括点号"." $

  • JS验证邮件地址格式方法小结

    本文实例讲述了JS验证邮件地址格式方法.分享给大家供大家参考,具体如下: 示例1: 复制代码 代码如下: <asp:TextBox ID="txt_Email" runat="server" onblur="checkRate(this.id)"></asp:TextBox> function checkRate(input) { var re = /^[_".0-9a-z-]+@([0-9a-z][0-9a-z

  • 如何准确判断邮件地址是否存在

    我总结了几种邮件出现重发.漏发的解释:1.网络:2.防火墙:3.服务器的自我保护,比如防止大批量发送时挂掉或者垃圾邮件,我觉得第三种解释靠谱一些,对于遇到的这些问题在下面的文章中给出了补救措施. 公司邮箱目前使用的是Zimbra,该邮件服务器目前不甚稳定,经常出现重发.漏发问题.经测试,每100封邮件仅可成功发送98封左右,以下是测试数据: 测试用例1:100封,总用时约:16min:实收97封,失败3次,3次错误信息均为:javax.mail.MessagingException: Could

  • JavaScript email邮箱/邮件地址的正则表达式及分析

    简言 在做用户注册时,常会用到邮箱/邮件地址的正则表达式.本文列举了几种方案,大家可以根据自己的项目情况,选择最适合的方案. 方案1 (常用) 规则定义如下: 以大写字母[A-Z].小写字母[a-z].数字[0-9].下滑线[_].减号[-]及点号[.]开头,并需要重复一次至多次[+]. 中间必须包括@符号. @之后需要连接大写字母[A-Z].小写字母[a-z].数字[0-9].下滑线[_].减号[-]及点号[.],并需要重复一次至多次[+]. 结尾必须是点号[.]连接2至4位的大小写字母[A-

随机推荐