Pular para o conteúdo principal

Como enviar emails usando JavaMail

Neste post, vou apresentar como enviar um email através de uma servlet. 

Como de costume, criamos um projeto web dinâmico no eclipse, com, por exemplo, o nome "EnviarEmailServlet".

Para implementar este tutorial será necessária  a biblioteca JavaMail. A biblioteca pode ser encontrada no site da OracleNota: A menos que você esteja usando Java SE 6 ou mais recente, você também vai precisar da JavaBeans Activation Framework (JAF) que fornece o pacote javax.activation.

Depois de fazer o download, copie o arquivo mail.jar para a pasta lib do seu projeto.

O código-fonte da página index.jsp que contém o formulário para o envio do e-mail é:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>Enviar E-Mail</title>
</head>
<body>

    <h1>Enviar E-Mail</h1>
    <form action="sendEmail.do" method="post">
        <table>
            <tr>
                <td>De</td>
                <td><input type="text" name="from" /></td>
            </tr>
            <tr>
            <tr>
                <td>Para</td>
                <td><input type="text" name="to" /></td>
            </tr>
            <tr>
                <td>Assunto</td>
                <td><input type="text" name="subject" /></td>
            </tr>
            <tr>
                <td>Mensagem</td>
                <td><textarea cols="25" rows="8" name="message"></textarea></td>
            </tr>
        </table>
        <br /> <input type="submit" value="Enviar" />
    </form>
</body>
</html>

Para receber estes parâmetros e enviar o e-mail devemos implementar uma servlet. Esta servlet vai se chamar SendEmail. Eu sobrescrevi o método init() da servlet para pegar os parâmetros necessários para o envio do email. A servlet deve conter o seguinte código:

package org.andvicoso.javamail.controller;

import java.io.IOException;
import java.util.Date;
import java.util.Properties;

import javax.mail.AuthenticationFailedException;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/sendEmail.do")
public class SendEmail extends HttpServlet {

    private static final String MSG_MIME_TYPE = "text/plain";

    private String host;
    private String port;
    private String login;
    private String password;

    @Override
    public void init() throws ServletException {
        ServletContext context = getServletContext();
        host = context.getInitParameter("host");
        port = context.getInitParameter("port");
        login = context.getInitParameter("login");
        password = context.getInitParameter("password");
    }

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        String resultMsg = "E-Mail enviado com sucesso!";
        String from = request.getParameter("from");
        String to = request.getParameter("to");
        String subject = request.getParameter("subject");
        String message = request.getParameter("message");

        try {
            Properties props = getSMTPProperties();

            Authenticator auth = new SMTPAuthenticator(login, password);

            Session session = Session.getInstance(props, auth);

            MimeMessage msg = createMessage(from, to, subject, message, session);

            Transport.send(msg);
        } catch (AuthenticationFailedException ex) {
            resultMsg = "Falha na autenticação";
        } catch (AddressException ex) {
            resultMsg = "E-Mail de destino inválido!";
        } catch (MessagingException ex) {
            resultMsg = ex.getMessage();
            //ex.printStackTrace();//descomentar para debug
        }

        request.setAttribute("message", resultMsg);

        RequestDispatcher dispatcher = request
                .getRequestDispatcher("result.jsp");
        dispatcher.forward(request, response);
    }

    private MimeMessage createMessage(String from, String to, String subject,
            String message, Session session) throws MessagingException {
        MimeMessage msg = new MimeMessage(session);
        msg.setText(message);
        msg.setSubject(subject);
        msg.setFrom(new InternetAddress(from));
        msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
        msg.setContent(message, MSG_MIME_TYPE);
        msg.setSentDate(new Date());

        return msg;
    }

    private Properties getSMTPProperties() {
        Properties props = new Properties();
        props.setProperty("mail.host", host);
        props.setProperty("mail.transport.protocol", "smtp");
        // Comente essas 4 linhas abaixo se deseja usar o SSL
        props.setProperty("mail.smtp.auth", "true");
        props.setProperty("mail.smtp.port", port);
        props.setProperty("mail.smtp.ssl.trust", host);
        props.setProperty("mail.smtp.starttls.enable", "true");
        // Descomente essas tres linhas abaixo se deseja usar SSL
//         props.setProperty("mail.smtps.auth", "true");
//         props.setProperty("mail.smtps.port", port);
//         props.setProperty("mail.smtps.ssl.trust", host);
        //Descomente a linha abaixo se deseja informações de debug
//        props.put("mail.debug", "true");

        return props;
    }

    private class SMTPAuthenticator extends Authenticator {
        private String login;
        private String password;

        public SMTPAuthenticator(String login, String password) {
            this.login = login;
            this.password = password;
        }

        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(login, password);
        }
    }
}

