dominios y alojamiento web en hostalia

Envío de mesajes de correo electrónico mediante librerías JavaMail

08 de noviembre de 2005
Valoración del artículo:
Método para el envío de un mesanje de correo electrónico a través de JSP.
Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.
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.

Compartir en redes sociales

Comentarios
Fueron enviados 23 comentarios al artículo
5 comentarios no revisados
18 comentarios revisados:
Por: omar
08/8/2006
Como puedo enviar correos con caractéres especiales. MimeBodyPart lobMimeBodyPart1 = new MimeBodyPart(); lobMimeBodyPart1.setText(mstMensaje,"ISO_8859-1"); lobMimeBodyPart1.setContentLanguage(new String[]{"es","en"}); El cuerpo del correo se despliega correctamente, pero el subject, si tiene caracteres especiales, no se muestran bien. Alguien podría ayudarme?
Por: Margarita
02/11/2007
Hola!!
He tratado de implementar el ejemplo pero me da false no sè donde esta el error, he insertado la librería de JavaMail en el proyecto, estoy trabajando con Netbeans y java sun aplication server
Por: Marman
10/12/2007
Hola, he estado investigando ultimamente en como enviar un correo, tu ejemplo me parece bastante interesante, lo trate de implementar en una aplicacion de java, estoy utilizando netbeans, ya inclui las librerias de javaMail y todo sale perfecto, en el servidor SMTP coloque como ejemplo uno de hotmail mx4.hotmail.com, pero al momento de enviar el correo me sale esta excepcion

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: javax/activation/DataSource

No se que estoy haciendo mal podrias ayudarme ? la parte donde ejecuto el metodo send esta asi:

boolean sw = send.send("mx4.hotmail.com", "mar_mantilla@hotmail.com", "mar_mantilla@hotmail.com", "mar_mantilla@hotmail.com", "mar_mantilla@hotmail.com", "PROBANDO MAIL", false, new StringBuffer("HOLA!!!!"), false);


Me podrias ayudar es que llevo bastante rato averiguando sobre el tema y no he podido solucionar el problema.

si quieres me contestas al mail que deje ahi...
Por: Kike
17/12/2008
Muy bueno tio!!!!!!! los correos ya se envían como la seda...un abrazo!
Por: Paty
27/2/2009
Hola, ejecute su ejemplo y funcionó correctamente. Gracias.
Problemas
Por: Antonio Quintero
03/5/2009
Amigos, he hecho tus pasos, pero no me compila la clase, debe ser que estoy haciendo las cosas mal, ¿podrías ayudarme por favor?

Me cuesta trabajo java, pero quiero aprenderlo.
MUY BUENO
Por: GUSTAVO
15/6/2009
MUY BUENO TIO.
SOLA UNA CONSULTA COMO PUEDO INGRESAR ENTER OSEA SALTO DE LINEA??
a mi no me funciono
Por: Idalia
22/6/2009
estoy comenzando con esto del Java, y quise hacer un ejemplo de estos, me dicen que son basicos..

el chiste es estoy utilizando myeclipse y no vi nada de respuesta, de hecho habia una palabra subrayada en rojito ms.send.


para comenzar ha hacer el ejemplo con html como le hago, creo un JSP o una paguna html y como las ligo?


Gracias!!
Error al ejecutarlo.
Por: Alberto
29/7/2009
Al ejecutarlo me da el siguiente error:

29-jul-2009 13:11:39 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() para servlet jsp lanzó excepción
java.lang.NoClassDefFoundError: javax/activation/DataSource
at es.mapa.Registroplu.util.MailSender.send(MailSender.java:43)
..........
Este error es en la linea: MimeMessage msg = new MimeMessage(session);
¿Qué puede ser?
Un saludo y gracias de antemano.
Muy Bien
Por: Bogotano
23/11/2009
Lo probe y funciono correctamente esta muy bien explicado. Gracias Por tu ayuda
Java Mail
30/11/2009
Para poder enviar un Mail desde Cualquier aplicacion Java, 1.- deves tener isntalado un servidor 2.- Deves configurar ambos, tanto tu aplic java como el servidor... chequenlo en este link, si tienes dudad me preguntas... http://mundopc.net/freeware/articulos/mercury/ atte: Hibis
envio de mensaje
Por: LEONARDO
18/1/2010
Excelente aporte.......
tengo un problema.....
si podrian ayudarme mil gracias....
ANTECEDENTES
estoy desarrollando una aplicacion WEB bajo linux OBUNTU con netbeans y mysql...... en una parte de aplicacion necesito que las sugerencias sean enviadas a una direccion de correo.
PROBLEMA.
>> MailSender.send() error = javax.mail.MessagingException: Unknown SMTP host: smtp.zzz.com.ar;
nested exception is:
java.net.UnknownHostException: smtp.zzz.com.ar
Resultado del envío del mensaje : false

