A API JavaMail apresenta uma excelente oportunidade para os desenvolvedores integrarem todas as capacidades avançadas de correio eletrônico em suas aplicações contando com todos os benefícios que essa API pode proporcionar. Entre os benefícios que teremos destaca-se: a facilidade de desenvolvimento, o suporte a múltiplos protocolos e a integração flexível de avanços futuros.

Também temos como destaque o servidor de comunicações colaborativo Microsoft Exchange que é usado em praticamente todas as empresas de médio e grande porte que ajuda a organizar os e-mails de toda a corporação. Juntando o poder de ambos podemos construir aplicações que podem enviar e-mails fornecendo alertas, avisos de problemas ou lembretes, progresso de rotinas, status de execução, entre inúmeras outras funcionalidades.

No restante do artigo veremos melhor o que é o Microsoft Exchange e teremos uma boa compreensão de algumas das capacidades da JavaMail API e como integrar as duas tecnologias. Também desenvolveremos um exemplo para ficar mais claro na prática como podemos fazer uso das ferramentas.

Microsoft Exchange

O Microsoft Exchange é um servidor de comunicações colaborativo baseado em e-mail projetado para grandes empresas. As licenças do Microsoft Exchange podem ser compradas tanto na Microsoft que também é responsável por fabricar o produto quanto pelos seus revendedores. Caso a organização use o Microsoft Exchange, mas não sabemos se realmente temos uma conta nele basta contatarmos o administrador de rede da empresa ou o suporte técnico para obter uma assistência. O Exchange é um servidor de e-mail proprietário da Microsoft que pode ser instalado apenas em plataformas Windows Server e pode ser acessado por diversos clientes de diferentes plataformas como toda a família Unix, Linux, Windows e Mac Os.

A diferença para usuários domésticos é que estes não costumam ter uma conta no Exchange, ao invés disso, usuários domésticos usam uma conta de e-mail POP3 com um provedor de serviços de internet (ISP) ou então utilizam um servidor de e-mail Web como o Windows Live Mail ou o Gmail. Aqueles que não possuem conta do Exchange não podem usar recursos do Outlook que requerem o Exchange.

O Exchange ainda oferece uma grande gama de opções de implantação, proteção contra vazamento de informações, recursos avançados de conformidade, recursos que simplificam a administração, acesso com segurança através de qualquer plataforma, navegador web ou dispositivo através de protocolos que são padrões na indústria, além também de armazenamento, arquivamento, retenção de e-mails, alta disponibilidade, recuperação de desastres e risco reduzido de Malware e Spam através de defesas embutidas contra vírus e lixo eletrônico e com suporte para uma variedade de produtos de segurança de terceiros.

O Microsoft Exchange possui três versões, são elas: Microsoft Exchange 2003, Microsoft Exchange 2007, Microsoft Exchange 2010 e a mais atual Microsoft Exchange 2013. O grande concorrente do Microsoft Exchange no mercado atualmente é o IBM Lotus Notes.

O Microsoft Exchange Server possui múltiplos programas utilitários que vem juntamente com o seu pacote de instalação para nos ajudar a executar e customizar o servidor Exchange. Uma das aplicações mais úteis é o Exchange Management Console (EMC). Com esse utilitário, podemos visualizar e administrar todos os usuários e as caixas de e-mail que estão conectadas ao servidor Exchange.

Segue na Figura 1 um exemplo de uma das ferramentas administrativas do Microsoft Exchange 2013 (Exchange Management Console).

Figura 1. Ferramenta de administração do Microsoft Exchange.

O Exchange Management Console também permite filtrar mailboxes, contatos, pastas públicas e grupos com bastante flexibilidade, definir e controlar limites, gerenciar grupos dinâmicos, gerenciar contatos e muito mais.

JavaMail API

A API JavaMail fornece um framework independente de plataforma e independente de protocolo para construir aplicações de correio e de mensagens. A API JavaMail está disponível como um pacote opcional para o uso com a plataforma Java SE. Na plataforma Java EE a API JavaMail é incluída por padrão, portanto não há a necessidade de baixar o JAR, basta importa-la diretamente no código.

JavaMail é uma API Java usada para enviar e receber e-mail via SMTP, POP3 e IMAP. JavaMail é construído na plataforma Java EE, mas também oferece um pacote opcional para uso em Java SE, como dito anteriormente.

Existe ainda outra implementação open source do JavaMail que é a GNU JavaMail. Esta API suporta apenas a versão 1.3 da especificação do JavaMail, além disso, esta API fornece o único NNTP que é livre, o que torna possível a utilização desta tecnologia para ler e enviar artigos de grupo de notícias.

A API GNU JavaMail é uma implementação livre da especificação JavaMail API, versão 1.3. Todo o código foi escrito a partir do zero, sem qualquer tipo de referência ao código da Sun. Isso permite ao GNU JavaMail ser usado em um sistema operacional completamente livre, como o GNU/Linux ou o Hurd. O código é otimizado para trabalhar com implementações livres do Java, mas nada impede que ele seja usado com qualquer JVM compatível.

A GNU JavaMail fornece um framework independente de protocolo para a construção de aplicações de e-mail clientes em Java. A API em si oferece uma implementação completa de MIME e drivers para protocolos de mensagens individuais, conhecidos como provedores ou prestadores de serviços. Além disso, a API também pode ser conectada ao framework JavaMail dinamicamente. Vários provedores de protocolos padrão da Internet estão incluídos com o GNU JavaMail. Entre esses protocolos que estão incluídos destacam-se: o protocolo SMTP, IMAP, POP3, NNTP inclusive com postagem para servidores de notícias, o formato Unix mbox, e o formato Dan Bernstein's Maildir.

Todos esses provedores possuem recursos completos, e fornecer acesso criptograficamente seguro quando relevante. No entanto, se um determinado provedor ou funcionalidade que seja necessário para uma necessidade específica não for encontrada, este provedor ou funcionalidade pode desenvolvida junto com a comunidade do GNU JavaMail.

A versão atual estável do GNU JavaMail é a versão 1.1.2 e está atualmente disponível no repositório http://ftp.gnu.org/gnu/classpathx/mail-1.1.2.tar.gz. Além da biblioteca pode ser encontrado documentação, código-fonte, etc.

Diferente da GNU JavaMail a versão atual da API oficial JavaMail é a 1.5.1 e contém 16 correções de bugs e melhorias em relação a última versão. A última versão foi lançada em 13 de novembro de 2013. Entre as novidades dessa versão destacam-se:

  • Suporte simples para QRESYNC (RFC 5162) e CONDSTORE (RFC 4551);
  • Suporte para WITHIN (RFC 5032) e ID (RFC 2971);
  • Suporte para gravação de timeouts.

O projeto open source JavaMail mudou-se recentemente para a java.net. O código fonte para a Implementação de Referência da API JavaMail já está disponível no repositório Mercurial no projeto JavaMail em java.net.

A maior parte do código fonte do JavaMail é licenciada pelas seguintes licenças: CDDL-1.1 e GPL-2.0 com algumas exceções. O código fonte dos programas demo estão licenciados sobre a licença BSD.

Para baixar o JavaMail através do maven podemos utilizar o arquivo pom.xml, conforme a Listagem 1.

Listagem 1. Arquivo pom.xml para baixar o JavaMail API.


  <project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example.common</groupId>
    <artifactId>JavaMailExample</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>JavaMailExample</name>
    <url>http://maven.apache.org</url>
   
    <repositories>
      <repository>
           <id>Java.Net</id>
           <url>http://download.java.net/maven/2/</url>
      </repository>
    </repositories>
   
    <dependencies>
      <!-- JavaMail API -->
      <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.3</version>
      </dependency>
    </dependencies>
  </project>

Devemos atentar para a versão que estamos baixando, sempre coloque a última versão disponível. Todas as dependências necessárias também são baixadas quando utilizamos o maven. Assim, não é preciso se preocupar em procurar qualquer arquivo externo.

Obtendo informações do Exchange

Para acessar as configurações do Microsoft Exchange podemos ir no outlook e acessar a opção "Ferramentas" e "Contas de email...", conforme mostra a Figura 2.

Figura 2. Acessando detalhes da conta.

Na próxima tela selecionamos a opção "Exibir ou alterar contas de email existentes". Após isso basta clicar no botão "Avançar" (Figura 3).

Figura 3. Selecione a opção para exibir ou alterar contas existentes.

