Verificar endereços de e-mail

Rolou um assunto na lista CF-Brasil, que também é assunto nas mais diversas listas de desenvolvimento de aplicações web: como saber se um e-mail é valido ou não é.

É irritante enviar milhares de e-mails e centenas deles voltarem como inexistentes. Por mais que acrescentemos algumas linhas de código, seja no cliente ou no servidor, para verificar, não a existência de fato do e-mail, mas apenas se o formato está correto, ainda teremos e-mails inválidos aos montes.

E é claro, há como fazer isso.


Enviar um e-mail é tarefa do protocolo SMTP (RFC 821), que possue uma série de comandos interessantes, entre eles, comandos que nos permitem identificar se um endereço de e-mail existe ou não.

A primeira coisa a fazer – seja em uma verificação manual ou seja através do seu servidor de aplicações preferido – é descobrir o endereço do servidor de e-mail do provedor. Nem sempre o www.provedor.com.br terá como servidor o smtp.provedor.com.br. Isso pode ser feito usado comandos como o nslookup:

Por exemplo:
nslookup -type=MX sti.com.br

retornará, entre outras coisas, o seguinte dados:
MX preference = 10, mail exchanger = mx.br.inter.net

É possível ainda usar websites como este aqui.

Após, é necessário efetuar um telnet no endereço do servidor SMTP, normalmente à porta 25:

telnet mx.br.inter.net 25
220 mx.br.inter.net

Usemos o commando VRFY, que como o próprio nome indica, é para verificar a existência de um usuário no servidor:

VRFY fulano
250

VRFY ze
550 no such user here

Há outros códigos positivos de retorno, como 251, caso o endereço de e-mail seja um alias.

Porém, alguns servidores bloqueiam o uso do VRFY:

VRFY fulano
252 send some mail, i'll try my best

Então nós iremos tentar mandar um e-mail para o cidadão:

MAIL FROM:
250 OK

RCPT TO:
250 Accepted

RCPT TO:
550 unknown user

A tarefa agora é disponibilizar para seu servidor de aplicações uma maneira de efetuar o telnet no servidor, e interpretar os resultados. Afirmo ainda que as respostas podem variar entre os servidores de SMTP, e que é capaz que isso não seja possível de fazer em todos eles.

Outras opções incluem serviços gratuítos na web (como este aqui), ou adquirir softwares pagos (como este outro aqui, postado na CF-Brasil.

Uma maneiras mais simples de se verificar, mas ainda suscetível a erros é, simplificando todo o processo, checar meramente pela existência do domínio. Um email como endereco_duvidoso@provedor.com.br, basta um ping provedor.com.br para já ter algumas certezas (de que pelo menos o domínio existe).

Este texto não tem como pretensão esgotar o assunto; com certeza há outras maneiras, talvez até mais simples, fáceis e rápidas de se verificar pela existência real de um determinado endereço de e-mail. Dicas e sugestões são bem-vindas.


17 Comments on “Verificar endereços de e-mail”

  1. Vicente Marçal disse:

    Caro Fábio,

    É possível, fazer o que vc falou assim (telnet ou mesmo ping) via CF?

    Estou programando em CF já a algum tempo, contudo coisas desse tipo ainda não pude experimentar ou mesmo tentar fazer algo do gênero! Em se podendo fazer isso via CF, como eu poderia implementá-lo!? Tem como dar um exemplo em CF?

    []’s

    Vicente Marçal
    Desenvolvedor ColdFusion
    Illume Design
    Londrina-PR

  2. Opa Vicente,

    É possível sim! Estamos falando de ColdFusion! 🙂 Você pode usar a tag CFEXECUTE para executar outros aplicativos do sistema, de tal forma que, se o programa retornar dados, ele os salva em uma variável:

    <cfexecute name=”c:winntsystem32nslookup.exe” arguments=”-type=MX sti.com.br” variable=”dnsOutput” timeout=2>
    </cfexecute>

    <cfoutput>
    #Replace(dnsOutput,Chr(10),'<br>’,’ALL’)#
    </cfoutput>

  3. Vicente Marçal disse:

    Blz Fábio,

    Contudo então não temos como fazê-lo caso o host tenha a tag cfexecute desabilitada (o que é quase que praxe, hehehe!)!

    Em assim sendo, acredito então que teríamos que trabalhar com a produção de uma Custom Tag em Java, estou certo?

    []’s

  4. Sim Vicente, a utilização de uma CFX cairia bem nesse caso. Abraços!

  5. Marlos Carmo disse:

    Bem legal!! Todo mundo tem essa dúvida!!! Vc sabe se com o PHP ou ASP dá para fazer isto?

  6. Acho bem possível isso ser feito em outras linguagens. Em PHP por exemplo, você pode usar a função shell_exec().

  7. Fabricio disse:

    Gotaria de receber algumas dicas de como dar suporte em e-mail, por exemplo: no outlook quando recebo uma mensagem de erro assim ( The message could not be sent because one of the recipients was rejected by the server. The rejected e-mail address was ‘fiorito@ism.com.br’. Subject ‘teste IG e ISM’, Account: ‘pop.estresse.com.br (1)’, Server: ‘smtp.estresse.com.br’, Protocol: SMTP, Server Response: ‘550 5.7.1 … we do not relay ‘, Port: 25, Secure(SSL): No, Server Error: 550, Error Number: 0x800CCC79 ) ou quando o servidor terminou inesperadamente comta algo@dominio.com.br protocolo pop3 e smtp erro e o numero do erro

    se vc pode me ajudar ficarei grato Obrigado

  8. juan disse:

    gostaria de saber como eu fasso para retira esse arquivo de meu comp sem prejutica o comp

  9. Victor Hugo de Oliveira disse:

    Gostaria que me ajudasse na contrução de um Cliente SMTP e POP em Java. Te agradeço meu irmão.

  10. Junior disse:

    Gostaria que me ajudassem a criar uma aplicacao POP por favor. Valew!

  11. nadia disse:

    oi

  12. jair disse:

    http://www.via uno.com.br

  13. jair disse:

    quero saber se este e-mail esta ativo

  14. celia disse:

    gostaria de saber se “acertenamosca.virgula.com.br” está ativo.

  15. Manel disse:

    Ola !

    Gostava de saber á quanto tempo determinado e-mail existe ! Será possivel ? Como?

    Agradeço resposta!

  16. Adelnilde disse:

    Caro Fábioo
    preciso descobrir o nome do provedor e como acessar minha caixa postal ( [é de empresa) sem ter que pedir isso ao programador.
    Tenho usuário e senha, claro….
    mas gostaria de aumentar meu conhecimento nesse campo….
    já tentei muitas alternativas… mas n~consigo acessar via POP ou webmail…
    Será que existe um meio de descobrir ?

  17. wilson disse:

    n consigo enviar emails ,consta mensagem enviada mas ela n é enviada, e consta erro na pagina na hora que eu envio emails. oque esta acontecendo?