Se você preferir para criptografar suas conexões com SSL, então certifique-se de suas propriedades incluam SMTPS em vez de SMTP e que a propriedade mail.smtps.ssl.trust seja definida.

Para enviar e-mail para vários destinatários apenas adicionar mais endereços através do método  addRecipient.

Para anexar um ou mais arquivos no e-mail devemos alterar o tipo do conteúdo do e-mail para MimeMultipart na função createMessage.

Segue o código para isso:

    // cria uma parte do corpo da mensagem como sendo o texto
    MimeBodyPart messageBodyPart = new MimeBodyPart();
    // preenche a mensagem do e-mail
    messageBodyPart.setText(message);

    Multipart multipart = new MimeMultipart();
    multipart.addBodyPart(messageBodyPart);

    // a segunda parte do corpo é o anexo
    messageBodyPart = new MimeBodyPart();
    DataSource source = new FileDataSource(fileAttachment);//esse fileAttachment é caminho para o arquivo!
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(fileAttachment);
    multipart.addBodyPart(messageBodyPart);

    // seta o conteúdo da mensagem como sendo o multipart criado (texto+arquivo)
    msg.setContent(multipart);//ao invés de msg.setContent(message, MSG_MIME_TYPE);

Uma outra ideia interessante é usar um arquivo properties para armazenar as propriedades do servidor SMTP.

Para armazenar os parâmetros necessários para a conexão com o servidor SMTP eu adicionei parâmetros de contexto no web.xml. Desta maneira:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>JavaMail</display-name>

    <!-- SMTP settings -->
    <context-param>
        <param-name>host</param-name>
        <param-value>smtp.gmail.com</param-value>
        <!-- ou outro se não for gmail -->
    </context-param>

    <context-param>
        <param-name>port</param-name>
        <param-value>587</param-value>
        <!-- O padrão é 25. Podemos usar a 26 se o ISP bloquear a 25 -->
    </context-param>

    <context-param>
        <param-name>login</param-name>
        <param-value>abc@gmail.com</param-value>
        <!-- ou outro email se não for gmail -->
    </context-param>

    <context-param>
        <param-name>password</param-name>
        <param-value>abc</param-value>
        <!-- colocar a senha do email -->
    </context-param>

    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

Altere os valores parâmetros no web.xml para os seus valores e depois é só testar!

Para este exemplo também é possível encontrar um projeto exemplo no meu dropbox.

Até o próximo post!

[]`s

Comentários

Postagens mais visitadas deste blog

Como fazer upload e download de arquivos usando Servlet e JSP

Este post vai apresentar como implementar um  upload e download de arquivos usando Servlets, JSP, JSTL, EL e o padrão MVC. Para este exemplo, vou criar um projeto web dinâmico no Eclipse. Eu não vou especificar um banco de dados, o código deve funcionar com qualquer banco relacional. Para implementar o exemplo precisamos de quatro bibliotecas adicionais, sendo duas da Apache: http://commons.apache.org/fileupload/ http://commons.apache.org/io E para usar o JSTL precisamos de mais duas bibliotecas adicionais, a API e a implementação. Ambos podem ser encontrados no link: http://jstl.java.net/download.html Baixe todas as bibliotecas e adicione na pasta lib dentro de WebContent . A pasta lib também deve conter o conector para o banco de dados utilizado. Upload A página de envio deve conter um formulário com os campos necessários e mais um campo de input type file para o upload. No exemplo a seguir, vou mostrar o formulário com apenas dois campos:  input type =" file

Bye Bye JavaFX Scene Builder, Bem-vindo Gluon Scene Builder 8

Desde Java 8u40 a Oracle anunciou que o Scene Builder só será liberado como código-fonte dentro do projeto OpenJFX. A Oracle não irá mais fornecer os instaladores. O que é uma pena, era muito fácil instalar e trabalhar com Scene Builder especialmente para os novatos em JavaFX, mas o novo Gluon resolve este problema. Eles irão fornecer compilações do Scene Builder como antes, como instaladores para Max OS X, Linux, Windows ou simplesmente como um jar executável. O que significa para os desenvolvedores JavaFX e especialmente para iniciantes? Nada até agora. Você simplesmente tem que baixar página de Gluon Scene Builder em vez do Oracle. Todo o resto é a mesma coisa de antes. A atualização de Scene Builder 2.0 para o Gluon Scene Builder 8.0.0 é bastante fácil. Você tem que instalá-lo via .deb ou outro. Não importa se você já tem um instalação do Scene Builder em sua máquina. Ele simplesmente vai ser atualizado. Temos que agradecer a Gluon por fornecer e apoiar esta grande ferramen

Introdução ao Maven

Pessoal, acabei de adicionar duas apresentações no slideshare sobre Maven. Uma introdução ao Maven e outro falando um pouco de como usá-lo na prática. Só acessar: Introdução ao Maven e Maven na Prática . []s