APIs e Microsserviços

9 jun, 2016

Verificação de e-mail no PHP usando a API MailboxLayer

Publicidade

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