Validar dirección de e-mail

y programas personales para otros como tu, puede que te corrijan ;)
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Validar dirección de e-mail

Mensaje por Jonny »

Hola

Recientemente, me he visto en la necesidad de validar una dirección de e-mail con autoit.
He buscado en el foro inglés pero no he encontrado nada...
Así, que pensando que sería algo más simple de lo que al parecer es, me puse a investigar en Google la forma de validar una dirección de e-mail, para plasmarlo luego en Autoit.

Sin mucho trabajo encontré esta página que me pareció el mejor ejemplo a seguir, puesto que habla de las reglas del RFC 2822 para las direcciones de correo electrónico:

http://www.linuxtotal.com.mx/index.php? ... _otros_002

La verdad, es que aunque según las explicaciones de esta página parece algo complejo, utilizando las expresiones regulares tal y como lo hacen en la página son 4 líneas. La cosa está en que yo nunca me entendí muy bien con las expresiones regulares en php (y menos en autoit), sinó que me limitaba a copiar y pegar en casos como este, cosa que no he podido hacer en este caso. Así pues, me he puesto manos a la obra y aunque con un código mucho más largo y seguramente más difícil de entender precisamente por lo largo que es, he conseguido (creo) el mismo resultado que la función que propone la página anterior.

En principio, la función que he escrito valida la dirección de e-mail que se le pasa tal y como indica que debe hacerse en la página que puse más arriba.
Yo he probado un poco su funcionamiento y parece ser correcto, pero quisiera que si alguien puede testearla un poco más a fondo y encuenra errores, se le ocurre como mejorar el código (lo suyo sería portar el de la función expuesta en la página anterior a autoit) etc, lo comentara, ya que me parece que esta función puede ser útil para muchas aplicaciones...

-Si la dirección de e-mail pasada a la función es válida esta devuelve 1, en caso contrario devuelve 0.

Ahí va el código:

Código: Seleccionar todo