PREGUNTA.
1. necesariamente tengo que instalar y configurar un servidor de correo
2. cual es ese servidor de correo para linux (de preferencia multi plataforma).
3. donde puedo bajar mencionados servidores y tutoriales del mismo

desde ya le quedo eternamente agradecido

jorge_l...
Error
17/3/2010
Hola Amigo

Implemente tu codigo y me sale un error al momento de ejecutarlo y es el siguiente:

MailSender.send() error = com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first

Si depronto me puedes colaborar con esto te agradezco mucho. Yo lo que pienso es que el error corresponde a que el STMP es de hotmail por lo tanto necesita que ingrese el usuario y contraseña... no se si sea esto

Muchas gracias.
consulta
Por: Gustavo
19/3/2010
Hola; estuve implementando el ejemplo y logro enviar emails a cuentas internas del MS Outlook, pero cuando intento enviar a cuentas externas sucede un error: >> MailSender.send() error = javax.mail.SendFailedException: Invalid Addresses;
nested exception is:
com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 Unable to relay
for accion_erp@yahoo.com.ar

Resultado del envÝo del mensaje : false

Si alguien tuviera una sugerencia le agradecería su ayuda.

Saludos, Gustavo.
Envio Mail : plantilla, texto plano y Archivo adjunto
Por: Miguel
26/4/2010
hola la verdad estoy un poco complicado con este tema en algunos webmails o clientes de correo tengo el siguiente problema necesito enviar un mail con plantilla html y ademas texto plano y tambien un file adjunto la idea es q si por esas casualidades el cliente mail no pueda leer plantillas use la info de texto plano pero a la vez los clientes q si lo pueden hacer solo puedan leer la plantilla html:

hasta el momento lo q me sale en gmail leo la plantilla y el texto plano
cosa q solo podria leer la plantilla

y en otro webmail leo el msj con la plantilla pero me aparece como archivo adjunto el texto plano y el file adjunto

aaaaaaarrrrrrrrrrrrrr,,, alguna sujerencia alguien tuvo algun drama como este???
Resolver un error
Por: Uriel
06/6/2010
me aparece el sig error: ¿Alguien podria ayudarme porfavor? , aparece cuando intento enviar el correo, ya instale el javamail y todo. gracias por la ayuda
Ha tenido lugar un error en la línea: 3 en el archivo jsp: /prueba.jsp
MailSender cannot be resolved to a type
1: <%@ page language="java" %>
2: <% java.util.ArrayList MailSender = new java.util.ArrayList();
3: MailSender ms = new MailSender();
4:
5: boolean result = ms.send("smtp.zzz.com.ar","yo@midominio.com",
6: "tu@midominio.com","cc@midominio.com", "bcc@midominio.com" ,
Enviar Email desde JAVA
Por: sub7
03/11/2010
Esta tarde me puse y al final lo saqué, os dejo el link con el paquete compilado en .jar para que lo ejecuteis y tambien os dejo el codigo en un archivo de tecto.

Yo trabajo con linux, alomejor si abrís el archivo de texto en windows no se ve bien.

http://www.gigasize.com/get.php?d=mtb8o8zf2xc
Un saludo.
Problemas con el código
Por: David
16/1/2011
Hola.

En la siguiente línea:
MimeMessage msg = new MimeMessage(session);
me da el siguiente error:

java.lang.NoClassDefFoundError: javax/activation/DataSource

Tengo las siguientes librerias:
dsn.jar
imap.jar
mailapi.jar
pop3.jar
smtp.jar

No tengo idea de lo que puede pasar

Alguna sugerencia?
Gracias.

Manuales relacionados
Categorias relacionadas
El autor
Lectura recomendada
Compra este libro en Agapea, la librería urgente a domicilio.
Últimas noticias
Donaciones
Si piensas que te hemos ayudado y merecemos tu apoyo económico...