Back-End

6 ago, 2009

Envio de e-mail utilizando JavaMail

Publicidade

Olá, amigos! Estive desenvolvendo uma aplicação e me deparei com o problema de enviar e-mail utilizando o JavaMail. Há bastante material na internet mas é muito complicado encontrar algum que explique passo a passo, de forma visual e didática, como utilizar o JavaMail em sua aplicação.

Assim, hoje vou apresentar a vocês um exemplo de como enviar e-mail utilizando a API JavaMail. Neste exemplo em especial eu utilizarei o servidor de e-mails do GMail.

Antes de abordar o exemplo com JavaMail, é interessante aprendermos um pouco sobre esta API, sobre a Arquitetura de Sistemas de e-mail e os protocolos envolvidos nessa arquitetura.

O que é JavaMail?

O JavaMail oferece uma API independente de plataforma e independente de protocolo para criar mensagens de correio e aplicações. A API JavaMail está disponível como um pacote opcional para uso com a plataforma Java SE e está também incluída na plataforma Java EE.

Esta API possui implementações para alguns dos protocolos mais populares para envio e recebimento de e-mails e fornece um forma bem fácil de usá-los.

Embora o JavaMail seja uma das APIs da Sun, ela não é incluída nos downloads do SDK. Dessa forma, você deverá obter os arquivos da API JavaMail, e integrá-los à sua aplicação.

Onde obter os arquivos?

Os arquivos da API podem ser baixados do site da Sun. Neste nosso exemplo eu utilizarei o JavaMail API 1.4.2 Release e o JavaBeans Activation Framework (JAF).

É importante ressaltar que sem o JAF o JavaMail não funcionará.

Quando você baixar os arquivos do site da Sun, eles virão compactados em um .zip. Dentro do .zip há dois arquivos importantes que utilizaremos neste exemplo: mail.jar e activation.jar.

A Sessão

A Sessão possui dois papéis importantes:

  • guardar propriedades acessíveis via construtores
  • oferecer métodos de fábrica para objetos Store e Transport

Temos dois tipos de objetos Session:

  • Session session = Session.getDefaultInstance(props)
  • Session session Session.getInstance(props)

Os autenticadores são passados como parâmetro nos métodos getInstance()

public class MyAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("scott", "tiger");
}
}
(...)
Properties props = System.getProperties();
Session session = Session.getDefaultInstance(props, new MyAuthenticator());

As Mensagens

As mensagens são encapsuladas na classe abstrata Message, que possui:

  • Conjunto de cabeçalhos RFC822 (Headers)
  • Conteúdo (javax.activation.DataHandler)

Há métodos get/set para conteúdo e cabeçalhos.

O JavaMail traz uma implementação da classe abstrata Message: MimeMessage

Message msg = new MimeMessage(session);

Destinos e origens são definidos em objetos do tipo Address e adicionados nos cabeçalhos To e From

msg.setFrom(new InternetAddress("fulanodestino.org"));
msg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(recv, false));
msg.setSubject("JavaMail Test Message");
msg.setHeader("X-Mailer", "My Simple JavaMail Client");
msg.setText("This is the sample message text");

Envio de Mensagens

Depois de criada a mensagem, basta passá-la para um meio de transporte para enviá-la. A forma mais simples de fazer é passar para o método (estático) send(), de javax.mail.Transport.

Transport.send(msg);

Pode-se também controlar o tipo de transporte usado (de acordo com o protocolo)

Transport smtp = session.getTransport(“smtp”);

smtp.send(msg);

Transport nntp = session.getTransport(“nntp”);

nntp.send(msg);

Protocolos Envolvidos em uma Arquitetura de Sistemas de E-mail

Neste artigo discutiremos três protocolos para envio e recebimento de e-mails: SMTP, POP3 e IMAP.

Estes protocolos fazem parte da camada de aplicação de uma rede de computadores.

