> Manuales > Ayudas técnicas

Método para el envío de un mensaje de correo electrónico a través de JSP.

JavaMail es una API que se puede descargar libremente del sitio de la Sun http://java.sun.com/products/javamail/.
Esta muy bien documentada y provee todas las clases necesarias para gestionar servicios de corre electrónico.
En este caso haremos una clase simple para el envió de mensajes. Luego veremos la implementación dentro de una pagina jsp.

Comenzamos entonces por escribir el código de la clase, para luego explicarla en detalle:

package notas;

import java.util.Properties;
import java.util.Date;
import javax.mail.Session;
import javax.mail.Message;
import javax.mail.Transport;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.InternetAddress;

/**
* <p>Title: MailSender</p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: </p>
*
* @author Fernando Arturi
* @version 1.0
*/

public class MailSender {

    public MailSender() {
   }
   public static boolean send(String hostSmtp, String senderAddress, String toAddress,
       String ccAddress, String bccAddress, String subject,
       boolean isHTMLFormat, StringBuffer body, boolean debug){

   MimeMultipart multipart = new MimeMultipart();

   Properties properties = new Properties();

    properties.put("mail.smtp.host", hostSmtp);
   Session session = Session.getDefaultInstance(properties, null);
   session.setDebug(debug);
   try {
      MimeMessage msg = new MimeMessage(session);
      msg.setFrom(new InternetAddress(senderAddress));
      msg.setRecipients(Message.RecipientType.TO, toAddress);
      msg.setRecipients(Message.RecipientType.CC, ccAddress);
      msg.setRecipients(Message.RecipientType.BCC, bccAddress);
      msg.setSubject(subject);
      msg.setSentDate(new Date());

      // BODY
      MimeBodyPart mbp = new MimeBodyPart();
      if(isHTMLFormat){
         mbp.setContent(body.toString(), "text/html");
      }
      else{
         mbp.setText(body.toString());
      }

      multipart.addBodyPart(mbp);

      msg.setContent(multipart);
      Transport.send(msg);
   }
   catch (Exception mex){
      System.out.println(">> MailSender.send() error = "+mex );
      return false;
   }
   return true;
  }

}


1) Comenzamos por definir un package, es decir un grupo de clases, aunque en este caso será solamente una. Después importamos todas las clases que nos sirven, es importante agregar las librerias JavaMail ya sea al entorno de desarrollo como a nuestro sitio jsp (carpeta \WEB-INF\lib).

package notas;

import java.util.Properties;
import java.util.Date;
import javax.mail.Session;
import javax.mail.Message;
import javax.mail.Transport;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.InternetAddress;

2) Denominamos la clase MailSender, y creamos un constructor que, en este caso, no hace nada. Todas las variables que nos sirven las utilizaremos directamente en la función send.

public class MailSender {

   public MailSender() {

  }


3) Definimos la función estática send que, a través de los parámetros recibidos, permite de enviar el mensaje. Dichos parámetros son:
hostSmtp : Servidor de correo en salida (smtp).
senderAddress: la dirección de correo de la persona que envía el mensaje.
toAddress : la dirección de correo de la persona que recibirá el mensaje.
ccAddress : la dirección de correo de la persona que recibirá el mensaje en copia.
bccAddress: la dirección de correo de la persona que recibirá el mensaje en copia oculta.
subject : Titulo del mensaje.
isHTMLFormat : variable booleana que indica si el mensaje es con formato HTML o texto simple.
body = cuerpo del mensaje.
debug = variable booleana que indica a la API si debe hacer el "debugging", es decir, una serie de mensajes detallando cada paso que se ejecuta. Esta variable seguramente será igual a true durante los primeros usos de la clase, luego no tiene mucho sentido dejarla activa.

public static boolean send(String hostSmtp, String senderAddress,
String toAddress, String ccAddress, String bccAddress,
String subject, boolean isHTMLFormat, StringBuffer body,
boolean debug){


4) Comienza la ejecución de la función. Instanciamos los objetos MimeMultipart y Properties y Session, y luego se ejecutan los comandos correspondientes.

MimeMultipart multipart = new MimeMultipart();
Properties properties = new Properties();
properties.put("mail.smtp.host", hostSmtp);
Session session = Session.getDefaultInstance(properties, null);
session.setDebug(debug);


5) Inicializo el mensaje y le asigno las variables que necesita.

try {
    MimeMessage msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress(senderAddress));
    msg.setRecipients(Message.RecipientType.TO, toAddress);
    msg.setRecipients(Message.RecipientType.CC, ccAddress);
    msg.setRecipients(Message.RecipientType.BCC, bccAddress);
   msg.setSubject(subject);
   msg.setSentDate(new Date());

6) Procesamos el cuerpo del mensaje (MimeBodyPart). Notar que, dependiendo el tipo de mensaje, debo usar las funciones setText o setContent. Luego se inserta la variable mbp al mensaje.

// BODY
MimeBodyPart mbp = new MimeBodyPart();
if(isHTMLFormat){
    mbp.setContent(body.toString(), "text/html");
}
else{
    mbp.setText(body.toString());
}

multipart.addBodyPart(mbp);
msg.setContent(multipart);


7) Envío del mensaje.

Transport.send(msg);

Si el método se ejecuta satisfactoriamente, la clase retornara true. Caso contrario, se ejecutara el bloque catch, que imprime un mensaje por la consola indicando el tipo de error, y luego retorna false.

catch (Exception mex){
   System.out.println(">> MailSender.send() error = "+mex );
   return false;
}

return true;

8) Finalmente, una pagina jsp para probar la clase:

<%@ page language="java" %>
<%@ page import = "notas.MailSender"%>
<%
MailSender ms = new MailSender();

boolean result = ms.send("smtp.zzz.com.ar","yo@midominio.com",
"tu@midominio.com","cc@midominio.com", "bcc@midominio.com" ,
"mail de prueba", false, new StringBuffer("hola"),true);

out.print("Resultado del envío del mensaje : " + result);
%>

Al final, imprime por pantalla el resultado (true o false) del envío del mensaje.

Fernando Arturi

Manual