验证邮箱是否真实存在类(vb.net)
2007-07-21 01:36
567 查看
在做群发软件时,为了提高准确率,除了要保实邮箱合法性,发现也可以验证邮箱真实性。
在上篇发表的文章中也有邮箱真实性验证功能,但是我测试了一下,好像不准,不能使用;
VB。NET类我也测试了一下,发现比较准确,CheckEmail() 返回值小于等于1表示邮箱存在,
其它返回值表示邮箱不存在,至少代码表示什么错误,有兴趣的朋友自已研究。。。我比较懒啦
基本原理:
从邮件地址分离出帐户名和域名
查找该域的邮件服务器
收集邮件服务器的应答信息, 如果对MAIL FROM指令有肯定的应答, 至少表明邮件地址的域名正确, 如果对RCPT TO指令有肯定的应答, 表明邮件服务器已认可该地址
实例源代码(vn.net) **********
Namespace WebXml.com.cn.CryptoAngelProfessional
'VB.NET编程验证邮件地址的合法性
Public Class ValidateEmailAddress
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 = (?<server>[^/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
Public Function CheckEmail(ByVal sEmail As String, Optional ByVal sPort As Integer = 25) As Byte
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 = "<myIP@" & Remote_Addr + ">"
'尽可能延迟创建对象的时间
Dim oConnection As New TcpClient()
Try
'超时时间
oConnection.SendTimeout = 5000
'连接SMTP端口
oConnection.Connect(mserver, sPort)
'收集邮件服务器的应答信息
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
End Class
End Namespace
调用 CheckEmail()
在上篇发表的文章中也有邮箱真实性验证功能,但是我测试了一下,好像不准,不能使用;
VB。NET类我也测试了一下,发现比较准确,CheckEmail() 返回值小于等于1表示邮箱存在,
其它返回值表示邮箱不存在,至少代码表示什么错误,有兴趣的朋友自已研究。。。我比较懒啦
基本原理:
从邮件地址分离出帐户名和域名
查找该域的邮件服务器
收集邮件服务器的应答信息, 如果对MAIL FROM指令有肯定的应答, 至少表明邮件地址的域名正确, 如果对RCPT TO指令有肯定的应答, 表明邮件服务器已认可该地址
实例源代码(vn.net) **********
Namespace WebXml.com.cn.CryptoAngelProfessional
'VB.NET编程验证邮件地址的合法性
Public Class ValidateEmailAddress
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 = (?<server>[^/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
Public Function CheckEmail(ByVal sEmail As String, Optional ByVal sPort As Integer = 25) As Byte
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 = "<myIP@" & Remote_Addr + ">"
'尽可能延迟创建对象的时间
Dim oConnection As New TcpClient()
Try
'超时时间
oConnection.SendTimeout = 5000
'连接SMTP端口
oConnection.Connect(mserver, sPort)
'收集邮件服务器的应答信息
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
End Class
End Namespace
调用 CheckEmail()
相关文章推荐
- 如何验证会员系统中用户的邮箱是否真实存在
- VB.net中使用正则表达式验证邮箱地址是否合法
- 如何验证会员系统中用户的邮箱是否真实存在
- C程序验证邮件地址是否真实存在(不是验证邮箱格式)
- 会员系统中需要验证用户的邮箱是否真实存在
- 验证邮箱是否真实存在 c#
- 验证邮箱是否真实存在的方法
- Java与邮件系统交互之使用Socket验证邮箱是否存在
- VB.NET判断一个路径的文件是否存在
- Ajax实时验证用户名/邮箱等是否已经存在的代码打包
- PHP自带方法验证邮箱是否存在
- asp.net AJAX 验证用户名是否存在 -Jquery
- asp.net结合Ajax验证用户名是否存在的代码
- Ajax实时验证用户名/邮箱等是否已经存在的代码打包
- asp.net AJAX 验证用户名是否存在 -Jquery
- SMTP判断邮箱是否存在,检查email地址是否真实存在
- asp.net mvc 客户端加验证非空验证数据库是否存在验证
- jquery.validate自定义验证方法(检验邮箱是否存在)
- vb.net 验证输入内容是否是数字