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

Uma Mala Direta com JavaMail

Enviando Múltiplas Mensagens Personalizadas em HTML

Aprenda como utilizar a API JavaMail para enviar e-mails com HTML, enviar anexos e ainda personalizar o e-mail com os dados do cliente utilizando expressões regulares

 

Neste artigo, vamos demonstrar a API JavaMail criando uma aplicação completa. Iniciamos com conceitos básicos sobre a API, depois mostramos passo a passo a criação de uma aplicação de mala direta funcional, na qual lemos informações sobre clientes de uma tabela em um banco de dados MySQL e enviamos e-mails personalizados para cada cliente. Também apresentamos o conceito de expressões regulares e as funcionalidades oferecidas pela plataforma Java, usando-as para personalizar as mensagens enviadas.

A API JavaMail

A API JavaMail é utilizada para leitura e envio de e-mails, e oferece diversos recursos essenciais para aplicações corporativas, entre os quais destacamos:

·         Suporte a vários protocolos de envio e leitura de e-mail (ex.: POP3, SMTP, IMAP)

·         Suporte a mensagens em HTML

·         Suporte a envio de mensagens com anexos

 

A API JavaMail não é incluída com o JDK, portanto é necessário fazer o download e disponibilizá-la para a aplicação. Além disso, será necessária a API JavaBeans Activation Framework (JAF). Os downloads podem ser feitos em java.sun.com/products/javamail/downloads e java.sun.com/products/javabeans/jaf/downloads. Será preciso, portanto, adicionar dois JARs ao classpath da aplicação: mail.jar e activation.jar.

Se você está desenvolvendo aplicações Java EE, não há nenhuma preocupação adicional, pois as APIs JavaMail e JAF fazem parte do Java EE.

Visão geral das classes da API

Apresentamos a seguir uma breve descrição de algumas classes fundamentais do JavaMail.

javax.mail.Session

A classe Session representa uma sessão de e-mail. É através dela que obtemos os objetos responsáveis pelo envio e leitura de e-mails, como por exemplo Transport, Store e Folder. Para obter um Session precisamos de informações sobre o servidor de e-mails, que podem ser passadas através de um objeto java.util.Properties.

javax.mail.Transport

A classe abstrata Transport encapsula o protocolo de envio de e-mails (geralmente SMTP) e contém métodos para envio de mensagens. Um objeto do tipo Transport é obtido através do objeto Session informando o protocolo utilizado. A API JavaMail fornece apena uma subclasse concreta de Transport: javax.mail.internet.SMTPTransport.

javax.mail.Store e  javax.mail.Folder

Apesar de não utilizarmos estas classes no nosso exemplo pois elas são usadas para leitura ou transferência de e-mails do servidor para o cliente, vale a pena citá-las. A classe abstrata Store é utilizada para a leitura de mensagens de um servidor de e-mail. Ao obter um objeto Store através da sessão indicamos qual o protocolo utilizado, por exemplo POP3 ou IMAP (há duas subclasses concretas de Store na API: POP3Store e IMAPStore). Então nos conectamos ao servidor informando os dados para autenticação e recebimento das pastas (javax.mail.Folder) que contêm os e-mails do usuário autenticado.

A classe abstrata Folder representa uma pasta de e-mails do usuário autenticado. Objetos Folder (há as subclasses POP3Folder e IMAPFolder na API) são obtidos através de um objeto Store através do seu nome.

javax.mail.internet.MimeMessage

A classe MimeMessage representa uma mensagem a ser lida ou transferida por e-mail, e estende a classe abstrata javax.mail.Message. Para criarmos uma MimeMessage é necessário termos um objeto Session. A mensagem fica associada à sessão de e-mail.

javax.mail.internet.InternetAddress

A classe InternetAddress representa um endereço de e-mail, incluindo opcionalmente um nome.

javax.mail.Authenticator e javax.mail.PasswordAuthentication

Um objeto da classe Authenticator sabe como obter os dados para autenticação do usuário, retornando um objeto PasswordAuthentication. Não há restrição para as formas de se obter esses dados, que podem vir de um arquivo, de entradas do usuário em um prompt, de uma conexão a uma fonte de dados externa, ou mesmo informando-se o usuário e a senha no construtor do objeto, como implementamos no exemplo deste artigo.

O projeto de Mala Direta

A aplicação de exemplo é formada por quatro classes. A classe EnviadorDeEmail (listagem 1) é responsável por criar a mensagem, anexar um arquivo e fazer o envio (e numa segunda etapa, por personalizar as mensagens). A classe MalaDireta (Listagem 2) é a classe executável da aplicação; ela cuida da leitura dos clientes do banco de dados e chama os métodos da classe EnviadorDeEmail para cada cliente recuperado. Cada destinatário da mala direta é representado por um objeto Cliente (Listagem 3), com nome, endereço de e-mail, telefone e id. A classe Autenticador (Listagem 4) faz a autenticação no servidor de e-mails, necessária para o envio. Na Listagem 5 é mostrado o comando SQL para criação da tabela de clientes no banco de dados.

 

 

Listagem 1. EnviadorDeEmail.java sem personalização

package maladireta;

 

import java.io.*;

import java.util.*;

import java.util.regex.*;

import javax.activation.*;

import javax.mail.*;

import javax.mail.internet.*;

 

public class EnviadorDeEmail {

  private static String EMAIL_REMETENTE = "yara@globalcode.com.br";

  private static String NOME_REMETENTE = "Yara";

  private static String SERVIDOR_SMTP = "smtp.globalcode.com.br";

  private static String SENHA = "senha";

 

  public void enviarEmail(String assunto, String conteudo,

      Cliente destinatario, String arquivo) throws AddressException,

      MessagingException

  {

    Session sessao = obterSessao();

    Message mensagem = criarMensagem(sessao, assunto, destinatario);

    adicionarConteudoEAnexo(mensagem, conteudo, destinatario, arquivo);

    mensagem.saveChanges();

    Transport transport = null;

    try {

      transport = sessao.getTransport("smtp");

      transport.send(mensagem);

    }

...

Quer ler esse conteúdo completo? Tenha acesso completo