logotux

Información y servicios en Linux y Open Source

Inicio :: Información ::
Linuxtotal en: LinkedIn linuxtotal rss feed RSS [ Añadir a favoritos ]

VALIDACIÓN DE DIRECCIONES DE CORREO ELECTRÓNICO CON PHP

Email Address Validation

Copyright 2005-2012 Sergio González Durán
Se concede permiso para copiar, distribuir y/o modificar este documento siempre y cuando se cite al autor y la fuente de linuxtotal.com.mx y según los términos de la GNU Free Documentation License, Versión 1.2 o cualquiera posterior publicada por la Free Software Foundation.

traducción y adaptación por: sergio.gonzalez.duran@gmail.com

Artículo original en inglés: www.ilovejackdaniels.com/php/email-address-validation


Muchos validadores de direcciones de correo electrónico devolverán errores cuando se enfrenten con una inusual pero válida dirección de correo electrónico. Muchos, por ejemplo, asumen que una dirección de correo con una extensión de dominio de mas de tres letras es inválida. Sin embargo, nuevos TLD's (Top Level Domains) tales como ".info",".name" y ".aero" son perfectamente válidos y ya no son de tres caracteres.

Incluso, otros validadores de direcciones de correo no toman en cuenta que no necesariamente se necesitaun nombre de dominio en el correo, una dirección IP sirve también.

El primer paso para crear un script PHP para validar direcciones de correo es validar exactamente lo que es y lo que no es válido. El RFC 2822, que especifica lo que se permite y lo que no en una dirección de correo, indica que la forma de una dirección de correo es "parte-local@dominio".

La "parte-local" de un correo debe tener entre 1 y 64 caracteres en longitud y puede estar constituida de tres modos distintos.

