Neste artigo, vamos explorar os vários métodos para validar um endereço de e-mail. Vamos mostrar a solução PHP pura, se disponível, juntamente com uma solução usando o pacote PHP Email Validation Quality que usa uma API fornecida pelo mailboxlayer.com.
O código a seguir será usado para o pacote PHP Email Validation Quality, que irá retornar um objeto de resposta que contém os dados. Este é o código para instanciar o pacote e verificar um endereço; o uso da resposta será discutido nos capítulos seguintes.
<?php include( 'mailboxlayer.class.php' ); $mbox = new mailBoxLayer(); $email = 'user@domain.com'; if( $mbox->verifyMail($email) === false ) { //código para gerenciar o erro retornado die('Error code ' . $mbox->errorCode . ': ' . $mbox->errorText); } //usa a resposta da API para validar o endereço de e-mail ?>
Verificação do formato adequado
A verificação mais básica de validação é para garantir que o endereço de e-mail fornecido está formatado corretamente. Existem vários testes que podem ser realizados usando expressões regulares, mas o PHP normatizou isso a partir da versão 5.2, utilizando a função filter_var. Utilizando PHP puro, você pode codificar algo assim…
$email = 'user@domain.com'; if( filter_var( $email, FILTER_VALIDATE_EMAIL) === false ){ //código para gerenciar endereços de e-mail formatados incorretamente die('E-mail is not properly formatted'); }
Aqui nós iremos verificar o endereço de e-mail usando filter_var e a constante FILTER_VALIDATE_EMAIL, que retornará false se não estiver devidamente formatada. O PHP usa o padrão RFC 822, com exceção dos comentários e do espaço em branco para determinar o formato adequado.
Usando o pacote, iríamos verificar o objeto de resposta da API desta forma…
if( empty($mbox -> response -> format_valid ) ){ //ccódigo para gerenciar endereços de e-mail formatados incorretamente die('E-mail is not properly formatted'); }
É importante notar que a API está fazendo muito mais do que apenas a verificação do formato, por isso o tempo de resposta pode parecer mais longo do que o esperado. Se você só precisa verificar o formato, pode acelerar o processo desligando o controle avançado com uma simples mudança no método verifyMail…
$mbox -> verifyMail( $email, false);
A API usa os padrões expandidos contidos no RFC 5321 e no RFC 5322 para determinar os formatos adequados.
Verifique se o domínio pode receber e-mail
O registro DNS (Domain Name System) MX (Mail eXchange) indica se um determinado domínio é configurado para receber e-mail. Utilizando PHP puro, podemos verificar isso usando a função checkdnsrr desta forma…
$email = 'user@domain.com'; list($user, $host) = explode('@', $email); if( checkdnsrr($host, 'MX') === false ){ //código para gerenciar registro MX não encontrado die('DNS MX record not found'); }
Aqui nós extraímos o host do endereço de e-mail e, em seguida, verificamos se o registro DNS MX está configurado. A função checkdnsrr retornará false se o domínio não está configurado para aceitar mensagem de um endereço específico.
Note que a ausência de um registro MX de um domínio não significa que ele não pode receber e-mail. Nesse caso, o domínio pode receber mensagens no endereço de registro apontado A, mas isso não é o habitual, por isso é normal que, quando um domínio não tem registros MX, ele não pode ser configurado para receber e-mail.
Usando o pacote, poderíamos verificar o objeto resposta da API desta forma…
if( empty($mbox -> response -> mx_found) ) { //código para gerenciar registro MX não encontrado die('DNS MX record not found'); }
Fazendo a comunicação com o servidor de e-mail
SMTP (Simple Mail Transfer Protocol) é usado para transferir e-mail por meio de uma rede. O PHP não oferece uma função simples para se comunicar e testar o servidor SMTP de um domínio, no entanto, podemos verificar o objeto resposta da API desta forma:
if( empty($mbox -> response -> smtp_check) ){ //código para gerenciar comunicação falha SMTP die('SMTP communication failed'); }
É importante entender que uma resposta verdadeira (true) significa que houve uma comunicação bem-sucedida com o servidor SMTP, mas uma resposta falsa (false) não significa necessariamente que o endereço de e-mail não é válido.
Alguns servidores têm o SMTP configurado de uma maneira que o teste de comunicação irá falhar enquanto e-mails reais serão entregues, por isso acredite em uma resposta true, mas trate false como suspeita.
Esse é um endereço de e-mail descartável?
Há serviços que fornecem endereços de e-mail que são usados apenas uma vez ou muito poucas vezes, e então são removidos. Esses são os endereços de e-mail descartáveis que permitem que potenciais usuários do seu site recebam uma validação de e-mail sem fornecer um endereço de e-mail válido.
Usando o pacote, gostaríamos de verificar o objeto resposta da API para ver se o serviço é um provedor descartável conhecido:
if( empty( $mbox -> response -> disposable) ) { //código para gerenciar endereço de e-mail descartável die('E-mail address is from a disposable provider'); }
Outras vantagens úteis do pacote
Mesmo se um endereço de e-mail é válido, pode haver casos em que você deseja excluir determinados endereços de campanhas de marketing, por exemplo.
Você pode verificar se um endereço é considerado genérico e usado por um determinado departamento ou cargo. Alguns exemplos de endereços de cargo seriam support@domain.com, info@domain.com, abuse@domain.com, e assim por diante. A resposta será true ou false.
$mbox -> response -> role
Você pode verificar se um endereço é de um provedor de e-mail gratuito conhecido. A resposta será true ou false.
$mbox -> response -> free
Você pode verificar a qualidade do endereço baseado no algoritmo índice de qualidade da API. A resposta será um percentual decimal entre 0.01 e 1 da qualidade mais baixa para a mais alta.
$mbox -> response -> score
Você pode verificar se há uma sugestão comum para um endereço em caso de um erro de ortografia ou erro de digitação. A resposta será o endereço sugerido.
$mbox -> response -> did_you_mean
Você pode recuperar a parte do usuário e do domínio do endereço fornecido à API, respectivamente.
$mbox -> response -> user $mbox -> response -> domain
Detectando um Mail Server Catch-all (pega tudo)
Alguns servidores de e-mail são configurados para aceitar e-mails, independentemente de a parte do usuário ser fornecida, fazendo com que notauser@domain.com seja um endereço de e-mail válido, embora não exista nenhuma caixa de e-mail para ele.
O recurso para detectar esses servers catch-all é oferecido como parte das contas premium da API. Pode ser demorado para realizar a verificação, por isso o método verifyMail usado no pacote deve explicitamente ser habilitado para verificar o catch all:
$mbox->verifyMail( $email, false, false, '', true);
Então, podemos verificar a resposta da API para determinar se o servidor de e-mail é um desses servidores catch-all.
$mbox -> response -> catch_all
Conclusão
A razão mais comum para verificar um endereço de e-mail é para garantir que nossos membros são pessoas reais ou estão se escondendo atrás de uma identidade que eles não querem revelar. Se é importante que nós tenhamos endereços de e-mail bons e válidos, então temos de tomar as medidas necessárias e executar a validação além da formatação adequada.
Mesmo que tenhamos um endereço de e-mail válido em arquivo, talvez tenhamos a necessidade de excluir determinados tipos de endereços de e-mail de campanhas de marketing para aumentar a chance de respostas. Usar índices de qualidade e tipos de servidor nos dá a capacidade de direcionar melhor o nosso público.
***
Dave Smith faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: http://www.phpclasses.org/blog/package/9528/post/1-PHP-Email-Verification-using-the-MailboxLayer-API.html