• Nenhum resultado encontrado

Aplicando as expressões regulares

No documento Java Magazine - Edição 039.pdf (páginas 68-71)

Para permitir a personalização das men- sagens vamos fazer algumas alterações im-

Figura 1. Um exemplo de expressão regular

Figura 2. E-mail enviado em HTML com anexo teste.txt

[A-Z][a-z]+((\\s[A-Z][a-z]+)|\\s[a-z]{2}|\\s[A-Z].)+

[A-Z]

O texto deve começar com uma letra maiuscula

[a-z] +

Seguido de uma ou mais letras minusculas

\\s[A-Z][a-z]+ Um espaço, seguido de uma letra maiúscula e uma ou mais letras minúsculas

| ou

\\s[a-z]{2}

Um espaço, seguido de duas letras minúsculas

\\s[A-Z] .

Um espaço, seguido de uma letra maiúscula, seguido de um ponto

+ Uma ou mais vezes

No me s válidos de aco rdo com a exp ress ão N ome s invá lidos de acord o co m a expre ssã o

Maria Aparecida Maria A. Soares Maria Aparecida Soares Maria da Silva

maria aparecida MARIA APARECIDA Maria A Soares

68  Java Magazine•Edição 39

MalaDireta, que realiza a substituição do nome e a verificação do telefone.

1.  Utilizamos o método replaceAll() da classeString. Este método recebe uma string contendo uma expressão regular e a string que deve substituir o texto localizado. Neste caso a expressão contém apenas caracteres, ou seja, não utilizamos símbolos espe- ciais como /d, ou [A-Z], apenas uma string

%cliente.nome% (note que a porcentagem

não é um símbolo especial de expressão regular).

conteudo = conteudo.replaceAll(

  “%cliente.nome%”,destinatario.getNome());

2. Compilamos a expressão regular que

Listagem 7. Alterações na classe MalaDireta para personalização das mensagens