Na tela de "Contas de Email" selecione a opção "Microsoft Exchange Server" na caixa que contém acima o rótulo "O Outlook processa emails para estas contas na seguinte ordem:". Por fim clique na opção "Alterar..." no lado direito da tela. A Figura 4 mostra a tela.

Figura 4. Selecionando opção alterar do Microsoft Exchange.

Na próxima tela podemos visualizar a URL do Microsoft Exchange Server que é o que vamos precisar no nosso código para podermos enviar emails. A Figura 5 mostra como é esta tela.

Figura 5. Acessando a URL do Microsoft Exchange.

O detalhe é que para onde a fecha aponta é onde deve estar a url. Neste exemplo foi retirada a URL, mas este é o lugar onde ela está.

Enviando e-mail com JavaMail e Microsoft Exchange

Segue na Listagem 2 o código utilizado para enviar e-mail com JavaMail API e Microsoft Exchange.

Listagem 2. Enviando e-mail com JavaMail API e Microsoft Exchange.


  package util;
   
  import java.util.Properties;
  import javax.mail.Message;  
  import javax.mail.MessagingException;  
  import javax.mail.PasswordAuthentication;  
  import javax.mail.Session;  
  import javax.mail.Transport;  
  import javax.mail.internet.InternetAddress;  
  import javax.mail.internet.MimeMessage;  
    
    
  public class MailExample  
  {  
   
         public static void main(String args[]) {
                
               final String username = "username-do-outlook";
               final String password = "senha-do-outlook";
   
               Properties props = new Properties();
               props.put("mail.smtp.auth", "true");
               props.put("mail.smtp.starttls.enable", "false");
               props.put("mail.smtp.host", "endereco-do-exchange");
               props.put("mail.smtp.port", "25"); 
   
               Session session = Session.getInstance(props,
                 new javax.mail.Authenticator() {
                      protected PasswordAuthentication getPasswordAuthentication() {
                             return new PasswordAuthentication(username, password);
                      }
                 });
   
               try {
   
                      Message message = new MimeMessage(session);
                      message.setFrom(new InternetAddress("meu-email@servidor-exchange.com.br"));
                      message.setRecipients(Message.RecipientType.TO,
                             InternetAddress.parse("algum-email@servidor-exchange.com.br "));
                      message.setSubject("Titulo do Email");
                      
                      
                      String msg = "<b>Teste negrito</b>. Teste sem negrito.<br/><br/>";
                      
                      message.setContent(msg, "text/html");
                      
                      Transport.send(message);
   
                      System.out.println("Enviada!");
   
               } catch (MessagingException e) {
                      throw new RuntimeException(e);
               }
         }
         
  }  

Neste código devemos atentar para alguns detalhes como a variável username que deve ser colocado o username da sua caixa postal ou de alguma caixa postal que foi criada no Exchange, e em password colocamos a senha da caixa postal. Nas configurações das propriedades do JavaMail coloque em "mail.smtp.host" o endereço do Microsoft Exchange que nós achamos no outlook anteriormente. Na propriedade "mail.smtp.port" colocamos a porta do SMTP que como padrão é definido na porta 25, mas para não termos problemas não custa perguntar aos administradores de rede.

Na mensagem basta configurarmos os detalhes do e-mail. Em "message.setFrom" colocamos o e-mail de origem que deve ser um e-mail existente e que foi configurado no username. Em "message.setRecipients" configuramos o e-mail de destino.

Também podemos enviar um e-mail para diversos destinatários. O método da Listagem 3 oferece essa funcionalidade.

Listagem 3. Assinatura do método addRecipients.


  void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException

Onde type deve ser setado para TO, CC ou BCC. CC representa Carbon Copy e BCC Black Carbon Copy. Para passar o TO como parâmetro usamos, por exemplo, Message.RecipientType.TO. O parâmetro addresses é o array de ID de e-mails, deveremos usar o InternetAddress ao especificar IDs de e-mail. Segue na Listagem 4 um código de exemplo.

Listagem 4. Exemplo de utilização do InternetAddress.


  String to = "abcd@gmail.com";
  message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

A API JavaMail ainda oferece diversas outras funcionalidades como a inclusão de anexos nos e-mails. Apenas com essas informações já podemos enviar e-mails utilizando a API JavaMail e o Microsoft Exchange.

