Discussion:
validar emails
(demasiado antiguo para responder)
walter
2005-02-15 13:50:39 UTC
Permalink
alguien sabe como hacer un validador de emails sin usar
webservices??
Eduardo A. Morcillo [MS MVP VB]
2005-02-15 14:20:02 UTC
Permalink
Post by walter
alguien sabe como hacer un validador de emails sin usar
webservices??
¿Validar en que sentido? ¿Si esta correctamente escrito o si existe en el
dominio?
--
Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo

Hay dos cosas infinitas: el universo y la estupidez humana.
Albert Einstein
Walter
2005-02-15 14:32:26 UTC
Permalink
Validar sintaxis y si existe en el dominio, vi que hay
algunos componentes hechos en .net como los de component
space pero son costosos y mi intencion es saber al menos
si hay algun tutorial al respecto esplicando la tecnica o
codigo fuente del cual aprender.

Saludos,

Walter
-----Mensaje original-----
Post by walter
alguien sabe como hacer un validador de emails sin usar
webservices??
¿Validar en que sentido? ¿Si esta correctamente escrito
o si existe en el
dominio?
--
Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
Hay dos cosas infinitas: el universo y la estupidez
humana.
Albert Einstein
.
Eduardo A. Morcillo [MS MVP VB]
2005-02-15 17:06:34 UTC
Permalink
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
Walter
2005-02-17 01:58:14 UTC
Permalink
Muchisimas gracias, lo voy a implementar cualquier cosa te
comento

Mil gracias

Walter
-----Mensaje original-----
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
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
Public Shared Function EsMailValido(ByVal email As
String) As Boolean
' Compruebo la sintaxis del mail
*\.\w+([-.]\w+)*$")
Then
' Extraigo el dominio
' 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
' 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
.
Imac_Man
2005-02-15 14:55:10 UTC
Permalink
si el caso es que deseas validar la sintaxis te paso un codigo que encontre
por alli y me ayuda mucho

Private Function funValidaEmail(ByVal strEmail As String) As Boolean

Dim strArray
Dim strItem
Dim i
Dim c
Dim blnIsItValid

' asumimos que el correo es correcto por omision
blnIsItValid = True

' separamos el dominio en dos partes ***@dominio.ext
strArray = Split(strEmail, "@")

' si existen mas o menos que dos partes entonces ejecutamos
If UBound(strArray) <> 1 Then
blnIsItValid = False
funValidaEmail = blnIsItValid
Exit Function
End If

' revisamos cada parte
For Each strItem In strArray

If Len(strItem) <= 0 Then
blnIsItValid = False
funValidaEmail = blnIsItValid
Exit Function
End If

' revisamos cada caracter de cada parte
' solamente los siguientes "abcdefghijklmnopqrstuvwxyz_-."
' o los diez digitos permitidos
For i = 1 To Len(strItem)
c = LCase(Mid(strItem, i, 1))
' if there is an illegal character in the part
If InStr("abcdefghijklmnopqrstuvwxyz_-.", c) <= 0 And Not
IsNumeric(c) Then
blnIsItValid = False
funValidaEmail = blnIsItValid
Exit Function
End If
Next

' el primer y ultimo caracter de cada parte no puede ser .
(punto)
If VisualBasic.Left(strItem, 1) = "." Or
VisualBasic.Right(strItem, 1) = "." Then
blnIsItValid = False
funValidaEmail = blnIsItValid
Exit Function
End If
Next

' la segunda parte (dominio.ext) debe contener . (punto)
If InStr(strArray(1), ".") <= 0 Then
blnIsItValid = False
funValidaEmail = blnIsItValid
Exit Function
End If

'revisamos la longitud o largo de la extension
i = Len(strArray(1)) - InStrRev(strArray(1), ".")
'la longitud de la extension puede ser solamente 2, 3, or 4
'cubrimos la nueva extension "info"
If i <> 2 And i <> 3 And i <> 4 Then
blnIsItValid = False
funValidaEmail = blnIsItValid
Exit Function
End If

'despues de .(punto) no puede seguir otro punto
If InStr(strEmail, "..") > 0 Then
blnIsItValid = False
funValidaEmail = blnIsItValid
Exit Function
End If

' finalizamos
funValidaEmail = blnIsItValid

End Function
Post by walter
alguien sabe como hacer un validador de emails sin usar
webservices??
walter
2005-02-15 15:39:19 UTC
Permalink
Sabes como puedo hacer o donde puedo encontrar
informacion de como validar dominios y cuentas de email