public class MalaDireta {   //...

public static void main(String[] args) throws Exception {

String assunto = “Teste de envio de e-mail do projeto MalaDireta”; StringBuilder conteudo = new StringBuilder();

conteudo.append(“<!DOCTYPE html PUBLIC ‘-//W3C//DTD HTML 4.01 Transitional//EN’>”); conteudo.append(“<html><head> <title>Teste de envio de e-mail</title></head>”); conteudo.append(“<body> Caro(a)  %cliente.nome%,<br> <br>”);

conteudo.append(“Voc&ecirc; est&aacute; cadastrado(a) no nosso sistema e esta “);

conteudo.append(“&eacute; uma mensagem que testa o envio de e-mail para a sua conta.<br>”); conteudo.append(“<br> Se voc&ecirc; n&atilde;o quer mais receber nossos e-mails, por “); conteudo.append(“favor escreva para <a href=’mailto:contato@globalcode.com.br’>”); conteudo.append(“contato@globalcode.com.br</a> solicitando descadastramento.<br>”);   conteudo.append(“<br> %corrigir_telefone% <br>”);

conteudo.append(“Pedimos a gentileza de responder este e-mail confirmando o” +“recebimento.<br>”);

  //... }

Listagem 6. Trecho demonstrando o uso da expressão regular ilustrada na Figura 1.

Pattern p = Pattern.compile(

“[A-Z][a-z]+((\\s[A- Z][azz]+)|\\s[a-z]{2}|\\s[A-Z].)+”); String nomeCorreto = “Maria Aparecida da Silva”;

String nomeCorreto1 = “Maria Aparecida Silva”; String nomeCorreto2 = “Maria A. Soares”; String nomeIncorreto = “maria aparecida”; String nomeIncorreto2 = “MARIA APARECIDA”; String nomeIncorreto3 = “Maria”;

String[] nomes = {nomeCorreto, nomeCorreto1, nomeCorreto2, nomeIncorreto, nomeIncorreto2, nomeIncorreto3}; for (String nome: nomes){

Matcher m = p.matcher(nome); if (m.matches()){

System.out.println(nome+”: está no padrão”); }

  else{

System.out.println(nome+”: não está no padrão”); }

com oito dígitos, sendo que o DDD pode estar colado ao número, ou separado por um espaço ou hífen. De acordo com essa expressão, os seguintes números seriam considerados válidos:

•11-31711987

•11 31711987

•1131711987

 Já os números a seguir não estariam de acordo com a expressão:

•31711987

•222323

•7632323r34

Agora vamos analisar passo a passo o novo métodopersonalizarConteudo() da classe portantes na classeMalaDireta, mostradas na

Listagem 7. Observe que no texto do e-mail incluímos no conteúdo HTML do e-mail a ser enviado “pedaços” de texto para serem substituídos: %cliente.nome% e %cliente.

telefone%. Vamos utilizar expressões re-

gulares através do método replaceAll() da classeStringpara substituir esses pedaços pelo nome e o telefone do cliente.

Observe que este é o caso mais simples de uso de expressões regulares, em que o padrão fornecido é exatamente igual ao texto que deve ser localizado. Para demonstrar mais recursos de expressões regulares, vamos verificar se um tele- fone de cada cliente segue um padrão estabelecido, de acordo com a seguinte expressão:

\\d{2}(-|\\s)??\\d{8}

Essa expressão ve- rifica se o telefone contém um DDD com dois dígitos e um número

Edição 39• Java Magazine 69

Listagem 8. Alterações na classe EnviadorDeEmail para personalização

public class EnviadorDeEmail {   //...

private void adicionarConteudoEAnexo(Message message, String conteudo, Cliente destinatario, String arquivo) throws MessagingException, AddressException

{

conteudo = personalizarConteudo(conteudo, destinatario); //... Igual à Listagem 1

}

private String personalizarConteudo(String conteudo, Cliente destinatario){ // personalização do conteúdo

conteudo = conteudo.replaceAll(“%cliente.nome%”,destinatario.getNome()); Pattern p = Pattern.compile(“\\d{2}(-|\\s)??\\d{8}”);

String telefone = destinatario.getTelefone(); Matcher m = p.matcher(telefone);

if (m.matches()){

System.out.println(“O “+telefone+” está no padrão”); conteudo = conteudo.replaceAll(“%corrigir_telefone%”,””); }

else {

System.out.println(“O “+telefone+” não está no padrão”); conteudo = conteudo.replaceAll(“%corrigir_telefone%”,

“<br>Seu telefone “+ telefone + “ parece estar incorreto,” + “solicitamos a gentileza de entrar em contato”

+ “para atualização do cadastro<br>”); }

return conteudo; }

//... }

Figura 3. E-mail com conteúdo personalizado

 java.sun.com/products/javamail/ 

Página oficial do JavaMail.

 java.sun.com/docs/books/tutorial/extra/   regex/intro.html 

Tutorial sobre Expressões Regulares

 javamagazine.com.br/downloads/jm39/  jm-maladireta.zip

 Yara M. H. Senger

( yara@globalcode.com.br ) é formada em Ciências da Com- putação na USP em São Carlos, especialista em desenvolvimento web; possui as certificações SCJA, SCJP e SCWCD. Atualmente é Instrutora e Diretora Educacional da Globalcode, criadora e coordenadora de diversos cursos das carreiras Academia do Java e Academia do Web Developer.

Ana Abrantes

(ana.abrantes@globalcode.com.br ) é desenvolvedora Java na Globalcode, co-autora do curso de JasperReports/ iReport e possui algumas certificações em Java (SCJA, SCJP e SCWCD). É formada pela FATEC- SP e atua na área de informática há mais de 15 anos.

irá validar o telefone com um método estático da classePattern.

Pattern p = Pattern.compile(“\\d{2}(-|\\s)??\\d{8}”); 3. Depois Verificamos se o telefone do destinatário está de acordo com a expres- são regular compilada. Esta operação retorna um objeto da classeMatcher, sobre o qual podemos chamar o métodomatches() que retorna verdadeiro ou falso.

String telefone = destinatario.getTelefone(); Matcher m = p.matcher(telefone);

4. Se o telefone estiver no padrão, a cadeia de caracteres “%corrigir_telefone%” será removida do e-mail, através da substituição por uma string vazia. Se o telefone não es- tiver no padrão esperado, será substituído por um texto que solicita que o cliente entre em contato para atualização do cadastro.

if (m.matches()){

System.out.println(“O “+telefone+” está no padrão”); conteudo = conteudo.replaceAll(“%corrigir_telefone%”,””); } else {

System.out.println(“O “+telefone+” não está no padrão”); conteudo = conteudo.replaceAll(“%corrigir_

telefone%”,”<br>Seu telefone “+ telefone+ “ parece estar incorreto /*... */ “); }

O métodopersonalizarConteudo() deve ser chamado na classeEnviadorDeEmail. Veja na Listagem 8 o trecho alterado nesta classe. AFigura 3 mostra um exemplo de e-mail enviado com o conteúdo personalizado.

Conclusões

Neste artigo, vimos como usar recursos essenciais da API JavaMail aplicando-os em uma situação real. Usamos também expressões regulares, um recurso podero- so que é suportado por classes específicas da API do Java SE, bem como a classe String.

70  Java Magazine•Edição 39

No documento Java Magazine - Edição 039.pdf (páginas 68-71)