domingo, 25 de octubre de 2009

Enviar un correo usando Gmail desde Java



correo2.jpg


Preparando el entorno.


Para ello deberemos descargar la librería JavaMail desde http://java.sun.com/products/javamail/. Luego la incluiremos en nuestro proyecto. Si usamos Eclipse, lo haremos así: botón derecho sobre el proyecto, Properties, Java Build Path, Add Externals JARs.




El código


Aquí se muestra el código. Simplemente tendremos que cambiar las propiedades miCorreo y miContraseña por la dirección y contraseña de nuestra cuenta Gmail. En el método main, pondremos la dirección a la que lo queremos mandar, el asunto y el cuerpo respectivamente.




import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;

public class EnviadorMail {
final String miCorreo = "micorreo@gmail.com";
final String miContraseña = "*****";
final String servidorSMTP = "smtp.gmail.com";
final String puertoEnvio = "465";
String mailReceptor = null;
String asunto = null;
String cuerpo = null;

public EnviadorMail(String mailReceptor, String asunto,
String cuerpo) {
this.mailReceptor = mailReceptor;
this.asunto = asunto;
this.cuerpo = cuerpo;

Properties props = new Properties();
props.put("mail.smtp.user", miCorreo);
props.put("mail.smtp.host", servidorSMTP);
props.put("mail.smtp.port", puertoEnvio);
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.socketFactory.port", puertoEnvio);
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");

SecurityManager security = System.getSecurityManager();

try {
Authenticator auth = new autentificadorSMTP();
Session session = Session.getInstance(props, auth);
// session.setDebug(true);

MimeMessage msg = new MimeMessage(session);
msg.setText(cuerpo);
msg.setSubject(asunto);
msg.setFrom(new InternetAddress(miCorreo));
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(
mailReceptor));
Transport.send(msg);
} catch (Exception mex) {
mex.printStackTrace();
}

}

private class autentificadorSMTP extends javax.mail.Authenticator {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(miCorreo, miContraseña);
}
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
EnviadorMail EnviadorMail = new EnviadorMail("dire@dire",
"Este es el asunto de mi correo", "Este es el cuerpo de mi correo");
}

}




Fuentes:


http://puretechie.blogspot.com/2008/09/sending-email-using-gmail-using-java.html




30 Comentarios:

Henry Miramira Malpartida dijo...

ANARCHY9902(PERU): Excelente la verdad , muy buena la solucion , adjunto la solucion para que aquellos que no han podido adjuntar un archivo :

Multipart mp = new MimeMultipart();

String[] files = {
"D:/Tomcat 5.5/webapps/comdesk/WebContent/filesMailAdjuntos/comdesk12022010130306/537ee94b-3f06-4daf-a483-1d541b4bc5ad.jpg",
"D:/Tomcat 5.5/webapps/comdesk/WebContent/filesMailAdjuntos/comdesk12022010130306/DSC00178.JPG",
"D:/Tomcat 5.5/webapps/comdesk/WebContent/filesMailAdjuntos/comdesk12022010130306/ji7.jpg"
};
for (int i=0;i<files.length;i++){
System.out.println("archivo"+i+"="+files[i]);
MimeBodyPart adjunto =new MimeBodyPart();
adjunto.setDataHandler(new DataHandler(new FileDataSource(files[i])));
adjunto.setFileName(new FileDataSource(files[i]).getName());
mp.addBodyPart(adjunto);
}

msg.setContent(mp);

Felipe Martínez D. dijo...

Hola Henry, gracias por comentar y por tu aporte. Voy a probarlo a ver que tal y ya comento ...

Saludos!

Anónimo dijo...

hola saludos quisiera saber en que parte del codigo coloco esto para adjuntar un archivo??? despues del setfrom??? o donde????

Anónimo dijo...

Noemi Gabriela Contreras Cabrera Saludos, y gracias por la aportación funciona muy bien.
Agregando el código para adjuntar el archivo puede quedar de la siguiente manera:
public EnviadorMail(String mailReceptor, String asunto,String cuerpo) throws MessagingException {
this.mailReceptor = mailReceptor;
this.asunto = asunto;
this.cuerpo = cuerpo;

Properties props = new Properties();
props.put("mail.smtp.user", miCorreo);
props.put("mail.smtp.host",
servidorSMTP);
props.put("mail.smtp.port", puertoEnvio);
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.socketFactory.port", puertoEnvio);
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");

SecurityManager security = System.getSecurityManager();

Multipart mp = new MimeMultipart();

String[] files = {
"D:/Tomcat 5.5/webapps/comdesk/WebContent/filesMailAdjuntos/comdesk12022010130306/537ee94b-3f06-4daf-a483-1d541b4bc5ad.jpg",
"D:/Tomcat 5.5/webapps/comdesk/WebContent/filesMailAdjuntos/comdesk12022010130306/DSC00178.JPG",
"D:/Tomcat 5.5/webapps/comdesk/WebContent/filesMailAdjuntos/comdesk12022010130306/ji7.jpg"
};


try {
Authenticator auth = new autentificadorSMTP();
Session session = Session.getInstance(props, auth);
// session.setDebug(true);

MimeMessage msg = new MimeMessage(session);
msg.setText(cuerpo);
msg.setSubject(asunto);

for (int i=0;i<files.length;i++){
System.out.println("archivo"+i+"="+files[i]);
MimeBodyPart adjunto =new MimeBodyPart();
adjunto.setDataHandler(new DataHandler(new FileDataSource(files[i])));
adjunto.setFileName(new FileDataSource(files[i]).getName());
mp.addBodyPart(adjunto);
}


msg.setContent(mp);
msg.setFrom(new InternetAddress(miCorreo));
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(
mailReceptor));
Transport.send(msg);

} catch (Exception mex) {
mex.printStackTrace();
}

}

Felipe Martínez D. dijo...

Hola Noemí.

Gracias por tu aportación.

Saludos.

Anónimo dijo...

me sale q no se puede conectar al smtp ??? q solucion hay para ello

Felipe Martínez D. dijo...

Hola.

Cuando aparece un error del protocolo SMTP, es difícil saber la causa exacta. He encontrado este artículo que permite depurar la conexión SMTP y creo que te puede ayudar:
http://lineadecodigo.com/java/depurar-una-conexion-smtp-con-java-mail/

No obstante, asegúrate que has puesto correctamente la dirección de tu cuenta y la contraseña.

Si sigues teniendo problemas, comunícamelo e intentaré ayudarte.

Saludos.

Emi Scavuzzo dijo...

Hola, que modificaciones debería hacer para enviar el correo usando hotmail? y yahoo?

Felipe Martínez D. dijo...

Hola Emi.

Aunque no lo he probado, bastaría con indicar el servidor y el puerto correspondiente:

Hotmail:
final String servidorSMTP = "smtp.live.com";
final String puertoEnvio = "25";

Yahoo:
final String servidorSMTP = "smtp.mail.yahoo.com";
final String puertoEnvio = "25";


Espero que te sirva.

Rashteco dijo...

Corre de puta madre! =D Gracias!

Felipe Martínez D. dijo...

Gracias a tí por comentar.

Saludos.

Anónimo dijo...

Hola que tal e estado trabajando con esta libreria pero no conseguido enviar un correo a gmail me arroja el siguiente error:

javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 587;
nested exception is:
java.net.ConnectException: Connection timed out: connect
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1972)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:642)

Willy dijo...

la excepción de smtp por lo general sale cuando no hay manera de conectar, una de las razones es la conexion a internet mediante un proxy o firewall

Anónimo dijo...

Authenticator auth = new autentificadorSMTP();
Session session = Session.getInstance(props, auth);
// session.setDebug(true);

eso falla dice que la clase autentificadorSMTP no existe !

Felipe Martínez D. dijo...

Hola.

Si te indica que la clase no existe, lo más probable es que se deba a que no has importado correctamente la librería JavaMail. Revisa la parte de este artículo llamada "Preparando el entorno". También comprueba que en tu código están todos los imports.

Si sigue dándote problemas, indícamelo e intentaré ayudarte.

Saludos.

Gabo dijo...

Mil gracias fue de mucha ayuda.



Disculpa si tengo un Server de Microsoft y esta hosteado en Microsoft usa el método TLS hice tal caul lo indicas pero no permite conectarse.