gracias!!

Walter
-----Mensaje original-----
si el caso es que deseas validar la sintaxis te paso un
codigo que encontre
por alli y me ayuda mucho
Private Function funValidaEmail(ByVal strEmail As
String) As Boolean
Dim strArray
Dim strItem
Dim i
Dim c
Dim blnIsItValid
' asumimos que el correo es correcto por omision
blnIsItValid = True
' separamos el dominio en dos partes
' si existen mas o menos que dos partes entonces
ejecutamos
If UBound(strArray) <> 1 Then
blnIsItValid = False
funValidaEmail = blnIsItValid
Exit Function
End If
' revisamos cada parte
For Each strItem In strArray
If Len(strItem) <= 0 Then
blnIsItValid = False
funValidaEmail = blnIsItValid
Exit Function
End If
' revisamos cada caracter de cada parte
' solamente los
siguientes "abcdefghijklmnopqrstuvwxyz_-."
' o los diez digitos permitidos
For i = 1 To Len(strItem)
c = LCase(Mid(strItem, i, 1))
' if there is an illegal character in
the part
If InStr("abcdefghijklmnopqrstuvwxyz_-
.", c) <= 0 And Not
IsNumeric(c) Then
blnIsItValid = False
funValidaEmail = blnIsItValid
Exit Function
End If
Next
' el primer y ultimo caracter de cada parte
no puede ser .
(punto)
If VisualBasic.Left(strItem, 1) = "." Or
VisualBasic.Right(strItem, 1) = "." Then
blnIsItValid = False
funValidaEmail = blnIsItValid
Exit Function
End If
Next
' la segunda parte (dominio.ext) debe contener .
(punto)
If InStr(strArray(1), ".") <= 0 Then
blnIsItValid = False
funValidaEmail = blnIsItValid
Exit Function
End If
'revisamos la longitud o largo de la extension
i = Len(strArray(1)) - InStrRev(strArray(1), ".")
'la longitud de la extension puede ser solamente
2, 3, or 4
'cubrimos la nueva extension "info"
If i <> 2 And i <> 3 And i <> 4 Then
blnIsItValid = False
funValidaEmail = blnIsItValid
Exit Function
End If
'despues de .(punto) no puede seguir otro punto
If InStr(strEmail, "..") > 0 Then
blnIsItValid = False
funValidaEmail = blnIsItValid
Exit Function
End If
' finalizamos
funValidaEmail = blnIsItValid
End Function
Post by walter
alguien sabe como hacer un validador de emails sin usar
webservices??
.
Jorge Serrano [MVP VB]
2005-02-15 14:57:03 UTC
Permalink
Hola Walter,

puedes utilizar expresiones regulares para validar si una dirección de
correo electrónico es válida o no.

Un saludo,

Jorge Serrano Pérez
MVP VB.NET
Post by walter
alguien sabe como hacer un validador de emails sin usar
webservices??
walter
2005-02-15 15:12:52 UTC
Permalink
Gracias, jorge, sabes donde pueda encontrar info para
validar contra el dominio una determinada cuenta, como
para aprender la tecnica

saludos,

Walter
-----Mensaje original-----
Hola Walter,
puedes utilizar expresiones regulares para validar si
una dirección de
correo electrónico es válida o no.
Un saludo,
Jorge Serrano Pérez
MVP VB.NET
Post by walter
alguien sabe como hacer un validador de emails sin
usar
Post by walter
webservices??
.
Jorge Serrano [MVP VB]
2005-02-15 15:19:06 UTC
Permalink
Hola,

por completar mi anterior contestación;

Para usar expresiones regulares para validar una dirección de correo
electrónico:

Dim email As String = TextBox1.Text.Trim()
Dim patron As String =
"^[\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,7}$"
Dim miRegEx As New System.Text.RegularExpressions.Regex(patron)
If miRegEx.IsMatch(email) Then
MessageBox.Show("OK")
Else
MessageBox.Show("Dirección e-mail incorrecta")
End If


Un saludo,

Jorge Serrano Pérez
MVP VB.NET
Post by Jorge Serrano [MVP VB]
Hola Walter,
puedes utilizar expresiones regulares para validar si una dirección de
correo electrónico es válida o no.
Un saludo,
Jorge Serrano Pérez
MVP VB.NET
Post by walter
alguien sabe como hacer un validador de emails sin usar
webservices??
Loading...