Puede estar hecho con una selección de caracteres (y solo de estos caracteres) de la siguiente selección. (Aunque el punto "." no puede ser el primero de estos.):

  • A a la Z
  • 0 al 9
  • !
  • #
  • $
  • %
  • &
  • '
  • *
  • +
  • -
  • /
  • =
  • ?
  • ^
  • _
  • `
  • {
  • |
  • }
  • ~
  • .

O, puede estar formado por una "cadena" de cualquier caracter entre comillas, excepto por el caracter "\". Direcciones de correo muy antiguas pueden estar hechas de manera diferente, y pueden contener una combinación de lo de arriba.

Los siguientes ejemplos son todos válidos como la primera parte o "parte-local" de un correo:

  • dave
  • +1~1+
  • {_dave_}
  • "[[ dave ]]"
  • dave."dave" (Esto esta considerado como una forma obsoleta de dirección, nuevas direcciones no deberían tener este formato, pero es considerado válido.)

Los siguientes ejemplos, aunque similares, son todos inválidos:

  • -- dave -- (los espacios son inválidos a menos de que estén entre comillas "")
  • [dave] (corchetes o paréntesis cuadrados son inválidos a menos de que estén entre comillas "")
  • .dave (la parte local de un nombre de dominio no puede comenzar con punto)

La porción del "dominio" de una dirección de correo también puede estar formada de diferentes maneras. La forma más común es en el formato de un nombre de dominio, que esta formado de un número de "etiquetas", cada una separada por un punto y entre 1 y 63 caracteres en longitud. Etiquetas pueden contener letras, dígitos y guiones "-", sin embargo no deben comenzar o terminar con un guión (oficialmente, una etiqueta debe de comenzar con una letra, no con un dígito, sin embargo muchos nombres de dominio han sido registrados comenzando con dígitos, asi que para propósitos de validación, asumiremos que los digítos están permitidos al comienzo de nombres de dominio).

Técnicamente, un nombre de dominio, necesita solo una etiqueta. Sin embargo, en la práctica nombres de dominio están hechos de al menos dos etiquetas, asi que para propósitos de la validación checaremos por al menos dos. Un nombre de dominio no puede tener más de 255 caracteres en total. Una porción de dominio de una dirección de correo puede ser también una dirección IP, que a la vez puede estar encerrada en corchetes [] o paréntesis cuadrados.

Para revisar o validar que una dirección de correo se ajuste a lo anterior, necesitaremos usar expresiones regulares. Primero, necesitamos hacer que concuerden las tres posibles formas de la "parte-local" de una dirección de correo, usando las dos expresiones abajo ( Añadiremos caracteres de escape después, cuando juntemos la función):

^[A-Za-z0-9!#$%&'*+-/=?^_`{|}~][A-Za-z0-9!#$%&'*+-/=?^_`{|}~\.]{0,63}$^"[^(\|")]{0,62}"$

Podemos usar las dos expresiones definidas aqui para checar las partes locales obsoltetas de una dirección de correo, ahorrándonos necesitar una tercera expresión.

A continuación, necesitamos checar la porción o parte de dominio de la dirección. Puede ser o una dirección IP o un nombre de dominio, asi que podemos usar las dos expresiones aqui para validarlos:

^\[?[0-9\.]+\]?$^[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9](.[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])+$

La expresión anterior hará coincidir cualquier nombre de dominio,pero también hará coincidir cualquier dirección IP, asi que solo necesitamos lo anterior para checar la porción de "dominio" de un correo electrónico.

Poniéndolo todo junto nos da la siguiente función. Es llamada como cualquier función normal y te devolverá un valor de "true" si la cadena introducida es una dirección de correo electrónica válida, o "false" si es inválido el correo.

function check_email_address($email) 
{
	// Primero, checamos que solo haya un símbolo @, y que los largos sean correctos
  if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) 
	{
		// correo inválido por número incorrecto de caracteres en una parte, o número incorrecto de símbolos @
    return false;
  }
  // se divide en partes para hacerlo más sencillo
  $email_array = explode("@", $email);
  $local_array = explode(".", $email_array[0]);
  for ($i = 0; $i < sizeof($local_array); $i++) 
	{
    if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i])) 
		{
      return false;
    }
  } 
  // se revisa si el dominio es una IP. Si no, debe ser un nombre de dominio válido
	if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) 
	{ 
     $domain_array = explode(".", $email_array[1]);
     if (sizeof($domain_array) < 2) 
		 {
        return false; // No son suficientes partes o secciones para se un dominio
     }
     for ($i = 0; $i < sizeof($domain_array); $i++) 
		 {
        if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i])) 
				{
           return false;
        }
     }
  }
  return true;
}

Usar la función anterior es relativamente simple, como podrás observar:

if (check_email_address($email)) 
{
   echo $email . ' es una dirección válida de correo.';
} 
else 
{
   echo $email . ' no es una dirección válida de correo.';
}

Puedes ahora validar direcciones de correo electrónico que ingresen en tu sitio contra las especificaciones que definen una dirección (mas o menos ya que nombres de dominio que comienzan con un número se supone deberían ser iválidos, pero existen).

Finalmente, por favor recuerda que el hecho de que un correo sea válido no significa que este en uso. Usar un script para validar correos electrónicos es un buen comienzo para la validación de direcciones de correo, pero el script aunque puede decirte que es técnicamente correcto, no puede decirte que esté en uso o exista. Puedes beneficiarte checando a más profundidad, por ejemplo, viendo si el nombre de dominio del correo esta registrado. O aun mejor, enviar un correo a la dirección dada por el usuario y hacer que haga click en algún enlace para confirmar que es real, es el único modo de estar 100% seguro.


AÑADIR ESTE ARTÍCULO A MIS FAVORITOS



COMENTARIOS






Búsqueda en LinuxTotal

Entendiendo lo que son los 'one liners'

(más)

Buscar archivos SUID y SGID con find

(más)

(más)

Permisos de archivos y directorios

(más)

Cinco Tips para convertir documentos de MSDOS/Windows a Linux

(más)

(más)

LinuxTotal.com.mx · Información y servicios en Linux y Open Source · info@linuxtotal.com.mx · sergio.gonzalez.duran@gmail.com