Note also that THERE IS NOT SUFFICIENT DOCUMENTATION HERE TO USE THESE FEATURES!!! You will need to read the appropriate RFCs mentioned above to understand what these features do and how to use them. Don't just start setting properties and then complain to us when it doesn't work like you expect it to work. READ THE RFCs FIRST!!!(Las negritas también son originales: http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html)
Que simpáticos los muchachos de SUN!!!
Para conectar JavaMail con Gmail la misma FAQ oficial de JavaMail propone usar unos parámetros de configuración "smtps" (notar la S final) que no aparecen en ningún otro lugar de la documentación y que, como siempre, a mi no me funcionan. Buscando por la red he encontrado varias referencias a la configuración con "smtps", pero ninguna oficial. http://www.google.com/search?q=%22mail.transport.protocol%22++site%3Ajava.sun.com
Dado que la documentación no me ayudaba decidí seguir sus consejos y esto es lo que encontré:
La documentación de Gmail indica que Gmail soporta 2 puertos para la conexión SMTP: el 465 y el 587, e indica también que debe usarse el comando STARTTLS.
El comando STARTTLS debería iniciar una comunicación encriptada sobre el submission port 587 siguiendo el protocolo TLS según el RFC 2476: Message Submission. Pero por alguna razón (que todavía no he descubierto) JavaMail da un mensaje de error al intentar usar este puerto. Después de probar varias configuraciones decidí probar el otro puerto, que si que funcionó al primer intento.
El puerto 465 es "menos" estándar (incluso hay otro servicio, el URD - “URL Rendesvous Directory for SSM” registrado por Cisco en el mismo puerto) y utiliza el protocolo SSL. El puerto 465 se menciona en el apendice A de la especificación: The SSL Protocol Version 3.0 “Simple Mail Transfer Protocol with SSL” de 1996.
La diferencia entre SSL y TLS es muy sutil y es simplemente la versión. SSL hace referencia a SSL 3.0 y TLS hace referencia a TLS 1.0 que es igual a SSL 3.1
Repito:
TLS 1.0 == SSL 3.1
Aunque el protocolo permanece sustancialmente igual existen pequeñas diferencias entre SSL 3.0 y TLS 1.0.
Aunque el protocolo permanece sustancialmente igual existen pequeñas diferencias entre SSL 3.0 y TLS 1.0.
Al final la configuración del JavaMail para Gmail quedó algo así:
(Java 1.6 valida automáticamente los certificados de Gmail así que no hay necesidad de agregarlos a mano a la truststore)
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
props.put("mail.debug", "true");
Session session = Session.getInstance(props);
Aunque encontré una solución a mi problema, y el código ya está funcionando me quedé muy intrigado de porqué no funciona con el puerto 587 y porqué en la red hay tantas referencias a la configuración "smtps" pero la única referencia oficial está en la FAQ, así que, aunque sea para sacarme la duda, seguiré investigando.
.
1 comentarios:
Buen día Alejando, he llegado hasta tu blog buscando la respuesta a ¿porque no me funciona ningún ejemplo de envio de mails con gmail?. Luego de leer tu blog probe y probe y probe de nuevo todos los ejemplos que tenia y nuevos que he descargado incluso de sun y nada.
Por favor podrias enviarme un ejemplo funcional, ya he tenido en cuenta las librerias necesarias. Mi correo es jiroexe@gmail.com. De antemano gracias por tu colaboración.
Publicar un comentario en la entrada