sábado, 13 de outubro de 2007

Conexão ao Gmail usando CFPOP

Muitos já pensaram nisso e provavelmente já passaram pelo “problema” de tentar uma conexão ao servidor do Gmail para resgatar mensagens usando a tag <cfpop... . O problema refere-se ao fato de que o Gmail implementa SSL na conexão aos seus servidores e a tag <cfpop> não possui suporte a uma conexão com essa especificação.

Nesta necessidade, muitos acabam por investir na aquisição da tag CFX CFX_POP que implementa conexão ao servidor usando SSL.

Ontem (12/10/07) das 11:30PM até umas 2:30AM de hoje, eu e meu colega Jefferson Petillo ficamos tentando de várias formas estudar uma solução direta com o ColdFusion. Depois de várias tentativas estudos e fracassos, descobrimos que simplesmente o ColdFusion não implementava de forma nativa condições para completar esta operação.

Por ter estudado bastante o que falta para que o ColdFusion permita esta funcionalidade, ficamos perplexos em tomar conhecimento de que a implementação para a solução deste problema nos parecia à princípio simples. E com este pensamento nos questionamos sobre qual sería o motivo deste recurso não encontrar-se implementado no produto.

Como não ficamos satisfeitos só em aguardar uma solução, ao passo que notamos que a solução poderia ser simples, nos dividimos em pesquisas. Eu optei por estudar a solução usando Java.

Enfim, assim que acordei, ansioso em achar a solução para essa questão, parti para a pesquisa e à partir do que encontrei aqui neste post (http://unk1911.blogspot.com/2005/12/gmail-via-pop3-in-java.html), acabei descobrindo que a solução é muito mais simples do que eu imaginava à princípio.

Fato técnico: Para que uma SESSION a um servidor SSL seja estabelecida, primeiramente HOST e CLIENT devem estabelecer um HANDSHAKE com sucesso. Isso ocorre via SOCKET.

O problema teórico: Embora não tenha acesso ao código fonte, me parece óbvio então que entre duas suposições, uma é verdadeira: 1 – O algoritimo da tag <cfpop> não implementa o Handshake. 2 – Há um bug nesta implementação. Embora pareça óbvia que a verdadeira suposição seja a primeira, baseado no fato de que o CF8 possui em sua interface de administração a opção de ativar SSL na conexão ao servidor de email (vide figura 1), pode-se supor que exista a verificação desta opção no algoritimo do <cfpop>. OK! As opções no administrador, à princípio refere-se à configuração de SMTP e não POP. Mas, por mais absurdo que pode ser, é uma suposição.

A solução teórica: Antes de implementar um request (que ocorre via socket, naturalmente) usando a tag <cfpo>, forçar o handshake com o HOST (servidor POP) usando SSL.

Solução prática: Implementa-se esta solução, simplesmente definindo-se nas propriedades do JVM (obtido via System.getProperties()) as informações corretas para que seja utilizado SSL (obtido através de javax.net.ssl.SocketFactory) no processo de conexão. Vide código abaixo:



IMPORTANTE: Repare que em relação ao código original, a definição da seguinte propriedade ("mail.pop3.socketFactory.fallback", "false") foi omitida, o que equivale a deixa-la como TRUE. Esta opção faz com que o JVM retorne ou não ao padrão que é utilizar (("mail.pop3.socketFactory.class", "javax.net.SocketFactory") ao invés de (("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory") que estamos definindo, neste caso, para que na próxima seção de contato ao servidor de email seja utilizado SSL. Se “false” for utilizado, o JVM não irá recuperar a classe original, usando sempre SSL ao proceder um contato com um servidor POP qualquer daqui por diante. No ambiente do ColdFusion, isso prejudicialmente seria o equivalente a fazer com que QUALQUER aplicação rodando na mesma INSTÂNCIA de servidor, sempre utilizasse SSL neste procedimento. Isso fatalmente resultaria em erro de conexão a servidores POP que não utilizem SSL (diga-se, a maioria).

A partir disso, a implementação mais aconselhável sería:



“someFlag” deverá ser alguma variável indicando a necessidade de uso de SSL para esta operação. Por exemplo um campo de formulário do tipo “checkbox” que existirá se for marcado ou não irá constar no escopo FORM caso não tenha sido marcado. Assim, “someFlag” poderia ser substituído por:



A GRANDE PERGUNTA!: Por que isso simplesmente já não foi implementado na tag como um parâmetro, por exemplo, SSL=”true/false” pela Adobe / Macromedia / Allaire?

Agradecimentos:
Autor do Post original com a solução Java em http://unk1911.blogspot.com/2005/12/gmail-via-pop3-in-java.html e ao Jefferson Petillo pela ajuda, curiosidade, empenho e insônia compartilhada.

Nenhum comentário: