validar emails

15/02/2005 - 14:50 por walter | Informe spam
alguien sabe como hacer un validador de emails sin usar
webservices??

Preguntas similare

Leer las respuestas

#6 Jorge Serrano [MVP VB]
15/02/2005 - 16:19 | Informe spam
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


"Jorge Serrano [MVP VB]" wrote:

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


"walter" wrote:

> alguien sabe como hacer un validador de emails sin usar
> webservices??
>
Respuesta Responder a este mensaje
#7 walter
15/02/2005 - 16:39 | Informe spam
Sabes como puedo hacer o donde puedo encontrar
informacion de como validar dominios y cuentas de email

gracias!!

Walter
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



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




"walter" escribió


en el mensaje
news:29e201c51365$55690de0$
alguien sabe como hacer un validador de emails sin usar
webservices??




.

Respuesta Responder a este mensaje
#8 Eduardo A. Morcillo [MS MVP VB]
15/02/2005 - 18:06 | Informe spam
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/co...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: ")

' 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
Respuesta Responder a este mensaje
#9 Walter
17/02/2005 - 02:58 | Informe spam
Muchisimas gracias, lo voy a implementar cualquier cosa te
comento

Mil gracias

Walter
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/co...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:


")

' 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


.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida