En el mundo del desarrollo de Sistemas de Información siempre existe la necesidad de enviar correos de distintas formas y maneras. En mi experiencia profesional he necesitado de este medio en distintas ocasiones, como por ejemplo:
Al registrarse un usuario en el sistema de ventas, en el acto se le envía un email al usuario pidiéndole que confirme la existencia de su correo electrónico o también se le puede enviar el catálogo con los distintos productos que ofrece la empresa.
Correos masivos a los distintos usuarios de nuestra base de datos.
Programar el envío automático de correos, en una especie de campaña de ventas.
Como podemos observar, en la actualidad, la importancia de el envío de correos desde el aplicativo tiene una importancia vital para la ejecución de las distintas estrategias de marketing y fidelización de clientes trazadas por las diferentes empresas.
Por esta razón, la siguiente pregunta cae por su propio peso : ¿Cómo podemos enviar correos electrónicos desde Java?
Empezaremos este artículo definiendo al API JavaMail.
JavaMail se trata de una librería desarrollada por SUN encaminada al envío de correos electrónicos directamente desde tu aplicación Java. El uso de ésta librería es muy sencillo pero detallaremos paso a paso como realizar la instalación y uso de ella.
JavaMail implementa el protocolo SMTP (Simple Mail Transfer Protocol) así como los distintos tipos de conexión con servidores de correo -TLS, SSL, autentificación con usuario y password, etc.
JavaMail no se incluye en la JDK ni en la JRE, sino que debe conseguirse como un paquete externo.
Empezando a armar la Aplicación
Una vez descargado el API, añadimos el archivo mail.jar v1.4.x a nuestro proyecto y de ser necesario también añadir activation.jar v1.0.2 .
Pues bien, ahora procederemos a implementar un aplicativo que permita el envío de correos usando el protocolo SMTP de nuestra cuenta en gmail; sin embargo, si contamos con un servidor de correos personal será mucho mejor usar ese (dominio personal).
* Clases y métodos a utilizar
Clase Properties: Ésta clase es la encargada de almacenar las propiedades de la conexión que vamos a establecer con el servidor de correo Saliente SMTP.
Propiedades a utilizar:
- Protocolo a utilizar para el envío de correos.
- Dirección del servidor de correo.
- Indicar si se necesita autenticar o no.
- Puerto SMTP.
- Valor booleano de habilitación TLS.
- Email del emisor del mensaje.
- Usuario de acceso al servidor SMTP
Clase Session: De alguna forma representa la conexión con el servidor gmail de correo. Hay que obtenerla pasándole los parámetros de configuración para el servidor de correo - gmail en nuestro caso-.
Clase MimeMessage: Aquí formaremos el mensaje que deseamos enviar.
Clase MimeMessage: Aquí formaremos el mensaje que deseamos enviar.
Clase Transport: Clase para el envío de mensajes.
* Aplicativo para el envío de correos
Archivo smtp.properties : Archivo que contiene los parámetros de configuración.Ubicado en el paquete src/resource
#SMTP configuration mail.transport.protocol=smtp mail.host=smtp.gmail.com mail.smtp.auth=true mail.smtp.port=465 mail.smtp.socketFactory.port=465 mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory mail.smtp.socketFactory.fallback=false mail.smtp.quitwait=false mail.smtp.mail.sender=tuCorreo@gmail.com mail.user=tuCorreo@gmail.com mail.password=tuClaveGmail mail.email=tuCorreo@gmail.com
Clase SMTPConfig.java : Clase reutilizable para el envío de email.
package pedro.rios.mail; import java.security.Security; import java.util.Properties; import java.util.ResourceBundle; import javax.mail.Message; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; /** * @author pedro Rios * @date 10/12/09 * */ public class SMTPConfig { /** * @param titulo : titulo del mensaje * @param mensaje : Cuerpo del Mensaje * @param paraEmail : Email receptor del mensaje * @return true si el envío es conforme y false si no es así. */ public static synchronized boolean sendMail(String titulo, String mensaje, String paraEmail) { boolean envio=false; try { //carga del archivo smtp.properties final ResourceBundle props = ResourceBundle.getBundle("resource.smtp"); Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); //Propiedades de la conexion Properties propiedades = new Properties(); propiedades.setProperty("mail.transport.protocol", props.getString("mail.transport.protocol")); propiedades.setProperty("mail.host",props.getString("mail.host")); propiedades.put("mail.smtp.auth",props.getString("mail.smtp.auth")); propiedades.put("mail.smtp.port",props.getString("mail.smtp.port")); propiedades.put("mail.smtp.socketFactory.port",props.getString("mail.smtp.socketFactory.port")); propiedades.put("mail.smtp.socketFactory.class",props.getString("mail.smtp.socketFactory.class")); propiedades.put("mail.smtp.socketFactory.fallback",props.getString("mail.smtp.socketFactory.fallback")); propiedades.put("mail.smtp.mail.sender",props.getString("mail.smtp.mail.sender")); propiedades.setProperty("mail.smtp.quitwait",props.getString("mail.smtp.quitwait")); //Preparamos la Sesion autenticando al usuario Session session = Session.getDefaultInstance(propiedades,new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication(props.getString("mail.user"),props.getString("mail.password")); } }); //Preparamos el Mensaje MimeMessage message = new MimeMessage(session); message.setSender(new InternetAddress(props.getString("mail.email"))); message.setSubject(titulo); message.setContent(mensaje, "text/html; charset=utf-8"); message.setFrom(new InternetAddress(props.getString("mail.smtp.mail.sender"))); message.setReplyTo(InternetAddress.parse(props.getString("mail.smtp.mail.sender"))); if (paraEmail.indexOf(',') > 0) message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(paraEmail)); else message.setRecipient(Message.RecipientType.TO, new InternetAddress(paraEmail)); //envío del mensaje Transport.send(message); envio = true; } catch (Throwable e) { envio = false; System.out.println(e.getMessage()); e.printStackTrace(); }finally{ return envio; } } }
Clase de Prueba de envío de correo PruebaMail.java
package pedro.rios.mail; public class PruebaMail { public static void main(String[] args) { if(SMTPConfig.sendMail("Asunto del Mensaje"," Cuerpo del Mensaje.","destino@gmail.com")){ System.out.println("envío Correcto"); }else System.out.println("envío Fallido"); } }
Listo eso es todo. Solo nos queda ejecutar la clase PruebaMail.java ...
Para mayor información les dejo el link para descargar el libro Java Mail en Ejemplos de la Universidad de Málaga. .... Bueno amigos espero sus comentarios.. se despide de ustedes edisonjc7.
15 comentarios:
Me pareció revelador el uso que puede darse a este api. Gracias por la ilustración.
bueno lo que pasa es que use esta clase para enviar correos, hice una preuba enviandome un correo a hot mail y todo bien, pero cuando me envie un correo a cuentas de yahoo el correo llega directo a spam, hay forma de evitar esto???
He probado la clase enviando correos a gmail y al hotmail y todo perfecto... y otro propio del hosting donde realize la implementación y todo perfecto. Si has copiado todas las propiedades tal cual en teoría no debería ocurrir eso, ya que eso ocurre generalmente cuando se omite la propiedad message.setFrom() y message.setReplyTo().
Que tal Pedro, tal vez tu puedas ayudarme, acabo de crear una clase para el envío de correos de mi empresa echo en Java, pero no se si tu puedas ayudarme y dedicar un post pero para enviar correos a una lista de correos en MySql.
Tengo una lista de correos en MySql y quiero enviarles correos desde JAva.
Saludos
Primera opción,en tu clase controladora recorre la lista de correos una por una con un for y dentro del bucle le añades SMTPConfig.sendMail(con cada email de la lista); para enviar un correo a cada uno .Segunda opción, concatenas la lista de correos en un String y le añades al metodo SMTPConfig.sendMail(El String con todos los correos); para enviar un solo correo a todos. Eso sería todo lo que tendrías que hacer. Saludos Espero te sirva.
Tengo problemas con el puerto, cual seria el mas recomendable
El más recomendable es el 465, debe ser por algún proxy que tienes problemas pruebalo en otro ambienteo si no prueba con el puerto 587.
el archivo src.resource, em no lo encuentro, estoy diseñando una aplicacionsilla en Jdeveloper para enviar correos, puedes ayudarme porfavor?
buen tema man, gracias x compartirlo... !!
Hola,
Tengo un problemilla bien chafa :s...
Agrego el mail.jar y todos los .jar que estan que estan en el .zip de la descarga a la carpeta
WEB-INF/lib y creo un Java Package en Source Package y dentro una clase llamada mail, al momento de escibir:
import javax.mail
me dice que no existe :s estoy usando netBeans :s
why??? :(
Bueno ya pude, lo hice con otro metodo XD jajaj estoy bien chavo :P
viejo muchisimas gracias!!!
Muy buen aporte me sirvi mucha gracias por todo hermano
Hola, antes que nada gracias por este estupendo Post. Lo que estoy desarrollando es un envio Masivos(unos 100 000 correos html con adjunto). Me base en el codigo que utilizas y todo bien, pero al envio 10 000 marca error de OutOfMemoryError. Agregue los parametros: -Xms512m -Xmx1500m
Y pasa lo mismo, estoy usando JDeveloper.
Me puedes ayudar Por favor.?
De antemano Gracias.
Se agradece, haré la prueba hoy mismo... se ve sencillo y extremadamente útil
Publicar un comentario