Saturday, September 3, 2016

Validação de emails

AbstractJava code that helps into email validation by checking if the domain has a DNS MX record. Into github, I provide a full working app other than the simple code of this post.

Na empresa para qual trabalho estávamos precisando de um validador de emails mais "potente" do que o javascript que verificava o formulário que coletava os emails dos nossos clientes. Ele basicamente validava se o email era bem formado.

Mas como saber se, apesar de bem formado, o email existe?

Antigamente era possível fazer um telnet na porta 25 e descobrir inclusive se o usuário existia. Mas com os spammers, isso acabou sendo bloqueado. Ainda dá para fazer, usando outra abordagem, mas isso é assunto para outro post.

Uma validação simples que pode ser feita é verificar se o domínio do email possui um servidor MX. MX vem de Mail eXchanger e é um registro que fica cadastrado em um DNS. É assim que a "internet" sabe para onde um email tem que ir.

Pesquisando, verifiquei que o java possui um contexto JNDI que nos ajuda com este tipo de tarefa e fica muito fácil fazer a verificação, conforme exemplo abaixo:

public void checkMX(String email) {
   Properties env = new Properties();
   env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");

   String hostname = email.substring(email.indexOf("@") + 1, email.length()).toLowerCase().trim();

   try {
      InitialDirContext idc = new InitialDirContext(env);
      Attributes attributes = idc.getAttributes(hostname, new String[] { "MX" });
      Attribute attribute = attributes.get("MX");
      System.out.println(attribute);
   } catch (NamingException e) {
      e.printStackTrace();
   }
}

Se você chamar o método e passar um email do gmail, ele vai imprimir na console "MX: 5 gmail-smtp-in.l.google.com., 40 alt4.gmail-smtp-in.l.google.com., 10 alt1.gmail-smtp-in.l.google.com., 20 alt2.gmail-smtp-in.l.google.com., 30 alt3.gmail-smtp-in.l.google.com.".

Os números na frente dos servidores indica a prioridade. Quanto menor, mais importante. No exemplo acima, primeiro o email tentará ser entregue ao servidor com prioridade 5, depois 10 e assim por diante.

Na minha conta do github eu coloquei uma aplicação um pouco mais completa, que lê um arquivo texto com uma lista de emails e gera um log de processamento com o resultado das validações.

Espero que seja útil.

No comments:

Post a Comment