Sie sind auf Seite 1von 3

En este caso, hablar de un tema bastante til y es enviar correos electrnicos a travs de Java

con texto en formato html y con un archivo adjunto.


Para lograrlo, nos apoyaremos de la librera JavaMail. Una vez descargada ser necesario
agregarla a su proyecto para poder utilizarla.
Sin ms prembulos adjunto el cdigo fuente y lo comento para ver su funcionamiento:
Clase Mailer (contiene la funcin para mandar el correo):

package com.ea24.email;
package com.ea24.email;
import
import
import
import
import
import
import
import
import
import
import
import
import

java.awt.HeadlessException;
java.util.Properties;
javax.activation.DataHandler;
javax.activation.FileDataSource;
javax.mail.BodyPart;
javax.mail.Message;
javax.mail.MessagingException;
javax.mail.Session;
javax.mail.Transport;
javax.mail.internet.InternetAddress;
javax.mail.internet.MimeBodyPart;
javax.mail.internet.MimeMessage;
javax.mail.internet.MimeMultipart;

/**
*
* @author ea24
*/
public class Mailer {
Properties mailProps;
public Mailer(Properties mailProps) {
this.mailProps = mailProps;
}
public boolean sendMail(String user, String pass, String recipient) {
try {
Session session = Session.getDefaultInstance(mailProps, null);
session.setDebug(true);
//Se compone la parte del texto
BodyPart text = new MimeBodyPart();
text.setContent("\n"
+ "<h2>
<span style="color: red;">Comunicndose desde Java</span></h2>
\n"
+ "Este email ha sido enviado desde java
\n"
+ "", "text/html");
// Se compone el archivo adjunto
BodyPart attached = new MimeBodyPart();
attached.setDataHandler(new DataHandler(new FileDataSource("C:/archivo.doc")));
attached.setFileName("Archivo adjunto.doc");
// Una MultiParte para agrupar texto y adjunto.
MimeMultipart multiPart = new MimeMultipart();
multiPart.addBodyPart(text);

multiPart.addBodyPart(attached);
// Se compone el correo, dando to, from, subject y el contenido.
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(user));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
message.setSubject("Correo desde JavaMail");
message.setContent(multiPart);
// Se envia el correo.
Transport transport = session.getTransport("smtp");
transport.connect(user, pass);
transport.sendMessage(message, message.getAllRecipients());
transport.close();
} catch (HeadlessException e) {
System.out.println(e.getMessage());
return false;
} catch (MessagingException e) {
System.out.println(e.getMessage());
return false;
}
return true;
}
}
La clase no es muy complicada, contiene slo un atributo de tipo Properties mailProps y que es el
contiene las propiedades para la conexin con el servidor de correo y un constructor que recibe
como parmetro ese objeto de tipo Properties.
Luego est el nico mtodo sendMail que recibe tres parmetros user, pass y recipient donde:
user: es el usuario de correo desde el que se mandar el mail
pass: es la contrasea del correo desde el que se mandar el mail
recipient: es el usuario de correo que recibir el mail
De inicio se requiere un objeto de Session mismo que recibe el objeto Properties para su
instanciacin. El mtodo setDebug le indicar a la sesin si debe debuggear y mostrar todo lo
sucedido con ella.
Para este caso al contener texto y adjuntos se debe utilizar un BodyPart para el texto y otro para
el adjunto. Para que el texto tenga formato html, se debe indicar en el mtodo de la siguiente
manera:
text.setContent("texto en formato html", "text/html");
Luego al bodyPart del adjunto, se le setea un dataHandler con el archivo a adjuntar.
Despus se crea un objeto de tipo MimeMultipart para agregar todas las partes (texto y adjunto,
pero puede haber ms).
Hecho esto procedemos a crear la instancia de la clase MimeMessage para generar el mensaje
completo seteando el usuario que enva, el que recibe, el asunto del mensaje y el contenido del
mensaje.
Finalemente con un objeto de tipo Transport, se inicia sesin con el usuario y contrasea de
quien enva, se enva el mensaje con el mtodo sendMessage de la siguiente forma;
transport.sendMessage(message, message.getAllRecipients());

Enviar correo JavaMail con texto html y adjunto

Ya slo resta cerrar el transport. Se capturan las excepciones necesarias y es todo para la clase.
Luego tenemos la clase de prueba:

package com.ea24.email;
import java.util.Properties;
import javax.swing.JOptionPane;
/**
*
* @author ea24
*/
public class Main {
public static void main(String[] args) {
//las propiedades para la conexin
Properties mailProps = new Properties();
mailProps.setProperty("mail.transport.protocol", "smtp");
mailProps.setProperty("mail.smtp.host", "smtp.gmail.com");
mailProps.setProperty("mail.smtp.starttls.enable", "true");
mailProps.setProperty("mail.smtp.port", "587");
mailProps.setProperty("mail.smtp.auth", "true");
Mailer mailer = new Mailer(mailProps);
boolean wasSend = mailer.sendMail("user@gmail.com", "password",
"destinatario@gmail.com");
if(wasSend) {
JOptionPane.showMessageDialog(null, "El correo se envi correctamente.");
} else {
JOptionPane.showMessageDialog(null, "No pudo enviarse el correo", "Error",
JOptionPane.ERROR_MESSAGE);
}
}
}
Para la clase de prueba se crea el objeto de tipo properties y se llena con los valores adecuados
segn sea el servidor de correo.
Depus se crea una instancia de la clase Mailer pasndole el archivo de propiedades y se llama
al mtodo sendMail pasndole el usuario, contrasea y destinatario.
De acuerdo con lo que devuelva el mtodo en la variable wasSend se determina si se envo o no
el correo.
Eso es bsicamente todo lo que hay que hacer para el envo de correos electrnicos con texto en
html y con archivos adjuntos.
Ojal sea de utilidad para muchos, si hay dudas ya saben.
Saludos!