Como saber se uma string possui URL ou Email em Java

Estávamos atrás de um método que fizesse isso, pois nosso Email Inviter (Convidador de emails) podia estar sendo utilizado para distribuir SPAM. Então, o requisito era: no corpo da mensagem a ser enviada, não se pode permitir o envio de URLs nem de Emails.

Eu busquei isso em alguns lugares, e vi muitas respostas complexas usando expressões regulares, e no final de tudo eram soluções incompletas. Algumas delas não identificavam uma URL que não começasse com ?http://?.

Decidi então fazer meu próprio método e descobri que é muito simples. Aqui está o código:

http://tiagoromero.wordpress.com/2010/03/16/como-saber-se-uma-string-possui-url-ou-email-em-java/

Cara, é acho muito complicado e chato fazer esse tipo de método, acho melhor você continuar a procurar algo pronto dentro da API.

Testa assim: System.out.println(checkForURLOrEmail("@teste.com.br"));

Ainda existem questões como aceitar ou não acentos.

Ei Evandro,

Cara eu fiz o teste que você sugeriu e o método retornou true como esperado.

Poisé, eu desenvolvi isto pois não achei uma API que tivesse tal funcionalidade, você conhece alguma?
Como eu não achei eu acabei desenvolvendo pois me pareceu simples de fazer. Eu concordo que se houver alguma API pronta, com certeza será muito melhor.

A questão de acentos no nosso caso não se aplica pois o software que trabalho ainda não está disponível nem no Brasil e nem em outro país que utilize acentos… Por enquanto tem apenas em inglês. Mas por favor sinta-se a vontade em melhorar este método e incluir tal controle de acentos :slight_smile:

Meu objetivo mostrando isso é apenas apresentar uma solução simples mas com certeza eu acho que não é a melhor solução, é apenas uma solução que resolvi mostrar aqui.

Obrigado e abraços

Acho que você poderia tentar misturar regex com alguma coisa… Ou só regex quem sabe já resolve seu problema.

Um captcha no seu email sender poderia resolver o seu problema?

Bom, eu usaria pesquisa por expressões regulares num primeiro momento: ERs de URL ou Email existem a rodo por ai, basta googlear, porem analisar SPAM mesmo pode ser feito através de filtros especializados. Em java eu não conheço nenhum (com certeza tem) mas em perl existem excelentes como o AmavisD-new.

Crie uma blacklist de ips ou outra coisa q possa identificar quem usa os seus serviços de forma indevida ou distribua um token de autenticação gerado de alguma forma. E faça logging de tudo.

Boa idéia, Andre.

Certamente será processado mais rápido.

Eu até pensei em regex, mas não me aventurei por falta de experiência e prazo apertado, e além disso pois este método será chamado com pouca frequência, então não é necessário por enquanto fazer um método mais rápido.

Eu até achei umas soluções de regex na internet mas elas falhavam quando a URL não começava com http:// nem com www.

Mas que é uma boa é!

Ei peczenyj,

Legal que você foi mais a fundo na discussão.

Realmente apenas caçar URLs e Emails é uma abordagem superficial, obrigado por sugerir o uso de filtros especializados, vou dar uma pesquisada sobre isso.

Sobre o captcha, nós já utilizamos em outros lugares no sistemas mas achamos que não vai influenciar neste caso pois permitimos o envio do email de convite para diversos destinatários ao mesmo tempo, e o problema está bem aí em apenas 1 submit.

Quem costuma hackear o nosso site é um povo a toa da Romenia… Povo sem serviço!

Obrigado pelas dicas!

Bem, para validar uma URL acredito que a classe java.net.URL já te ajude bastante. No caso do email é mais complicado e honestamente só vi exemplos com regex (por sinal os exemplos visavam ensinar regex e não validar emails de fato).

Olhe a classe java.net.URI se não tiver erro usa esse exemplo de regex: http://www.java2s.com/Code/Java/Regular-Expressions/Validateemailaddress.htm

da pra fazer um laço andando toda string com o substrig(var) se acabar a string e naum vier nada igual “@” é uma url ese no! :smiley: