Enviar un correo HTML con Java febrero 14, 2007
Posted by superpiwi in Java.trackback
He escrito una clase para enviar correo mediante HTML. Lo primero, necesitas descargar la libreria de Java Mail API y la de Java Beans Activation Framework.
http://java.sun.com/products/javamail/
http://java.sun.com/products/javabeans/jaf/index.jsp
Usar la clase es muy sencillo. Un ejemplo para enviar un correo html y un par de ficheros atachados:
String contenidoHTML = HTMLMail.loadHTMLFile("/home/jose/articulo.html");
// propiedades de conexion al servidor de correo
HTMLMail mail = new HTMLMail("aqui_tu_server_correo","tu_user","tu_password");
mail.setFrom("javalangnullpointer");
mail.setSubject("NOTICIAS JAVALANGNULLPOINTER");
mail.setTo("aqui_aquien_envias@gmail.com");
// fijar el contenido
mail.addContent(contenidoHTML);
// CID de una imagen
mail.addCID("cidimage01", "/home/jose/firma.gif");
// enviar atachados un par de ficheros
mail.addAttach("/home/jose/image.gif");
//mail.addAttach("/home/jose/bison_1_0.zip");
// enviar el correo MULTIPART
mail.sendMultipart();
Y ya está. sencillo, verdad???
Te comento que es el CID de una imagen. Cuando quieres incrustar una imagen en el HTML debes poner algo de la forma:
<img src="CID:cid_de_la_imagen />
Donde cid_de_la_imagen es un nombre aleatoria que le das para identificarla. Esto en el correo tambien se referencia con el metodo addCID que lo que hace es embeber en el cuerpo del mensaje el contenido de la imagen asociandole ese cid o nombre que le hayas dado. Cuando el browser abra ese mensaje mostrara correctamente la imagen atachada. En el ejemplo el HTML contiene una imagen con cid igual a cidimage01 y por eso en el mensaje asociamos el fichero grafico con ese nombre.
<img src="CID:cidimage01" />
Lo interesante. Aqui el contenido de la clase:
/**
*
* HTMLMail.java
*
* clase para enviar correos HTML.
*
* @author jdelgado
* @revision 0.0.0.1 13 febrero 2007
* @since Eclipse 3.2 JDK 1.5
*
* TODO: enviar .css mediante CID, actualmente solo funciona si va incrustado en la pagina con <style></style>
*
*/
package comun.util.mail;
import java.io.*;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class HTMLMail {
/**
* Algunas constantes
*/
static public int SIMPLE = 0;
static public int MULTIPART = 1;
/**
* Algunos mensajes de error
*/
public static String ERROR_01_LOADFILE = "Error al cargar el fichero";
public static String ERROR_02_SENDMAIL = "Error al enviar el mail";
/**
* Variables
*/
private Properties props = new Properties();
private String host,protocol,user,password;
private String from,content,to;
private String subject="";
/**
* MultiPart para crear mensajes compuestos
*/
MimeMultipart multipart = new MimeMultipart("related");
// -----
/**
* Constructor
* @param host nombre del servidor de correo
* @param user usuario de correo
* @param password password del usuario
*/
public HTMLMail(String host,String user,String password)
{
props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", host);
props.setProperty("mail.user", user);
props.setProperty("mail.password", password);
}
//-----
/**
* Muestra un mensaje de trazas
*
* @param metodo
* nombre del metodo
* @param mensaje
* mensaje a mostrar
*/
static public void trazas(String metodo, String mensaje) {
// TODO: reemplazar para usar Log4J
System.out.println("[" + HTMLMail.class.getName() + "][" + metodo
+ "]:[" + mensaje + "]");
}
// -----
/**
* Carga el contenido de un fichero de texto HTML en un String
*
* @param pathname
* ruta del fichero
* @return un String con el contenido del fichero
* @throws Exception
* Excepcion levantada en caso de error
*/
static public String loadHTMLFile(String pathname) throws Exception
{
String content = "";
File f = null;
BufferedReader in = null;
try
{
f = new File(pathname);
if (f.exists())
{
long len_bytes = f.length();
trazas("loadHTMLFile", "pathname:" + pathname + ", len:"+ len_bytes);
}
in = new BufferedReader(new FileReader(f));
String str;
while ((str = in.readLine()) != null) {
// process(str);
str = str.trim();
content = content + str;
}
in.close();
return content;
}
catch (Exception e)
{
String MENSAJE_ERROR = ERROR_01_LOADFILE + ": ['" + pathname + "'] : " + e.toString();
throw new Exception(MENSAJE_ERROR);
}
finally
{
if (in != null) in.close();
}
}
// ----
/**
* Para probar el correcto funcionamiento de la clase
*
* @param args
* argumentos de entrada
* @throws Exception
* excepcion levantada en caso de error
*/
public static void main(String[] args) throws Exception {
try {
// cargar en un string el template del HTML que se va a enviar
String contenidoHTML = HTMLMail.loadHTMLFile("/home/jose/articulo.html");
System.out.println("contenido HTML:" + contenidoHTML);
// propiedades de conexion al servidor de correo
HTMLMail mail = new HTMLMail("correo","jose","jose");
mail.setFrom("javalangnullpointer");
mail.setSubject("NOTICIAS JAVALANGNULLPOINTER");
mail.setTo("jhon.doe@gmail.com");
// fijar el contenido
//contenidoHTML=contenidoHTML+"<br/>Saludos, JOSE<br/><img src='cidimage01'>";
mail.addContent(contenidoHTML);
// CID de una imagen
mail.addCID("cidimage01", "/home/jose/firma.gif");
// enviar atachados un par de ficheros
mail.addAttach("/home/jose/image.gif");
//mail.addAttach("/home/jose/bison_1_0.zip");
// enviar el correo MULTIPART
mail.sendMultipart();
// para un correo SIMPLE seria:
// mail.setContent(contenidoHTML);
// mail.send();
System.out.println("[ Mail enviado ]");
} catch (Exception e) {
e.printStackTrace();
}
}
// ------
/**
* Añade el contenido base al multipart
* @throws Exception Excepcion levantada en caso de error
*/
public void addContentToMultipart() throws Exception
{
// first part (the html)
BodyPart messageBodyPart = new MimeBodyPart();
String htmlText = this.getContent();
messageBodyPart.setContent(htmlText, "text/html");
// add it
this.multipart.addBodyPart(messageBodyPart);
}
// -----
/**
* Añade el contenido base al multipart
* @param htmlText contenido html que se muestra en el mensaje de correo
* @throws Exception Excepcion levantada en caso de error
*/
public void addContent(String htmlText) throws Exception
{
// first part (the html)
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setContent(htmlText, "text/html");
// add it
this.multipart.addBodyPart(messageBodyPart);
}
// -----
/**
* Añade al mensaje un cid:name utilizado para guardar las imagenes referenciadas en el HTML de la forma <img src=cid:name />
* @param cidname identificador que se le da a la imagen. suele ser un string generado aleatoriamente.
* @param pathname ruta del fichero que almacena la imagen
* @throws Exception excepcion levantada en caso de error
*/
public void addCID(String cidname,String pathname) throws Exception
{
DataSource fds = new FileDataSource(pathname);
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setDataHandler(new DataHandler(fds));
messageBodyPart.setHeader("Content-ID","<"+cidname+">");
this.multipart.addBodyPart(messageBodyPart);
}
// ----
/**
* Añade un attachement al mensaje de email
* @param pathname ruta del fichero
* @throws Exception excepcion levantada en caso de error
*/
public void addAttach(String pathname) throws Exception
{
File file = new File(pathname);
BodyPart messageBodyPart = new MimeBodyPart();
DataSource ds = new FileDataSource(file);
messageBodyPart.setDataHandler(new DataHandler(ds));
messageBodyPart.setFileName(file.getName());
messageBodyPart.setDisposition(Part.ATTACHMENT);
this.multipart.addBodyPart(messageBodyPart);
}
// ----
/**
* Envia un correo multipart
* @throws Exception Excepcion levantada en caso de error
*/
public void sendMultipart() throws Exception
{
Session mailSession = Session.getDefaultInstance(this.props, null);
mailSession.setDebug(true);
Transport transport = mailSession.getTransport();
MimeMessage message = new MimeMessage(mailSession);
message.setSubject(this.getSubject());
message.setFrom(new InternetAddress(this.getFrom()));
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(this.getTo()));
// put everything together
message.setContent(multipart);
transport.connect();
transport.sendMessage(message,
message.getRecipients(Message.RecipientType.TO));
transport.close();
}
// -----
/**
* Envia un correo simple
* @throws Exception Excepcion levantada en caso de error
*/
public void send() throws Exception
{
try
{
Session mailSession = Session.getDefaultInstance(this.props, null);
mailSession.setDebug(true);
Transport transport = mailSession.getTransport();
MimeMessage message = new MimeMessage(mailSession);
message.setSubject(this.getSubject());
message.setFrom(new InternetAddress(this.getFrom()));
message.setContent(this.getContent(), "text/html");
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(this.getTo()));
transport.connect();
transport.sendMessage(message,
message.getRecipients(Message.RecipientType.TO));
transport.close();
}
catch(Exception e)
{
String MENSAJE_ERROR = ERROR_02_SENDMAIL+" : " + e.toString();
throw new Exception(MENSAJE_ERROR);
}
}
//-----
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
}
// end of class HTMLMail
Y aqui el contenido del fichero HTML que enviamos:
<HEAD>
<STYLE>
P {color:red;}
</STYLE>
</HEAD>
<BODY>
Esta es una prueba de <b>envio de correo HTML</b> mediante Java.
Emplea una clase implementada por mi y con ella esto es tan sencillo como escribir este código:
<br/>
<br/>
<P>
<font color='green'>// propiedades de conexion al servidor de correo</font><br/>
HTMLMail mail = new HTMLMail("correo","user","password");<br/>
mail.setFrom("javalangnullpointer");<br/>
mail.setSubject("NOTICIAS DE JAVALANGNULLPOINTER");<br/>
mail.setTo("aqui_tu_correo@correo.es");<br/>
<br/>
<font color='green'>// fijar el contenido</font><br/>
String contenidoHTML = HTMLMail.loadHTMLFile("/home/jose/articulo.html");<br/>
mail.addContent(contenidoHTML);<br/>
<br/>
<font color='green'>// enviar CID de una imagen</font><br/>
mail.addCID("cidimage01", "/home/jose/firma.gif");<br/>
<br/>
<font color='green'>// enviar atachados un par de ficheros</font><br/>
mail.addAttach("/home/jose/image.gif");<br/>
mail.addAttach("/home/jose/bison_1_0.zip");<br/>
<br/>
<font color='green'>// enviar el correo MULTIPART</font><br/>
mail.sendMultipart();<br/>
</P>
El resultado es el que estais viendo. Si os interesa el tema o quereis ver mas tutoriales. Conectate a...
<br/>
<br/>
<a href="https://javalangnullpointer.wordpress.com">javalangnullpointer.wordpress.com</a>
<br/>
<br/>
Saludos,
<br>
<img src='cid:cidimage01' />
</BODY>
</HTML>
El resultado al visualizarlo con el navegador, seria similar a este:
Hola probando el mail
correo recibido :-). Tienes que ejecutarlo desde eclipse o el IDE que estes usando y con valores validos (servidor de SMTP, usuario, password, etc…)
OK
dxcfghjkvfgbhnj
depaspo
sorry mi sobrino tomo el teclado, se agradese el apote testeando….
Empieza pronto tu sobrino con JAVA, asi me gusta ;-). bien por las nuevas generaciones…
Como puedo adjuntar una imagen y del archivo adjunto tomar la ruta de este para mostrarlo en el texto del Correo, en formato HTML ó mandar una imagen y tomar la direccion de esta, pero que no sea absoluta, todo esto desde Java?
Gracias
Saludos
No entiendo muy bien lo que quieres hacer. Cuando adjuntas una imagen esta va incluida en el propio mensaje y el cliente de correo al recibirlo lo que hace es darte la posibilidad de descargar ese fichero con el nombre que tenga y ya entonces lo guardas en el disco duro donde quieras. Otros clientes de correo, como el de Google lo que hacen es mostrarte esa imagen directamente. si lo que quieres es incluir un HTML y que la imagen se muestre mediante un tag del tipo , decirte que eso no funciona. Como mucho puedes mostrar una ruta a la imagen Pulsa aqui para enlace imagen pero eso aparece en el mensaje como un Link, que al pulsarlo te lleva a otra pagina. Saludos.
Your site is perfect!
Saludos.
He probado a hacerlo enviando uno a mi direccion de hotmail…pero nada..¨
¿Por qué puede ser?
Gracias
Puede que tengas un proxy o firewall., no se, en mi caso lo probe con gmail y no tuve problemas. mira si puedes probarlo con otros servidores de correo para comprobar que no este algo capado. Si puedes montarte incluso un servidor de correo local para pruebas de desarrollo mejor que mejor.
aaaaaa
Saludos.
He probado estas clases y me funcionan de maravilla como esta implementado, mi pregunta es si hay alguna manera de saber si al correo que se esta enviando el mensaje es valido o en caso contrario que este cerrado o suspendido?
Gracias por la ayuda!!!
hola
esto es una prueba
prueba recibida ^_^
@Rolando, no entiendo muy bien lo que me preguntas. Si me puedes comentar mejor, te lo agradezco. Saludos.
hola a todo el mundo soy hincha de josejose el principe dela cancion es una prsona mas humilde y bueno lo aprecio porque
el suigue gravando es una persona positiva el sera sienpre el principe de la cancion mi correo es jagm22_2@hotmail.com algun dia lo cocere en persona es mi amigo josejose como me gustaria conocerte algun dia suigue adelante sienpre ok amigo jose jose eres una pèrsona sencilla bueno uno que te sigue sienpre mi nombre esw jose luis de peru cuidate m
Saludos!!!, no sé si me podrian ayudar, envío correos con formato HTML a varias direcciones, contiene imágenes pero no las anexe al correo si no que coloco en el src de la imagen una dirección de internet donde descargarla.
Casi siempre se muestra bien, pero hay ocasiones extrañas donde la imagen aparece con un tache de que no se encontró y al ver la ruta de la imagen está correcta excepto porque en la extensión «.gif» lo puso como «..gif», no sé porque le anexa ese punto adicional a veces.
Alguien sabe a que se deba ?
Saludos.
megustaria que dieres una mejor explicacion algo asi como para dummis. pero gracias ok.
Te propongo lo siguiente pasame la documentacion adecuada la tradusco si es neserario (siempre que este en ingles) y creo un documento que despues puedas distribuir como tuyo.
COmo ves
hola man mira estoy probando tu ejemplo
pero no me sale pues cambie la parte
ke llama a la clase
public static void main(String[] args) throws Exception {
try {
// cargar en un string el template del HTML que se va a enviar
String contenidoHTML = HTMLMail.loadHTMLFile(«src/articulo.html»);
System.out.println(«contenido HTML:» + contenidoHTML);
// propiedades de conexion al servidor de correo
HTMLMail mail = new HTMLMail(«sdarknot@gmail.com»,»darkx»,»badboy696″);
mail.setFrom(«javalangnullpointer»);
mail.setSubject(«NOTICIAS JAVALANGNULLPOINTER»);
mail.setTo(«sdarknot@gmail.com»);
// fijar el contenido
//contenidoHTML=contenidoHTML+”Saludos, JOSE”;
mail.addContent(contenidoHTML);
// CID de una imagen
mail.addCID(«cidimage01», «src/firma.png»);
// enviar atachados un par de ficheros
mail.addAttach(«src/imagen.gif»);
//mail.addAttach(”/home/jose/bison_1_0.zip”);
// enviar el correo MULTIPART
mail.sendMultipart();
// para un correo SIMPLE seria:
// mail.setContent(contenidoHTML);
// mail.send();
System.out.println(«[ Mail enviado ]»);
} catch (Exception e) {
e.printStackTrace();
}
}
pero al ejecutar me manda este error
[HTMLMail][loadHTMLFile]:[pathname:src/articulo.html, len:1369]
contenido HTML:P {color:red;}Esta es una prueba de envio de correo HTML mediante Java.Emplea una clase implementada por mi y con ella esto es tan sencillo como escribir este código:// propiedades de conexion al servidor de correoHTMLMail mail = new HTMLMail(”correo”,”user”,”password”);mail.setFrom(”javalangnullpointer”);mail.setSubject(”NOTICIAS DE JAVALANGNULLPOINTER”);mail.setTo(”aqui_tu_correo@correo.es”);// fijar el contenidoString contenidoHTML = HTMLMail.loadHTMLFile(”/home/jose/articulo.html”);mail.addContent(contenidoHTML);// enviar CID de una imagenmail.addCID(”cidimage01?, “firma.png”);// enviar atachados un par de ficherosmail.addAttach(«image.gif»);mail.addAttach(«verde.zip»);// enviar el correo MULTIPARTmail.sendMultipart();El resultado es el que estais viendo. Si os interesa el tema o quereis ver mas tutoriales. Conectate a…javalangnullpointer.wordpress.comSaludos,
DEBUG: setDebug: JavaMail version 1.4ea
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host «sdarknot@gmail.com», port 25, isSSL false
javax.mail.MessagingException: Unknown SMTP host: sdarknot@gmail.com;
nested exception is:
java.net.UnknownHostException: sdarknot@gmail.com
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1280)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:370)
at javax.mail.Service.connect(Service.java:275)
at javax.mail.Service.connect(Service.java:156)
at javax.mail.Service.connect(Service.java:105)
at HTMLMail.sendMultipart(HTMLMail.java:236)
at HTMLMail.main(HTMLMail.java:151)
Caused by: java.net.UnknownHostException: sdarknot@gmail.com
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:232)
at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:189)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1250)
… 6 more
no se si podrias decirme en que he fallado
desde ya te lo agradesco
Caused by: java.net.UnknownHostException: sdarknot@gmail.com
no te encuentra el servidor de correo.
prueba mejor a pasarle la IP.
Hola, una pregunta, en el ejemplo muestras cargar un archivo html, si este contiene imagenes de que forma las puedo enviar si necesidad de ponerlas en un cid, ya que tome de tu clase el método de loadHtml , sin ambargo mi archivo html contiene imagenes y este al enviarse muestra un error.
250 2.1.0 Flushed k41sm2457519rvb
com.sun.mail.smtp.SMTPSendFailedException: 552 5.7.0 Illegal Attachment k41sm2457519rvb
Lo que quiero hacer es que si ya tengo un template html poder pasarle la ruta y enviarlo.
Saludos.
Solucionando, fue error mio de ruta, saludos, la función de conversión marcha perfecta!.
Me alegra saberlo ^_^
hola amigo, excelente articulo será posible que pongas a disposicion el codigo fuente en un zip de todo lo que usaste para realizar el envio de mensajes. Atte. un hincha
eeeeeeeeeeeeeeeeeeeee
esta muy buena la pagina enh?
ke pex
Hola Hincha, si quiero subir este sitio a un nuevo servidor y colocar los archivos con el codigo fuente. a ver si con suerte lo puedo hacer en breve.
la playita
dfd
Hola.
Muchas gracias por tu ejemplo es muy util.
Bye
Buenas, he copiado tal cual eljava, y he cambiado los datos de correo electornico y demás, sin embargo me sale este error tan chulo:
Exception in thread «main» java.lang.NoClassDefFoundError: org/apache/geronimo/mail/util/ASCIIUtil
Si alguien me lo puede explicar por favor.
mi servidor de correo es exchange no tiene nada que ver eso.. es que me sale un error diciendo que no se puede conectar al server… gracias de antemano
hola, una pregunta.. lograste incluir el fichero css también como un cid: ?? Eso se puede hacer?? funciona???
Muchas gracias!!
Cuando ejecuto esta linea no encuentra el archivo prueba que esta en la raiz del proyecto, a que se debe?…alguna idea…
String contenidoHTML = HTMLMail.loadHTMLFile(«/ProySL/prueba.jsp»);
Gracias.
mil gracias!!! Funciona super bien
Gracias Maestro, podrias enseñarnos mas, somos libretas con demasiadas hojas en blanco por favor ayudanos a llenarlas.
Gracias
Holasss otttooosss
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.
Hola, me sale el mismo error que a alguien arriba:
Unknown SMTP host: o.viveros.egas@gmail.com…..
Tu dices que intente con la IP. pero como lo he probado me sale el mismo error, cuál IP debo poner?
Gracias
nuevamente yo.
le he dado en el campo host esto: mail.google.com (o la IP) y me sale:
Error al enviar el mail : javax.mail.MessagingException: Could not connect to SMTP host: mail.google.com port: 25;
nested exception is:
java.net.ConnectException: Connection timed out
Cualquier ayuda la agradezco.
Buenas tardes
me sale el error 554 Message is not RFC compliant
alguien tiene la respuesta?
Tengo una ligera duda, mi programa funciona perfecto, envía mails con adjuntos y lo controlo bien pero cuando quiero ejecutar este programa en otro ordenador no funciona, ¿por qué? no lo entiendo:
-exporto el .jar
-lo ejecuto en mi máquina y funciona ok
-lo pongo en el ordenador de mi hermano y no envía nada
Muchas gracias
Hey! muuuchas gracias por el aporte
Reblogged this on .: Codigo CTM :..
Gracias hermano, super bueno y me srivio, pero una duda en el caso de que quiera enviar a mas de una direccion como paso las direcciones????
Hello there! I know this is kinda off topic however , I’d
figured I’d ask. Would you be interested in exchanging links
or maybe guest authoring a blog post or vice-versa?
My website covers a lot of the same topics
as yours and I feel we could greatly benefit from each other.
If you are interested feel free to shoot me an e-mail.
I look toward hearing from you! Excellent blog by the way!
What’s Happening i am new to this, I stumbled upon this
I’ve discovered It positively helpful and it has aided me out loads.
I’m hoping to give a contribution & aid different users
like its aided me. Great job.
I have read so many articles or reviews about the blogger lovers however this article is genuinely a pleasant piece of writing, keep it
up.