Esse artigo faz parte da revista Java Magazine edição 29. Clique aqui para ler todos os artigos desta edição

OR: windowtext; FONT-FAMILY: Verdana">"MARGIN: 0cm 0cm 12pt">Crie aplicações para envio e recebimento de mensagens e automatize um conjunto de tarefas importantes de aplicações web e desktop

Com a API JavaMail é possível enviar, receber e manipular e-mails sem a necessidade de conhecer detalhes dos protocolos utilizados. O programador trata apenas de informações de alto nível, como o endereço de destino, o assunto e o conteúdo da mensagem, deixando para a API detalhes da transmissão e outras atividades de bastidores.

As utilidades de suporte a e-mail numa aplicação são muitas. Há desde usos simples, como notificar o administrador sobre erros críticos que exigem ação imediata (ex.: “banco de dados fora do ar.”), até necessidades de postagem de e-mails em massa, por exemplo para enviar faturas para todos os clientes de um serviço no final do mês; ou distribuir material de marketing direcionado de forma automatizada. Outra utilização comum é para enviar mensagens de uma aplicação web ao se confirmar compras ou o cadastro de usuários.

Neste artigo mostramos os fundamentos da API JavaMail e conceitos de tecnologias relacionadas.

Requisitos

A Sun oferece uma distribuição gratuita do JavaMail, com implementações dos protocolos POP3, IMAP e SMTP, que deve ser obtida separadamente (não sendo incluída com o J2SE). Será preciso também o JavaBeans Activation Framework (JAF), que é usado para tratar mensagens com anexos e para o suporte a algumas operações com mensagens não textuais.

A distribuição do JavaMail (veja links) inclui na subpasta lib um jar com as classes e interfaces independentes de protocolo (mailapi.jar) e três com implementações de cada um dos protocolos suportados (pop3.jar, imap.jar e smtp.jar). É incluso ainda um jar com o conteúdo dos quatro jars combinados – mail.jar– no diretório-raiz da distribuição. O JAF é distribuído em um único arquivo: activation.jar.

Você pode reduzir o tamanho da sua aplicação desktop incluindo apenas os jars para os protocolos utilizados. Por exemplo, se sua aplicação apenas envia e-mails simples via SMTP, incluir mailapi.jar e smtp.jar será suficiente.

No caso de aplicações servidoras que executem num container J2EE, a inclusão dos jars não é necessária, pois a API JavaMail faz parte do J2EE, sendo disponibilizada como padrão para as aplicações que rodam nessa plataforma.

Enviando mensagens simples

O envio de mensagens com JavaMail é demonstrado na Listagem 1. A primeira coisa a ser feita é criar um objeto javax.mail.Session, que representa uma conexão para envio/recebimento de mensagens entre um cliente e um servidor de e-mail. É responsabilidade dessa sessão armazenar informações, como usuário e senha, o tipo de protocolo usado e o endereço do provedor. A sessão pode ser obtida e inicializada com as propriedades desejadas usando o método estático getDefaulInstance(), como a seguir:

Session session = Session.getDefaultInstance(props);

Outro método que pode ser usado para inicialização da sessão é getInstance(). A diferença é que getDefaultInstance() cria a sessão na primeira vez em que é chamado e retorna sempre a mesma sessão nas chamadas seguintes (ou seja, haverá apenas uma sessão para toda a JVM). Já getInstance() cria uma nova sessão toda vez que é invocado.

O método getDefaultInstance() é o mais simples, sendo satisfatório para uma aplicação desktop usada por um usuário de cada vez; mas geralmente não será adequado para servidores, que podem ter que se comunicar com múltiplos serviços de e-mail simultaneamente.

O objeto do tipo java.util.Properties passado como argumento de getDefaultInstance() é carregado com diversas informações relativas à sessão, como o protocolo utilizado ou o endereço do servidor. A maioria das propriedades é opcional, e algumas podem ser definidas de forma equivalente por chamadas a métodos da API.

É com relação às propriedades que há outra diferença entre os dois métodos comentados. Com getDefaultInstance() as propriedades passadas são consideradas por esse método apenas na primeira vez em que é invocado, sendo ignoradas em todas as invocações posteriores, independentemente de mudanças em seus valores.

Criada a sessão, devemos criar a mensagem, representada por um javax.mail.Message. A API JavaMail tem apenas uma implementação dessa interface: javax.mail.internet.MimeMessage. Com o texto da mensagem pronto, definimos o endereço de destino com o método setRecipient():

msg.setRecipient(Message.RecipientType.TO,

      new InternetAddress("beto@bol.com "));

msg.setRecipient(Message.RecipientType.CC,

      new InternetAddress("carol@col.com "));

O primeiro parâmetro indica se o endereço fornecido (uma implementação de javax.mail.Address) deve ser inserido no campo To, Cc ou Bcc. No exemplo, enviamos uma mensagem para Beto com cópia para Carol. Existe também uma versão de setRecipient() que recebe um array de endereços. É uma boa opção para um programa de envio de mala direta, por exemplo.

Continuando com o exemplo, temos uma seqüência de métodos que definem o endereço do remetente, o assunto do e-mail e o seu conteúdo:

msg.setFrom(new InternetAddress("ana@bol.com.br"));

msg.setSubject("Teste da JavaMail");

msg.setText("Ola, como vai?");

Resta-nos apenas o envio, que é feito através de uma chamada a Transport.send(). O método estático send() envia a mensagem para todos os endereços contidos nos campos To, Cc e Bcc. Caso ocorra erro no envio para algum dos destinos, uma javax.mail.SendFailedException é lançada.

Repare que, na Listagem 1, logo depois de criarmos a sessão, usamos o seu método setDebug(). Este método faz com que a API registre no console diversas informações de log, entre elas a mensagem enviada, incluindo todo o seu cabeçalho:

Message-ID: <8789796.1113376538718.JavaMail.dediana@mdd-br8f71av6f6>

From: ana@aol.com.br

To: beto@bol.com.br

Subject: Teste do JavaMail

Cc: carol@col.com.br

...

Quer ler esse conteúdo completo? Tenha acesso completo