Para comprobar que un email es sintácticamente correcto hay que comprobar que el signo arroba separe al usuario del dominio.
Si no hay arroba el email no es correcto.
Si hay mas de una arroba el email no es correcto.
Si el usuario no se ajusta a la RFC 5321 y la RFC 5322 el email no es correcto.
Si el dominio no se ajusta a la RFC 952 y a la RFC 1123 el email no es correcto.
PRIVATE FUNCTION ComprobarEmail(Email AS String) AS Boolean
DIM Partes AS String[] = Split(email, "@"), Usuario AS String, dominio AS String, valido AS Boolean
IF Partes.max =1 THEN 'si está el signo @ presente una sola vez
valido = TRUE
ENDIF
'dividido el email en componentes
IF valido THEN
usuario = Partes[0]
dominio = Partes[1]
ENDIF
'comprobar usuario
valido = ComprobarUsuario(Usuario)
'comprobar el dominio
IF valido THEN
valido = ComprobarDominio(dominio)
ENDIF
RETURN valido
END
DIM Partes AS String[] = Split(email, "@"), Usuario AS String, dominio AS String, valido AS Boolean
IF Partes.max =1 THEN 'si está el signo @ presente una sola vez
valido = TRUE
ENDIF
'dividido el email en componentes
IF valido THEN
usuario = Partes[0]
dominio = Partes[1]
ENDIF
'comprobar usuario
valido = ComprobarUsuario(Usuario)
'comprobar el dominio
IF valido THEN
valido = ComprobarDominio(dominio)
ENDIF
RETURN valido
END
Para comprobar el usuario hay que cumplir la RFC 5321 y la RFC 5322 que vienen a decir
* Se admitn letras A-Z, a-z, 0-9, y los "!#$%&'*+-/=?^_`{|}~
* No puede comenzar por punto ni haber dos puntos consecutivos
La función que comprueba el usuario es la siguiente:
PRIVATE FUNCTION ComprobarUsuario(Usuario AS String) AS Boolean
DIM Contador AS Integer, Letra AS String, Valido AS Boolean
' admite letras A-Z, a-z, 0-9, "! # $ % & ' * + - / = ? ^ _ ` { | } ~"
' no puede comenzar por punto ni haber dos puntos consecutivos
'comprobar que no empieza por punto
valido = IIf(Left(usuario, 1) <> ".", TRUE, FALSE)
'comprobar que no hay dos puntos consecutivos
IF valido THEN
valido = IIf(InStr(usuario, "..") = 0, TRUE, FALSE)
ENDIF
'recorrer las letras para verificarlas
IF valido THEN
FOR Contador = 1 TO Len(usuario)
letra = Mid(usuario, contador, 1)
'comprobar si es letra
valido = IIf(IsLetter(letra), TRUE, FALSE)
'comprobar si es numero
IF NOT valido THEN
valido = IIf(IsDigit(letra), TRUE, FALSE)
ENDIF
'comprobar si la letra es uno de estos caracteres ! # $ % & ' * + - / = ? ^ _ ` { | } ~
IF NOT valido THEN
valido = IIf(InStr("!#$%&'*+-/=?^_`{|}~", letra) > 0, TRUE, FALSE)
ENDIF
IF NOT valido THEN
BREAK 'si no válido no mirar mas
ENDIF
NEXT
ENDIF
RETURN valido
END
DIM Contador AS Integer, Letra AS String, Valido AS Boolean
' admite letras A-Z, a-z, 0-9, "! # $ % & ' * + - / = ? ^ _ ` { | } ~"
' no puede comenzar por punto ni haber dos puntos consecutivos
'comprobar que no empieza por punto
valido = IIf(Left(usuario, 1) <> ".", TRUE, FALSE)
'comprobar que no hay dos puntos consecutivos
IF valido THEN
valido = IIf(InStr(usuario, "..") = 0, TRUE, FALSE)
ENDIF
'recorrer las letras para verificarlas
IF valido THEN
FOR Contador = 1 TO Len(usuario)
letra = Mid(usuario, contador, 1)
'comprobar si es letra
valido = IIf(IsLetter(letra), TRUE, FALSE)
'comprobar si es numero
IF NOT valido THEN
valido = IIf(IsDigit(letra), TRUE, FALSE)
ENDIF
'comprobar si la letra es uno de estos caracteres ! # $ % & ' * + - / = ? ^ _ ` { | } ~
IF NOT valido THEN
valido = IIf(InStr("!#$%&'*+-/=?^_`{|}~", letra) > 0, TRUE, FALSE)
ENDIF
IF NOT valido THEN
BREAK 'si no válido no mirar mas
ENDIF
NEXT
ENDIF
RETURN valido
END
Una vez comprobado que el usuario es válido hay que comprobar el dominio
El dominio puede ser un hostname o bien una IP. En este ejemplo se utiliza para comprobar si es una IP válida el código definido aquí
Comprobación de IP
En caso de que no sea una IP hay que comprobar que el dominio cumple la RFC 952 y a la RFC 1123 que vienen a decir:
* el dominio puede formar parte de varios grupos de letras o números separados por punto. Por ejemplo el caso "empresa.com" se compone del grupo "empresa" y el grupo "com" concatenados por un punto.
* Cada grupo puede contener letras a-z, 0-9 y el signo -
* Un grupo no puede comenzar por punto ni por guión.
Aquí hablo de grupos porque únicamente subdivido un string para verificar cada parte, pero se suele hablar de dominios y subdominios donde "empresa.com" tendría el dominio "com" y el subdominio "empresa". Yo me refiero a ambos como "grupos" porque solo examino sus strings para saber si son sintácticamente correctos.
Este es el código para comprobar un dominio. Es el mismo caso de comprobar un hostname.
PRIVATE FUNCTION ComprobarDominio(dominio AS String) AS Boolean
DIM ContadorGrupos AS Integer, ContadorLetras AS Integer, letra AS String, Grupos AS String[]
DIM Valido AS Boolean
'el dominio puede ser un hostname o una ip. Para saberlo dividir en dominio en sus partes por puntos
'el dominio puede formar parte de varios grupos de letras o números separados por punto
valido = comprobarip(dominio) 'comprobar si el dominio es una ip valida
IF NOT valido THEN 'si no es una ip hay que comprobar si el dominio es válido
Grupos = Split(dominio, ".") 'separar los distintos grupos
'revisar cada grupo obtenido
FOR contadorGrupos = 0 TO Grupos.Max
'el dominio puede contener letras a-z, 0-9, "-"
'no pueden empezar por guion ni por punto
'comprobar que no empieza por guión ni por punto
IF Left(grupos[ContadorGrupos], 1) = "." OR Left(grupos[ContadorGrupos], 1) = "-" THEN
valido = FALSE
ELSE
FOR contadorletras = 1 TO Len(grupos[contadorGrupos])
letra = Mid(Grupos[contadorGrupos], contadorLetras, 1)
'comprobar si es letra
valido = IIf(IsLetter(letra), TRUE, FALSE)
'comprobar si es numero
IF NOT valido THEN
valido = IIf(IsNumber(letra), TRUE, FALSE)
ENDIF
'comprobar si es guion o punto
IF NOT valido THEN
valido = IIf(InStr("-.", letra) > 0, TRUE, FALSE)
ENDIF
IF NOT valido THEN
BREAK 'si hay algún caracter no válido no mirar mas
ENDIF
NEXT
IF NOT valido THEN
BREAK 'si hay algún caracter no válido no mirar mas
ENDIF
ENDIF
IF NOT valido THEN
BREAK 'si el grupo es inváido no mirar mas grupos
ENDIF
NEXT
ENDIF
RETURN valido
END
DIM ContadorGrupos AS Integer, ContadorLetras AS Integer, letra AS String, Grupos AS String[]
DIM Valido AS Boolean
'el dominio puede ser un hostname o una ip. Para saberlo dividir en dominio en sus partes por puntos
'el dominio puede formar parte de varios grupos de letras o números separados por punto
valido = comprobarip(dominio) 'comprobar si el dominio es una ip valida
IF NOT valido THEN 'si no es una ip hay que comprobar si el dominio es válido
Grupos = Split(dominio, ".") 'separar los distintos grupos
'revisar cada grupo obtenido
FOR contadorGrupos = 0 TO Grupos.Max
'el dominio puede contener letras a-z, 0-9, "-"
'no pueden empezar por guion ni por punto
'comprobar que no empieza por guión ni por punto
IF Left(grupos[ContadorGrupos], 1) = "." OR Left(grupos[ContadorGrupos], 1) = "-" THEN
valido = FALSE
ELSE
FOR contadorletras = 1 TO Len(grupos[contadorGrupos])
letra = Mid(Grupos[contadorGrupos], contadorLetras, 1)
'comprobar si es letra
valido = IIf(IsLetter(letra), TRUE, FALSE)
'comprobar si es numero
IF NOT valido THEN
valido = IIf(IsNumber(letra), TRUE, FALSE)
ENDIF
'comprobar si es guion o punto
IF NOT valido THEN
valido = IIf(InStr("-.", letra) > 0, TRUE, FALSE)
ENDIF
IF NOT valido THEN
BREAK 'si hay algún caracter no válido no mirar mas
ENDIF
NEXT
IF NOT valido THEN
BREAK 'si hay algún caracter no válido no mirar mas
ENDIF
ENDIF
IF NOT valido THEN
BREAK 'si el grupo es inváido no mirar mas grupos
ENDIF
NEXT
ENDIF
RETURN valido
END
y como resultado la forma de utilizar todo esto es:
valido=comprobaremail(texto.text)
Valido valdrá true o false según que el email sea sintácticamente correcto o no