Informações

Tipo: Tutorial
Data de Publicação: 01/01/2004
Revisado em: 01/01/2004

Vote!

  • Currently 4,5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags Relacionadas

jsp

Comentários ( 9 )

Imprimir

Enviando Emails com JSP

por:

Ulisses Telemaco (ulisses@j2eebrasil.com.br)

O envio de email, nos dias de hoje, para quem utiliza a internet, é algo comum e corriqueiro. É bastante comum encontrarmos sites/homepages a partir da qual podemos enviar um email ou enviar aquela página html para um amigo. Vale citar o fato que o envio de email via páginas html/jsp pode ser uma excelente ferramenta para webmasters que precisam enviar periodicamente mensagem padrão para grupos de usuários.

Introdução

No decorrer deste tutorial trataremos dois exemplos: no primeiro, construiremos uma páginas jsp de onde será possível enviar emails; no segundo exemplo, faremos uma pequena aplicação que faz a leitura dos usuários de um banco de dados e envia uma mensagem personalizada para todos.

O envio do(s) email(s) será efetuado através da API JavaMail (http://java.sun.com/products/javamail/index.jsp), neste link tem algumas informações adicionais para o desenvolvimento de aplicações que enviem e recebam mensagems eletrônicas. Utilizando esta API você poderá fazer, por exemplo, seu próprio WebMail, personalizando-o da forma como desejar.

Antes de discutir códigos gostaria de fazer um comentário quanto aos mesmo. A principal meta desse texto é discutir uma solução para envio de emails utilizando a API JavaMail. Assim, vocês encontraram certas práticas - nas páginas JSP - adotadas somente para simplificar o nosso estudo sobre a API de envio de mensagens eletrônicas. O uso excessivo uso de código Java dentro das páginas JSP ao invés de componentes pode parecer estranho para um programador mais experiente. Se for o seu caso, não se preocupe, nosso foco será o componente de envio de email.

Enviando emails simples

Um dos mais simples exemplos de envio de email através de JSP pode ser implementado com três arquivos:

  1. uma página html simples (preencheremail.html);
  2. uma página JSP (enviaremail.jsp);
  3. uma classe Java (Email.java).

O primeiro destes, a página html, tem um formulário HTML com três objetos do tipo "TEXT", um do tipo "TEXTAREA" e um botão do tipo "SUBMIT" para enviar o formulário com os dados do email.

Os dados que forem preenchidos neste formulário serão tratados pelo processador de formulário da página JSP (enviaremail.jsp) que foi definido como o action do formulário.

<html>
<body>

<form action="enviaremail.jsp" method="post">
<table border="0" align="center" bgcolor="tan">
<tr>
<td><b>Para..:</b></td>
<td><input type="Text" name="para"</td>
</tr>
<tr>
<td><b>De..:</b></td>
<td><input type="Text" name="de"</td>
</tr>
<tr>
<td><b>Assunnto..:</b></td>
<td><input type="Text" name="assunto"</td>
</tr>
<tr>
<td colspan="2">
<textarea name="mensagem" rows=10 cols=45></textarea>
</td>
</tr>
</table>
<center> <input type="Submit" value="Enviar Email"></center>
</form>

</body>
</html>
Código do arquivo preencheremail.html

Abaixo segue o código da página JSP (enviaremail.jsp) com a lógica de programação responsável por criar e enviar o "email":

<html>
<body>

<%@ page import="jspbrasil.Email" %>
<jsp:useBean id="email" class="jspbrasil.Email"/>
<%
 try {
  String mailServer = "mail.seumailserver.com.br"
  String assunto = request.getParameter("assunto")
  String para = { request.getParameter("para") };
  String de = request.getParameter("de");
  String mensagem =request.getParameter("mensagem");
  email.sendSimpleMail(mailServer, assunto, para, de, mensagem);
%>
<p>Email enviado com Sucesso !!!</p>
<%
  }
  catch (AddressException e) { %>
    <p>Endereço de Email inválido</p>	
<%}%>
<%
  catch (MessagingException e) { %>
    <p>Impossível enviar o email.</p>	
<%}%>

</body>
</html>
Código do arquivo enviaremail.jsp

No arquivo acima, optamos por levantar as exceções na própria página jsp de onde se envia o email. Poderíamos, no entanto, ter definido uma página de erro para fazer este tratamento.

Genericamente, podemos classificar os erros decorrentes da tentativa em duas categorias: (1) endereço de email inválido ou (2) problemas com o servidor de email.

O código abaixo, ilustra o tratamento da exceção gerada na tentativa de enviar uma mensagem para um endereço inválido.

<%
	catch (AddressException e) { %>
<p>Endereço de Email inválido</p>	
<%}%>

No trecho de código seguinte fazemos o tratamento da exceção gerada pelo não envio da mensagem, essa exceção pode ser causada por vários problemas, tais como: problema no servidor de email, problemas na rede entre outros.

<%
	catch (MessagingException e) { %>
<p>Impossível enviar o email.</p>	
<%}%>

Se vocês perceberem, não fizemos muito até aqui. A página JSP, por exemplo, faz mininamente a leitura de informações enviadas a partir de um formulário, atribui os valores a algumas variáveis e então aciona o método de um objeto "Email". A lógica de envio do email está, portanto, concentrada nesse componente e é nele que iremos trabalhar agora.

Abaixo, mostraremos a listagem do método sendSimpleMail, que é o responsável por enviar o email. Neste método estão descritos os passos básicos para a construção de objetos e métodos necessários ao envio de um email.

package  jspbrasil;

import javax.mail.*;
import javax.mail.internet.*;
import.java.util.*;

public class Email {

/*
. . .
*/

public void sendSimpleMail (String mailServer, String subject,
                            String to,String from, String mensagem)
    throws AddressException, MessagingException {

Properties mailProps = new Properties();
//definição do mailserver

mailProps.put("mail.smtp.host", mailServer)

Session mailSession = Session.getDefaultInstance(mailProps, null);

//As duas linhas seguintes de código, colocam no
//formato de endereços, 
//supostamente válidos, de email os dados 
//passados pelos parâmetros to e from.
InternetAddress destinatario = new InternetAddress (to);
InternetAddress remetente = new InternetAddress (from);

//As duas linhas de código a seguir, são 
//responsáveis por setar os atributos e 
//propriedas necessárias do objeto message 
//para que o email seja enviado.
//inicialização do objeto Message 
Message message = new MimeMessage (mailSession);

//Definição de quem está enviando o email
message.setFrom(remetente);

//define o(s) destinatário(s) e qual o tipo do 
//destinatário.
//os possíveis tipos de destinatário: TO, CC, BCC
	
message.setRecipient( Message.RecipientType.TO, destinatário );
//definição do assunto do email
		
message.setSubject (subject);
//definição do conteúdo da mensagem e do 
//tipo da mensagem
	
message.setContent (mensagem.toString(), "text/plain");
//a linha de código seguinte é a responsável 
//pelo envio do email

Transport.send (message);
}

}
Código do arquivo Email.java

Enviando emails para uma lista de usuários

O segundo exemplo oferece uma funcionalidade nova: o envio de email para uma lista de endereços - ao contrário do exemplo anterior que fazia o envio para apenas um endereco eletrônico. No exemplo a lista de endereços é obtida a partir de uma consulta a uma base de dados. Contudo, a listagem de endereços pode ser obtida de diversas formas diferentes. Para implementar esse exemplo serão desenvolvidos 4 arquivos:

  1. uma página html simples (buscausuarios.html);
  2. duas página JSP (resultadobusca.jsp e enviaremailparalista.jsp);
  3. uma classe Java (Email.java) - modificada.

A solução proposta aqui funciona da seguinte forma: (A) A página HTML possui um formulário para a busca de usuários, nessa versão do programa será possível efetuar a busca utilizando apenas o campo "nome" como chave da consulta. (B) A 1a. página JSP processa a busca, lista os usuários encontrados e oferece ainda um formulário para o envio do email para todos os usuários listados na busca. (C) A 2a. página JSP tem uma papel semelhante a do exemplo anterior. Depois de receber os valores preenchidos no formulário de envio de email e setar algumas variáveis com esses valores, a página aciona o envio de emails. (D) Por fim, a classe Email.java terá que ser modificada para atender essa nova funcionalidade - envio de emails para uma lista de endereços.

<html>
<body>
<H3;>Busca de Usuários</H3;>
<form action="resultado.jsp" method="get">
<table border="0" align="center" bgcolor="tan">
<tr>
<td><b>Nome Usuário:</b></td>
<td><input type="Text" name="nome"</td>
</tr>
</table>
<center> <input type="Submit" value="Consultar"></center>
</form>

</body>
</html>
Código do arquivo buscausuarios.html
<html>
<body>

<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%
try {
    String name = request.getParameter("name");
    Class.forName("org.postgresql.Driver");
    Connection con = DriverManager.getConnection("jdbc:postgresql:j2eebrasil", "j2eebrasil", "j2eebrasil");
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery ("SELECT NAME, MAIL FROM USERS WHERE NAME LIKE = '%" +  name + "%');
    Vector names;
    Vector mails;
    while (rs.next()) {
        String n = rs.getString ("NAME");
        String m = rs.getString ("MAIL");
        names.addElement(n);
        mails.addElement(n);
    }
    rs.close();
    stmt.close();
    con.close();

    // ADICIONA LISTA DE EMAIL A SESSAO. SERA RECUPERADA NAS PROXIMAS PAGINA 
    // E SERA UTILIZADA NO ENVIO DA MENSAGEM
    session.setAttribute("mailUsers", mails);

} catch (SQLException sqle) {
    //...
}
%>

<H3>Usuários Encontrados</H3>

<table>
<tr>
<td>Nome</td>
<td>Mail</td>
</tr>

<%
Enumeration eNames = names.getElements();
Enumeration eMails = mails.getElements();
while(eNames.hasMoreElements() && eMails.hasMoreElements()){
%>
<tr>
<td><%= (String)eNames.nextElement() %></td>
<td><%= (String)eMails.nextElement() %></td>
</tr>
<% } %>

</table>

<hr>

<form action="enviaremailparalista.jsp" method="post">
<table border="0" align="center" bgcolor="tan">
<tr>
<td><b>De..:</b></td>
<td><input type="Text" name="de"</td>
</tr>
<tr>
<td><b>Assunnto..:</b></td>
<td><input type="Text" name="assunto"</td>
</tr>
<tr>
<td colspan="2">
<textarea name="mensagem" rows=10 cols=45></textarea>
</td>
</tr>
</table>
<center> <input type="Submit" value="Enviar Email"></center>
</form>

</body>
</html>
Código do arquivo resultadobusca.jsp

Alguns leitores devem ter se surpreendido com a quantidade de código Java contido nessa página. Normalmente códigos de acesso/manipulação de banco de dados são componentizados. No exemplo acima, essa prática apenas nos mantém no foco de nosso estudo - envio de emails. O que fizemos na página foi construir uma coleção de emails - Vector contendo todos os emails recuperados na consulta. Depois de construído, o Vector é colocado na sessão do usuário para uso posterior.

Agora vamos trabalhar no código da próxima página JSP (enviaremailparalista.jsp). A nossa tarefa agora é recuperar da sessão a coleção de emails contruída no passo anterior e usá-la no envio dos emails.

<html>
<body>

<%@ page import="jspbrasil.Email" %>
<jsp:useBean id="email" class="jspbrasil.Email"/>
<%
 try {
  String mailServer = "mail.seumailserver.com.br";
  String assunto = request.getParameter("assunto")
  String de = request.getParameter("de");
  String mensagem =request.getParameter("mensagem");
  Vector para = (Vector) session.getAttribute("mailUsers");
  email.sendMailList(mailServer, assunto, para, de, mensagem);
%>
<p>Email enviado com Sucesso !!!</p>
<%
  }
  catch (NullPointerException npe) { %>
    <p>//......</p>	
<%}%>
<%
  }
  catch (AddressException ae) { %>
    <p>Endereço de Email inválido</p>	
<%}%>
<%
  catch (MessagingException me) { %>
    <p>Impossível enviar o email.</p>	
<%}%>

</body>
</html>
Código do arquivo enviaremailparalista.jsp

O último passo agora é modificar a classe Email.java para adicionar uma nova funcionalidade - enviar email para uma lista de endereços. Perceba que não será necessário reescrever toda a classe. A alteração que iremos fazer consiste apenas em adicionar o método sendMailList() - destacado em negrito.

package  jspbrasil;

import javax.mail.*;
import javax.mail.internet.*;
import.java.util.*;

public class Email {

/*
. . .
*/

   public void sendSimpleMail (String mailServer, String subject,
                            String to,String from, String mensagem)
       throws AddressException, MessagingException {


   // CODIGO IDENTICO A LISTAGEM ANTERIOR... NAO SERA ALTERADO
   }


   public void sendMailList (String mailServer, String subject,
                             Vector to,String from, String mensagem)
       throws AddressException, MessagingException {
        // percorre a lista de enredecos e aciona o metodo implementado 
        // anteriormente
        Enumeration e = to.getElements();
        while(e.hasMoreElements()){
            (String)e.nextElement();
            sendSimpleMail(mailServer, subject, s, from, message);
        }
   }


}
Código do arquivo Email.java (Modificado)

Conclusão

Gostaria de deixar claro, mais uma vez, que o principal objetivo desse tutorial é discutir uma solução para envio de emails com Java/JSP e que o foco do texto foi na lógica de programção relacionada ao envio de mensagens eletônicas utilizando a API JavaMail. Como conseqüencia disso, vocês podem encontrar no texto algumas práticas/simplificicações que certamente não são usadas no desenvolvimento de um Sistema Coorporativo. O uso excessivo uso de código Java dentro das páginas JSP é uma prática evitada e a utilização de componentes - JavaBeans - é a resposta para esse tipo de problema. O principal produto desse texto é o componente Email.java. Entender como ele funciona e, possivelmente, contruir um componente customizado ao seu sistema é o principal desafio.

Lembro, ainda, que uma lida na API JavaMail ( http://java.sun.com/products/javamail/javadocs/index.html), é indispensável para quem pretende fazer algo mais elaborado relativo ao envio ou recebimento de emails. Boa sorte!!!


Comentários (9)

Ótimo tutorial !!!
postado por Vinicius Amorim em 24/10/2006 às 23:21
Excelente Tutorial. Já até gravei no meu pen driver para um possível uso no futuro. Parabéns!
postado por Daniel Brasil em 27/10/2006 às 23:21
BOA, tutorial arquivado!
postado por Luiz Claudio Maia em 07/12/2006 às 23:21
Ótimo tutorial, muito objetivo.
postado por Leo Carvalho em 29/06/2007 às 23:21
Ja salvei :) ... hehehehe
postado por Hospedagem em 23/07/2007 às 23:21
olá. sou principiante em Java e gostaria de aprender mais. Li um pequeno livro sobre Java e estou a tentar escrever um programa ou class de uma mercadoria ou produto. Estou com bastantes dificuldades, podem me ajudar, Por favor?
postado por Abrão Filipe João em 24/07/2007 às 23:21
mto bom um material mto rico parabéns
postado por leandro de godoy em 14/12/2007 às 23:21
Só fiquei com uma dúvida Ulisses. Em um outro tutorial sobre esse assunto a pessoa apenas comentou que era necessario ter um servidor SMTP instalado. No caso o JAMES da Apache. Aqui neste caso é necessario? Se sim, como instalá-lo e configurá-lo? Se puder acrescentar isso ao tutorial ficaremos grato.
postado por Ricardo Furlan em 18/03/2008 às 23:21
Muito! BOm!
postado por MarcelloMtv em 17/10/2008 às 23:21
Comente!

Observações

Os campos em negrito são obrigatórios.

Para evitar problemas, este espaço é moderado. Após o envio do comentário será necessário aguardar pela sua aprovação.