segunda-feira, 17 de maio de 2010

Validação de email com PHP: Sintaxe e domínio

Um dia desses um pobre coitado se cadastrou em um dos sistemas que implementei e cadastrou seu e-mail como zemane.com.br. Como você deve ter percebido, o "zé mané" esqueceu (?!?!?!?!) de colocar o domínio do e-mail após a arroba (e esqueceu inclusive a arroba!).
Em suma o cara "esqueceu" de tudo o que é obrigatório em um e-mail e o meu sistema aceitou este dado sem criticar...
Bom.. Para evitar que novos "experts" em fake-e-mail se cadastrassem desta forma, implementei uma funçãozinha que verifica se o texto fornecido tem uma sintaxe válida para ser usado como um endereço de e-mail.

A função é a seguinte:

//isEmailValido verifica se um email está no formato correto (xxx@bbb.ccc). Caso $ignoreempty seja
//false, retornará false se $email for uma string vazia
function isEmailValido($email, $ignoreempty = true)
{
$result = false;

if(strlen(trim($email))==0 && $ignoreempty)
  $result = true;
elseif(preg_match("/^[\w\.-]{1,}\@([\da-zA-Z-]{1,}\.){1,}[\da-zA-Z-]+$/i", $email))
  $result = true;

return $result;
}


Tudo caminhava  muito bem... Mas os problemas não pararam por aí...
Quando o usuário colocava um e-mail com domínio inexistente (por exemplo "meuemail@dominioinexistente.com.br"), o código acima deixava passar numa boa.
Pra isto eu dei uma vasculhada na net, achei diversas funções que se propunham a resolver este problema... Juntei um pedaço de cada um e montei a função abaixo:

/** EmailDomainValid verifica se o domínio do email fornecido existe é válido.
  exemplo de uso: EmailDomainValid( "email@dominio.com.br ").
*/
function EmailDomainValid($email)
{
  if(!preg_match ("/^[\w\.-]{1,}\@([\da-zA-Z-]{1,}\.){1,}[\da-zA-Z-]+$/", $email))
    return false;

  list($prefix, $domain) = explode("@",$email);

  if(function_exists("getmxrr") && getmxrr($domain, $mxhosts))
  {

    foreach($mxhosts as $mx)
    {
      if(@fsockopen($mx, 25, $errno, $errstr, 10))
        return true;
    }
    return false;
  }
  elseif(@fsockopen($domain, 25, $errno, $errstr, 10))
  {
    return true;
  }

  return false;
}

Desde então os problemas com e-mails cadastrados praticamente deixaram de existir :-)

Nenhum comentário:

Postar um comentário