O termo camada de aplicação é um termo utilizado em redes de computadores para designar a sétima camada do modelo OSI (Open Systems Interconnection – Interconexão de Sistemas Abertos). É responsável por prover serviços para aplicações de modo a abstrair a existência de comunicação em rede entre processos de diferentes computadores. Também é a camada número quatro do modelo TCP/IP que engloba também as camadas de apresentação e sessão no modelo OSI.

Protocolo SMTP

SMTP é a sigla para Simple Mail Transfer Protocol (Protocolo de Transferência de Correio Simples) e está definido na RFC 2821.

Ele é usado na comunicação direta entre servidores de correio e para o envio de mensagens a partir do seu software cliente de e-mail. O SMTP é um protocolo de “uma via” – isto é, as mensagens podem ser enviadas ou recebidas pelo servidor de correio, mas não é possível obter as mensagens em qualquer outro servidor de correio com o uso deste protocolo.

Para isso, é necessário um cliente de email com suporte ao protocolo POP3 ou IMAP.

Protocolo POP3

POP3 é a sigla para Post Office Protocol e está definido na RFC 1225. O número “3” significa que é a terceira revisão da norma.

Este protocolo é utilizado no acesso remoto a uma caixa de correio eletrônico e permite que todas as mensagens contidas em uma caixa de correio eletrônico possam ser transferidas sequencialmente para um computador local.

Protocolo IMAP

IMAP é a sigla para Internet Message Access Protocol e está definido na RFC 3501.

Ele é um protocolo de gerenciamento de correio eletrônico superior em recursos ao POP3 – protocolo que a maioria dos provedores oferece aos seus assinantes. A última versão é o IMAP4.

O mais interessante é que as mensagens ficam armazenadas no servidor e o internauta pode ter acesso a suas pastas e mensagens em qualquer computador, tanto por webmail como por cliente de correio eletrônico (como o Outlook Express ou o Evolution). Outra vantagem deste protocolo é o compartilhamento de caixas postais entre usuários membros de um grupo de trabalho. Além disso, é possível efetuar pesquisas por mensagens diretamente no servidor, utilizando palavras-chaves.

Assim, podemos ilustrar a Arquitetura de Sistemas de E-mail com a seguinte Figura:

Há alguns artigos aqui no iMasters que podem ajudar a entender melhor esses protocolos:

O modelo OSI e suas sete camadas

IMAP4 e POP3 – qual a melhor solução?

O Exemplo!

Neste exemplo, vamos usar uma aplicação web e realizar o envio através de uma página .jsp. Então, vamos lá!

Primeira Etapa – Criando uma aplicação web no NetBeans

  • Abra o seu NetBeans;
  • Vá em File > New Project;

A tela exibida será a seguinte:

  • Selecione em Categories a categoria Web e em Projetcs, Web Application.
  • Nomeie o seu Projeto, no meu caso ProjetoEmail.
  • Selecione como Server o Apache Tomcat.
  • Clique em Finish.

Segunda Etapa – Importação dos arquivos para a aplicação

Vamos então importar os arquivos do JavaMail à aplicação antes de criar a classe.

  • Clique com o botão direito na pasta Libraries de seu Projeto
  • Selecione Add JAR/Folder…
  • Encontre, um por vez, os arquivos mail.jar e activation.jar
  • Lembre-se, basta descompactar a pasta baixada do site da Sun!

Terceira Etapa – Criando a Classe de E-mail

  • Vá na pasta Source Packages de seu Projeto
  • Clique com o botão direito
  • Crie um novo Java Package chamado com.projetoemail.email

Dentro do pacote criado, crie uma classe java chamada SendMail e insira o código abaixo:

package com.projetoemail.email;

import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;


