Informações
| Tipo: | Tutorial |
|---|---|
| Data de Publicação: | 01/01/2004 |
| Revisado em: | 01/01/2004 |
Vote!
Tags Relacionadas
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:
- uma página html simples (preencheremail.html);
- uma página JSP (enviaremail.jsp);
- 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:
- uma página html simples (buscausuarios.html);
- duas página JSP (resultadobusca.jsp e enviaremailparalista.jsp);
- 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