Func MailValidation($XMail)
Local $Local_LegalCharacters="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&'*+-/=?^_`{|}~."
Local $Domain_LegalCharacters="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-"
Local $DomainType=0
$EmailCharacter=StringSplit($XMail, Chr(64))
If $EmailCharacter[0]<>2 Then
Return 0
EndIf
If (StringLen($EmailCharacter[1])<1 Or StringLen($EmailCharacter[1])>64) Then
Return 0
EndIf
$_EmailCharacter=StringSplit($EmailCharacter[1], "")
If $_EmailCharacter[1]==Chr(46) Then
Return 0
EndIf
If StringInStr($EmailCharacter[1], Chr(92))<>0 Then
Return 0
EndIf
For $I=1 To $_EmailCharacter[0] Step +1
If ($_EmailCharacter[$I]<>"""" And StringInStr($Local_LegalCharacters, $_EmailCharacter[$I])==0) Then
If (StringInStr($EmailCharacter[1], """")==0 Or StringInStr($EmailCharacter[1],"""", 0, -1)==0 Then
Return 0
ExitLoop
EndIf
EndIf
Next
$CheckExtremesSymbolsDomainBloq=StringSplit($EmailCharacter[2], "")
If (($CheckExtremesSymbolsDomainBloq[1]=="[" Or $CheckExtremesSymbolsDomainBloq[1]=="(") And ($CheckExtremesSymbolsDomainBloq[$CheckExtremesSymbolsDomainBloq[0]]=="]" Or $CheckExtremesSymbolsDomainBloq[$CheckExtremesSymbolsDomainBloq[0]]==")")) Then
$EmailCharacter[2]=StringTrimLeft($EmailCharacter[2], 1)
$EmailCharacter[2]=StringTrimRight($EmailCharacter[2], 1)
EndIf
$IpSplit=StringSplit($EmailCharacter[2], ".")
If $IpSplit[0]<>4 Then
$DomainType=1
Else
For $n=1 To 4   
If IsNumber($IpSplit[$n]) Then 
$DomainType=1
EndIf
If (Number($IpSplit[$n])<0 Or Number($IpSplit[$n])>255) Then 
$DomainType=1
EndIf
Next
EndIf
If $DomainType==1 Then
If $EmailCharacter[2]>255 Then Return 0
$BloqDomainDiv=stringSplit($EmailCharacter[2], Chr(46))
If $BloqDomainDiv[0]<2 Then
Return 0
EndIf
For $I=1 To $BloqDomainDiv[0] Step +1
If (StringLen($BloqDomainDiv[$I])<1 Or StringLen($BloqDomainDiv[$I])>63) Then
Return 0
ExitLoop
EndIf
$_BloqDomainDiv=StringSplit($BloqDomainDiv[$I], "")
If ($_BloqDomainDiv[1]==Chr(45) Or $_BloqDomainDiv[$_BloqDomainDiv[0]]==Chr(45)) Then
Return 0
ExitLoop
EndIf
For $X=1 To $_BloqDomainDiv[0] Step +1
If StringInStr($Domain_LegalCharacters, $_BloqDomainDiv[$X])==0 Then
Return 0
ExitLoop
EndIf
Next
Next
Return 1
Else
Return 1
EndIf
EndFunc
Que la disfruteis!

Salu2!
emma93
Aprendiz de Mago
Mensajes: 47
Registrado: 13 Ene 2009, 23:15

Re: Validar dirección de e-mail

Mensaje por emma93 »

Estuve una hora testeando con diferentes direcciones :P

La función anda perfectamente bien.

Un salu2, fekaa.-
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Validar dirección de e-mail

Mensaje por Jonny »

Hola

Muchas gracias por probarla!

¿Probaste con direcciones ilegales, como las que pone en la página en la que me basé por ejemplo?...

Espero que te sea de utilidad.

Salu2!
emma93
Aprendiz de Mago
Mensajes: 47
Registrado: 13 Ene 2009, 23:15

Re: Validar dirección de e-mail

Mensaje por emma93 »

Eso es lo malo.

Probé siguiente dirección y me devolvió el valor 1. (Permitida)

[email protected]

Mientras que esa dirección de email nunca existiría.

Un salu2
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Validar dirección de e-mail

Mensaje por Jonny »

Hola

sí, he podido comprobar que alguna dirección se le escapa ... está claro, que nada como usar expresiones regulares para esto. Menos lío y más efectivo...

ahora falta saber usarlas, que yo no tengo ni papa!

a ver si alguien se anima...

Salu2!
Avatar de Usuario
timistar
Hacker del Foro
Mensajes: 89
Registrado: 24 Jun 2008, 05:03

Re: Validar dirección de e-mail

Mensaje por timistar »

par la direcion de correo

@sdfsgdfgfghdgh.com

no habria que ingresar todos ls nombres deserver de correo para que le compare ? o le enviaria una especia de ping al dsdsfdfs server a ver si existe o si tiene respuesta ?

como seria ?


:smt040
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Validar dirección de e-mail

Mensaje por Jonny »

Hola

Pasándole esa dirección de correo, devolvería 0 (ilegal), puesto que solo tiene la parte de dominio, pero es necesaria la parte local de la dirección. Hecha un vistazo a la página que puse al principio del post, explica como debe estar formada una dirección de e-mail.

Por otro lado, esta función únicamente comprueba la sintaxis de la dirección, no que ésta exista o esté en uso, etc.
Un ping al servidor podría comprobar parte de la existencia de la dirección de correo, pero nunca podría verificarse por completo que la dirección especificada exista y esté en uso, excepto con el típico sistema de enviar un e-mail con un link de verificación o algo así.

Salu2!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Validar dirección de e-mail

Mensaje por Jonny »

Hola

Viendo que la función que posteé no terminaba de ir del todo bien, pensé que podía ser mejor buscar un código php que validara la sintaxis de la dirección de correo (que en php se hace mucho eso) y convertir el código a autoit.
Así lo hice ayer, pero he de confesar que el condenao del código php me ha dado mucho trabajo...

En cualquier caso, no me resultó sencillo, teniendo en cuenta que no domino mucho el php y que en algunos casos creo que ni siquiera habían funciones equivalentes en autoit para las usadas en ese código php... Con un poco de ingenio e imaginación llegué a esto:

Código: Seleccionar todo


#Include <Array.au3>

#Include <File.au3>

#Include <String.au3>



MailValidation("[email protected]")

Func MailValidation($ArgMail)

Local $MailValide=0

$ArgMailDiv=StringSplit($ArgMail, ".")

If ((StringLen($ArgMail)>=6) And (StringInStr($ArgMail, "@", 0, 2)==0) And (StringLeft($ArgMail, 1)<>"@") And (StringRight($ArgMail, StringLen($ArgMail)))<>"@")) Then

If ((Not StringInStr($ArgMail, "'")) And (Not StringInStr($ArgMail, """"))) And (Not StringInStr($ArgMail, "\")) And (Not StringInStr($ArgMail, "$")) And (Not StringInStr($ArgMail, " "))) Then

If (StringInStr($ArgMail, ".", 0, 2)<>0) Then

$Term_Dom=$ArgMailDiv[$ArgMailDiv[0]]

If (StringLen($Term_Dom)>1 And StringLen($Term_Dom)<5 And (Not StringInStr($Term_Dom, "@"))) Then

$Before_Dom=StringLen($ArgMail, StringLen($ArgMail)-StringLen($Term_Dom)-1)

$Last_Character=StringRight($Before_Dom, StringLen($Before_Dom)-1)

If ($Last_Character<>"@" And $Last_Character<>".") Then

$MailValide=1

EndIf

EndIf

EndIf

EndIf

EndIf

If $MailValide==1 Then

Return 1

Else

Return 0

EndIf

EndFunc

 
Que no se si realmente estará bien trascrito....

Ahora, ahí va la función original en php, a verr si alguien puede ver si lo hice bien:

Código: Seleccionar todo


<?PHP

function comprobar_email($email)

{

$mail_correcto=0;

//compruebo unas cosas primeras

if ((strlen($email)>=6)&&(substr_count($email,"@")==1)&&(substr($email, 0, 1)!="@")&&(substr($email, strlen($email)-1, 1)!="@"))

{

if ((!strstr($email,"'"))&&(!strstr($email, """))&&(!strstr($email, "\"))&&(!strstr($email,"$"))&&(!strstr($email," ")))

{

//miro si tiene caracter .

if (substr_count($email,".")>=1)

{

//obtengo la terminacion del dominio

$term_dom=substr(strrchr($email, '.'),1);

//compruebo que la terminación del dominio sea correcta

if (strlen($term_dom)>1&&strlen($term_dom)<5&&(!strstr($term_dom,"@")) )

{

//compruebo que lo de antes del dominio sea correcto

$antes_dom=substr($email,0,strlen($email)-strlen($term_dom)-1);

$caracter_ult=substr($antes_dom,strlen($antes_dom)-1,1);

if ($caracter_ult != "@"&&$caracter_ult != ".")

{

$mail_correcto = 1;

}

}

}

}

}

}

if ($mail_correcto)

return 1;

else

return 0;

}

?>

a ver que opinais, si hice bien mi trabajo ... jejeje.
Por cierto, perdonad si este post tiene algo de oftopic...
Gracias de antemano,

Salu2!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Validar dirección de e-mail

Mensaje por Jonny »

Hola

Mirando la función que convertí de php a autoit no funcionaba.
Lo más sencillo era (para mí) volver a mirar la página
http://www.linuxtotal.com.mx/index.php? ... _otros_002

y volver a escribir la función afinando un poco los algoritmos...

Así lo he hecho. Ahora, mientras la programaba he ido probando que las reglas de la página anterior se cumplieran, por lo que ahora sí, la función cumple perfectamente con las reglas del formateo de una dirección de correo electrónico.
Por cierto, la dirección [email protected]
sí es válida, según la página que he puesto estaría permitida...

Ahí va el código fuente:

Código: Seleccionar todo


#Include <Array.au3>

#Include <File.au3>

#Include <String.au3>



$MailValide=MailValide("[email protected]")

Msgbox(0, "", $MailValide)



Func MailValide($ArgMail)

Local $LegalLocalChars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&'*+-/=?^_`{|}~.", $LegalDomainChars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789"

Local $LocalMail, $DomainMail

Local $Quot=0, $QuotNum

$ArgMailDiv=StringSplit($ArgMail, "@")

If (Not IsArray($ArgMailDiv) Or $ArgMailDiv[0]<2) Then Return 0

$DomainMail=$ArgMailDiv[$ArgMailDiv[0]]

For $I=1 To $ArgMailDiv[0]-1 Step +1

$LocalMail&=$ArgMailDiv[$I]&"@"

Next

$LocalMail=StringTrimRight($LocalMail, 1)

If (StringLen($LocalMail)<1 Or StringLen($LocalMail)>64) Then Return 0

If StringLeft($LocalMail, 1)=="." Then Return 0

$LocalMailDiv=StringSplit($LocalMail, "")

for $I=1 To $LocalMailDiv[0] Step +1

If $LocalMailDiv[$I]=="""" Then $QuotNum&=$I&"_"

Next

$QuotNum=StringTrimRight($QuotNum, 1)

For $I=1 To $LocalMailDiv[0] Step +1

If StringInStr($LegalLocalChars, $LocalMailDiv[$I])==0 Then

If $QuotNum=="" Then Return 0

$QuotNumDiv=StringSplit($QuotNum, "_")

If $QuotNumDiv[0]<2 Then Return 0

If ($QuotNumDiv[1]<$I And $QuotNumDiv[$QuotNumDiv[0]]>$I) Then

If $LocalMailDiv[$I]=="\" Then Return 0

ExitLoop

EndIf

EndIf

Next

If StringLen($DomainMail)>255 Then Return 0

$DomainMailDiv=StringSplit($DomainMail, ".")

If (StringLeft($DomainMail, 1)=="[" And StringRight($DomainMail, 1)=="]") Then

If $DomainMailDiv[0]<>4 Then Return 0

For $I=1 To $DomainMailDiv[0] Step +1

Switch($I)

Case 1

$DomainMailDiv[$I]=StringTrimLeft($DomainMailDiv[$I], 1)

Case 4

$DomainMailDiv[$I]=StringTrimRight($DomainMailDiv[$I], 1)

EndSwitch

If IsNumber($DomainMailDiv[$I]) Then Return 0

If (Number($DomainMailDiv[$I])<0 Or Number($DomainMailDiv[$I])>255) Then Return 0

Next

Else

If $DomainMailDiv[0]<2 Then Return 0

For $I=1 To $DomainMailDiv[0] Step +1

If (StringLen($DomainMailDiv[$I])<1 Or StringLen($DomainMailDiv[$I])>63) Then Return 0

If (StringLeft($DomainMailDiv[$I], 1)=="-" Or StringRight($DomainMailDiv[$I], 1)=="-") Then Return 0

$SubStringDomainMailDiv=StringSplit($DomainMailDiv[$I], "")

For $X=1 To $SubStringDomainMailDiv[0] Step +1

If StringInStr($LegalDomainChars, $SubStringDomainMailDiv[$X])==0 Then Return 0

Next

Next

EndIf

Return 1

EndFunc

 
¡Con menos código incluso!.
Nuevamente, si la dirección está correctamente escrita la función devolverá 1. En caso contrario devolverá 0.

Que la disfruteis!

Salu2!
piranga8
Aprendiz de Mago
Mensajes: 52
Registrado: 07 May 2009, 01:43

Re: Validar dirección de e-mail

Mensaje por piranga8 »

Buena Ahi va el Mio:

Código: Seleccionar todo

;===============================================================================

;

; Function Name:    _ValMail()

; Description:      Validate Email Format

; Parameter(s):     $mail  - string to validate

; Requirement(s):   AutoIt

; Return Value(s):  Valid     - Returns 1

;                   Non Valid - Returns 0  

;                   Error     - Returns -1 and sets @ERROR = 1

; Author(s):        Piranga8

; Remarks:          The Ping Miliseconds are 4000.

;

;===============================================================================



Func _ValMail($mail)

    $s_mail = StringSplit($mail,"@")

    $LegalLocalChars=" $%&/()=""!¿?¡çÇ{}´´'*+``^^<>ºª\¬"

    $user = StringSplit($s_mail[1],"")

    If $s_mail[1] = $mail Then

        Return 0

    Else

        $ping = Ping($s_mail[2], 4000)

    EndIf

    If $ping > 0 Then

        For $i=1 To UBound($user)-1

        If StringInStr($LegalLocalChars, $user[$i]) > 0 Then

            Return 0

        EndIf

        Next

        Return 1

    EndIf

    If @error Then

        SetError(1)

        Return -1

    EndIf

EndFunc

 
Imagen
Imagen
Responder