//clase que retorna uma autenticacao para ser enviada e verificada pelo servidor smtp
public class SendMail {

private String mailSMTPServer;
private String mailSMTPServerPort;

/*
* quando instanciar um Objeto ja sera atribuido o servidor SMTP do GMAIL
* e a porta usada por ele
*/
public SendMail () { //Para o GMAIL
mailSMTPServer = "smtp.gmail.com";
mailSMTPServerPort = "465";
}
/*
* caso queira mudar o servidor e a porta, so enviar para o contrutor
* os valor como string
*/
public SendMail (String mailSMTPServer, String mailSMTPServerPort) { //Para outro Servidor
this.mailSMTPServer = mailSMTPServer;
this.mailSMTPServerPort = mailSMTPServerPort;
}

public void sendMail(String from, String to, String subject, String message) {

Properties props = new Properties();

// quem estiver utilizando um SERVIDOR PROXY descomente essa parte e atribua as propriedades do SERVIDOR PROXY utilizado
/*
props.setProperty("proxySet","true");
props.setProperty("socksProxyHost","192.168.155.1"); // IP do Servidor Proxy
props.setProperty("socksProxyPort","1080"); // Porta do servidor Proxy
*/

props.put("mail.transport.protocol", "smtp"); //define protocolo de envio como SMTP
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.host", mailSMTPServer); //server SMTP do GMAIL
props.put("mail.smtp.auth", "true"); //ativa autenticacao
props.put("mail.smtp.user", from); //usuario ou seja, a conta que esta enviando o email (tem que ser do GMAIL)
props.put("mail.debug", "true");
props.put("mail.smtp.port", mailSMTPServerPort); //porta
props.put("mail.smtp.socketFactory.port", mailSMTPServerPort); //mesma porta para o socket
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");

//Cria um autenticador que sera usado a seguir
SimpleAuth auth = null;
auth = new SimpleAuth ("seu_emailgmail.com","sua_senha");

//Session - objeto que ira realizar a conexão com o servidor
/*Como há necessidade de autenticação é criada uma autenticacao que
* é responsavel por solicitar e retornar o usuário e senha para
* autenticação */
Session session = Session.getDefaultInstance(props, auth);
session.setDebug(true); //Habilita o LOG das ações executadas durante o envio do email

//Objeto que contém a mensagem
Message msg = new MimeMessage(session);

try {
//Setando o destinatário
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
//Setando a origem do email
msg.setFrom(new InternetAddress(from));
//Setando o assunto
msg.setSubject(subject);
//Setando o conteúdo/corpo do email
msg.setContent(message,"text/plain");

} catch (Exception e) {
System.out.println(">> Erro: Completar Mensagem");
e.printStackTrace();
}

//Objeto encarregado de enviar os dados para o email
Transport tr;
try {
tr = session.getTransport("smtp"); //define smtp para transporte
/*
* 1 - define o servidor smtp
* 2 - seu nome de usuario do gmail
* 3 - sua senha do gmail
*/
tr.connect(mailSMTPServer, "seu_emailgmail.com", "sua_senha");
msg.saveChanges(); // don't forget this
//envio da mensagem
tr.sendMessage(msg, msg.getAllRecipients());
tr.close();
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println(">> Erro: Envio Mensagem");
e.printStackTrace();
}

}
}
class SimpleAuth extends Authenticator {
public String username = null;
public String password = null;


public SimpleAuth(String user, String pwd) {
username = user;
password = pwd;
}

protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication (username,password);
}
}

Há dois lugares desta classe que você precisará colocar o seu usuário e sua senha do GMail.

Nestes dois lugares eu coloquei “seu_emailgmail.com” e “sua_senha”.

Quarta Etapa – Criando o arquivo JSP

Vá na pasta Web Pages e edite o arquivo index.jsp, ou crie um outro arquivo, com o seguinte código:

< page import="com.projetoemail.email.*" >
<
SendMail mail = new SendMail();

try {
mail.sendMail("seu_emailgmail.com", "email_destinodestino.com.br", "TESTE JAVAMAIL", "TESTE");
} catch (Exception e) {
e.printStackTrace();
}
>

Está Pronto!

A partir de agora você consegue enviar e-mail via aplicação acessando o seu GMail.

Até breve!