A estrutura de pacotes e classes na API JavaMail demonstra que um dos principais objetivos de seus projetistas era que o nível de esforço exigido pelo desenvolvedor para construir uma aplicação deveria ser ditada pela complexidade da aplicação e pelo nível de controle exigido pelo desenvolvedor do aplicativo. Em outras palavras, manter a API tão simples quanto possível. O aplicativo de exemplo incluído neste artigo e os exemplos que vêm com a API JavaMail demonstram amplamente este ponto de vista.

À primeira vista, o número de classes da API JavaMail e a estrutura detalhada dessas classes podem fazer com que o desenvolvedor acredite que a curva de aprendizagem para aprender a mexer na API é relativamente pesada. Mas, na realidade, uma vez que começamos a trabalhar com a API JavaMail, vamos descobrindo que esta API é uma ferramenta simples e acessível para uma implementação robusta de e-mails ou mensagens em nossas aplicações.

Uma análise das classes primárias dos pacotes da API JavaMail fornecem uma visão sobre os mecanismos comuns no sistema de mensagens de e-mail. Uma visão geral de alto nível das classes na ordem relativa em que são normalmente encontrados em uma aplicação comum revela a simplicidade da API JavaMail. Embora a API JavaMail contenha muito mais classes do que outras APIs, concentrando-se em algumas das classes principais para começarmos a desenvolver torna-se bastante fácil de entender a essência da API. A seguir está uma descrição detalhada dessas classes principais, que incluem javax.mail.Session, javax.mail.Store, javax.mail.Transport, javax.mail.Folder e javax.mail.Message. Algumas dessas classes não foram exemplificadas no exemplo acima, mas é importante saber para que servem.

A classe javax.mail.Session é a classe de entrada de nível superior para a API JavaMail, e seus métodos mais comumente usados fornecem a capacidade de controlar e carregar as classes que representam as implementações do provedor de serviço (ou Service Provider Implementations - SPI) para vários protocolos de e-mail. Por exemplo, instâncias das classes javax.mail.Store e javax.mail.Session, que serão descritos mais abaixo, são obtidos através da classe Session. (Nota: Um prestador de serviços é um desenvolvedor e/ou um fornecedor que fornece uma implementação para uma API; exemplos de implementações da API JavaMail incluem POP3, SMTP e IMAP4 - alguns estão disponíveis a partir da Sun, outros através de terceiros).

A classe javax.mail.Store é implementada por um prestador de serviços, assim como um desenvolvedor de aplicação POP Mail, e permite ler, escrever, monitorar, e procurar acesso para um protocolo de e-mail particular. A classe javax.mail.Folder é acessada através desta classe e é detalhada mais abaixo.

A classe javax.mail.Transport é outra classe implementada por fornecedor e é usada para enviar uma mensagem. Esta classe também é utilizada para o envio de uma mensagem através de um protocolo específico.

A classe javax.mail.Folder é implementada por um fornecedor. Esta classe oferece uma organização hierárquica para enviar mensagens e fornece acesso a mensagens de e-mail na forma de objetos de classe javax.mail.Message.

A classe javax.mail.Message é implementada por um fornecedor e modela todos os detalhes de uma mensagem de e-mail como assunto, endereço de e-mail do remetente ou destinatário, data de envio do e-mail, e assim por diante. As orientações para os fornecedores que implementam o javax.mail.Message é para que a busca real de componentes de mensagens de e-mail deve ser adiada o máximo possível, a fim de tornar esta classe tão leves quanto possível. Estas e outras orientações encontram-se na especificação do JavaMail que além de ser simples é bastante objetivo.

Se estivermos utilizando uma versão anterior ao Java SE 1.6 precisaremos também da extensão JavaBeans Activation Framework (JAF) que é responsável por fornecer o pacote javax.activation. Na versões Java SE 1.6 e superiores esse pacote já vem incluído. O JAF tem como objetivo unificar a forma de trabalhar com a multiplicidade de formatos de dados que estão disponíveis, sejam eles texto simples ou documentos extremamente complexos compostos de imagens, áudio, vídeo, etc. O JavaBeans Activation Framework trata-se portanto de uma extensão para o Java que os desenvolvedores podem utiliza-lo para usufruir de alguns serviços.

Bibliografia

[1] Microsoft Exchange Server 2010. Disponível em www.microsoft.com/exchange/2010/pt/br/

[2] The JavaMail Home Page. Disponível emhttp://java.sun.com/products/javamail/