Validar la sintaxis es simple con una expresion regular. Lo complicado es
validar si existe en el dominio. Lo primero que debes hacer es buscar el
servidor (o servidores) de correo correspondiente al dominio del mail. Esto
se hace a traves de DNS, buscando el registro MX del dominio. Si el codigo
va a correr en W2K/XP/2003, puedes usar esta clase para obtenerlo:
http://www.mvps.org/emorcillo/es/codigo/inet/dns.shtml. Luego lo que hay que
hacer es conectarse a los servidores y verificar si la direccion es correcta
en ese servidor. El codigo quedaria asi:
Public Shared Function EsMailValido(ByVal email As String) As Boolean
' Compruebo la sintaxis del mail
If Regex.IsMatch(email, "^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$")
Then
' Extraigo el dominio
Dim dominio As String = email.Split("@"c)(1)
' Obtengo los servidores SMTP que
' reciben el correo del dominio
Dim mx() As String = Edanmo.Net.Dns.GetMailExchangeServers(dominio)
For i As Integer = 0 To mx.Length - 1
Dim smtp As TcpClient
Try
' Abro una conexion al servidor
smtp = New TcpClient(mx(i), 25)
smtp.ReceiveTimeout = 15000 ' Esperar hasta 15 seg por una
respuesta
' Conecto OK al SMTP?
If ReceiveData(smtp).StartsWith("220") Then
' Envio saludo al servidor
SendData(smtp, String.Format("HELO {0}",
Dns.GetHostName()))
' OK?
If ReceiveData(smtp).StartsWith("250") Then
' Envio una direccion como fuente del mail
SendData(smtp, "MAIL FROM: <***@test.com>")
' OK?
If ReceiveData(smtp).StartsWith("250") Then
' Envio la direccion que quiero comprobar
SendData(smtp, String.Format("RCPT TO: <{0}>",
email))
' OK?
If ReceiveData(smtp).StartsWith("250") Then
' El mail es correcto
Return True
End If
End If
End If
End If
Catch
' Ignoro cualquier excepcion
Finally
' Cierro la conexion
If Not smtp Is Nothing Then smtp.Close()
smtp = Nothing
End Try
Next
End If
' La direccion no es correcta
Return False
End Function
Private Shared Sub SendData(ByVal cliente As TcpClient, ByVal texto As
String)
Dim stream As NetworkStream = cliente.GetStream
Dim data() As Byte = Encoding.ASCII.GetBytes(texto &
Environment.NewLine)
stream.Write(data, 0, data.Length)
End Sub
Private Shared Function ReceiveData(ByVal cliente As TcpClient) As String
Dim stream As NetworkStream = cliente.GetStream
Dim data(cliente.ReceiveBufferSize - 1) As Byte
stream.Read(data, 0, cliente.ReceiveBufferSize)
Return
Encoding.ASCII.GetString(data).TrimEnd(Environment.NewLine.Chars(0))
End Function
--
Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
Inteligencia militar son dos términos contradictorios.
Groucho Marx