¿Requieres de una instalación o configuración de Linux o sus servicios?
¿Un desarrollo WEB empresarial a la medida?
¿Un curso o capacitación a la medida?
Revisa el sitio de SERVICIOS de LinuxTotal


Validacin de direcciones de correo electrnico con PHP 

Copyright © 2005-2024 LinuxTotal.com.mx
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.


Email Address Validation

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.



¿Requieres de una instalación o configuración de Linux o sus servicios?
¿Un desarrollo WEB empresarial a la medida?
¿Un curso o capacitación a la medida?
Revisa el sitio de SERVICIOS de LinuxTotal

LinuxTotal en:

Si encuentras útil la información que proveé LinuxTotal, considera realizar un donativo que estimule a seguir proporcionando contenido de calidad y utilidad. Gracias.


Dona a través de paypal::


O a través de bitcoins:


14TNQv5wM3xkSv65gHGQ6s6f8yTZuFTohE
Más artículos de LinuxTotal

He actualizado con varios nuevos comandos la popular guía de LinuxTotal.com.mx, asi como he añadido enlaces en los comandos en l....


Una de las dificultades con una base de datos MySQL grande y activa es la de realizar respaldos limpios sin tener que desconectar ....


Muchos validadores de direcciones de correo electrónico devolverán errores cuando se enfrenten con una inusual pero válida dire....


Traducción del capítulo del libro "Stealing the Network: How to Own a Continent." escrito por Fyodor, autor de nmap. Excelente a....


El editor en línea (stream editor) sed es un editor de texto en línea que realiza operaciones de edición sobre datos provenient....


Para Linux todo es un archivo, incluyendo dispositivos como discos duros, cdroms, disquetes, unidades de cinta, memorias usb, etc.....


En SQL, 'Alter' es un comando de la categoría DDL (Data Definition Language) y como su nombre lo indica sirve para alterar objeto....


Hay múltiples maneras de cometer errores (algunos muy graves y desastrosos) cuando se administran servidores GNU/Linux, conócelo....


Este es un pequeño y útil tip que te permitirá crear PDF's a partir de páginas del manual. Cuando deseas ver la ayuda de un co....


En Linux hay diversas herramientas para empaquetar y comprimir archivos, tomando en cuenta que empaquetar es juntar dos o más arc....



Copyright © LinuxTotal.com.mx 2006-2024
info@linuxtotal.com.mx · linuxtotal.com.mx@gmail.com