a que crees que se deba???
por cierto no tiene ningun firewall activo

saludos...

Felipe Martínez D. dijo...

Hola Gabo.

Por favor, indícame si te aparece algún mensaje de error o muéstrame la traza de la ejecución para que pueda ayudarte.

Saludos.

andres2288yedith dijo...

javax.mail.MessagingException: Exception reading response;
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:1462)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1260)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:370)
at javax.mail.Service.connect(Service.java:297)
at javax.mail.Service.connect(Service.java:156)
at javax.mail.Service.connect(Service.java:105)
at javax.mail.Transport.send0(Transport.java:168)

:(

Felipe Martínez D. dijo...

Hola Edith.

Ése error se debe a que no has importado correctamente la librería JavaMail. Sigue los pasos que describo en el apartado "Preparando el entorno" y verás como al ejecutar la aplicación no encuentras ningún problema.

Saludos.

Azalamandra dijo...

Hola, he usado el codigo para enviar mails y no tengo ningun problema de compilacion en el codigo, todo funciona correctamente pero el correo no me llega a la direccion que le indico. Porque puede ser?
Gracias por la aportacion

Felipe Martínez D. dijo...

Hola Azalamandra.

Revisa las propiedades miCorreo y miContraseña. Comprueba que has introducido correctamente la dirección a la que se va a enviar el correo (está en el método main). Si eso está correcto, observa qué warnings o errores en tiempo de ejecución te aparecen. Si estás utilizando Eclipse te aparecerán en el panel que hay en la parte inferior. Esos mensajes te darán pistas acerca de por qué no se está enviando correctamente el mail.

Saludos.

Unknown dijo...

Que libreria se debe importar la 1.4.5 o la 1.4.7

Unknown dijo...

Bueno he aparte de la duda de las librerias, me sale este error: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;
nested exception is:
java.net.ConnectException: Connection timed out: connect
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1972)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:642)
at javax.mail.Service.connect(Service.java:317)
at javax.mail.Service.connect(Service.java:176)
at javax.mail.Service.connect(Service.java:125)
at javax.mail.Transport.send0(Transport.java:194)
at javax.mail.Transport.send(Transport.java:124)
at correo.EnviadorMail.(EnviadorMail.java:55)
at correo.EnviadorMail.main(EnviadorMail.java:83)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:625)
at sun.security.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:160)
at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:319)
at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:207)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1938)
... 8 more

Felipe Martínez D. dijo...

Hola Milagros.

Puedes utilizar la versión que quieres, te funcionará igualmente. Con respecto al error, parece que estás teniendo problemas con el puerto 465. Inténtalo con el 587 y si te sigue sin funcionar, prueba con el 25. Ésto se hace modificando la propiedad puertoEnvio .

Si tienes dudas, puedes preguntarme.

Saludos.

Unknown dijo...

Gracias por Responder ya lo probe y si corre todo normal, pero cuando lo uso dentro de la empresa, no corre y creo que es por el proxy o firewall, como puedo darle solucion a esto ya que no tengo los privilegios para desactivarlos.

Gracias Saludos

Felipe Martínez D. dijo...

Hola Milagros.

Ahí no puedo ayudarte. Debes de hablar con la persona que administra la red en tu empresa para que te de los permisos necesarios o configure el firewall para que puedas ejecutar la aplicación.

Saludos.

Unknown dijo...

Ok Bueno de todas formas muchas gracias me sirvió mucho tu ayuda .

Felipe Martínez D. dijo...

Me alegro de haberte podido ayudar.

Saludos.

Anónimo dijo...

Hola amigo una consulta tengo problemas al enviar
me sale el siguiente error:
javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:264)
at javax.mail.Service.connect(Service.java:134)
at mensaje.Envio.(Envio.java:41)
at mensaje.Enviar.main(Enviar.java:7)
Por favor si me puedes ayudar a la solucion

Felipe Martínez D. dijo...

Hola.

Es un error de autenticación. Comprueba que estás poniendo bien la dirección y la contraseña.

Saludos.

Publicar un comentario

Felinfo: Java, Linux, Virtualización. Open Source.  ©Template Blogger Green by Dicas Blogger .

TOPO