Java Gmail
En el siguiente contenido consta de dos partes:
En la primera explicare como establecer una conexión con Gmail con el protocolo smpt y bajo la capa de conexión segura(SSL).
En la segunda voy a explicar acerca de una clase(Gmail.java) que podemos re-utilizar para el envio de correos electronicos desde nuestros proyectos en Java.
Parte 1 – Proceso básico del envío de correos electrónicos:
Lo primero vamos a explicar cual es el procedimiento básico de envíos de correos electrónicos con SMTP con Java utilizando la API de: Javax.mail , el cual el proceso básico consiste en tres partes:
- Establecer las propiedades de la conexión.
- Autenticarse y establecer una sesión.
- Agregando atributos del email y envio.
Como se comento vamos a ocupar javax.mail
la cual sera una dependencia de nuestro código, para resolver dicha dependencia podemos ocupar maven:
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4</version>
</dependency>
O bien lo puedes descargar el .jar desde:
http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html#javamail-1.4.7-oth-JPR
1.- Estableciendo propiedades
Lo primero que tenemos que hacer es definir las propiedades de nuestra conexión para esto ocupamos el paquete java.util.Properties donde vamos a establecer el puerto 465 y activamos la autenticación con capa SSL.
// Paso 1 estableciendo las propiedades de conexión
java.util.Properties mailServerProperties;
mailServerProperties = System.getProperties();
mailServerProperties.put("mail.smtp.host", "smtp.gmail.com");
mailServerProperties.put("mail.smtp.socketFactory.port", "465");
mailServerProperties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
mailServerProperties.put("mail.smtp.auth", "true");
mailServerProperties.put("mail.smtp.port", "465");
2.- Autenticandose
Vamos a identificarnos y establecer sesión para esto ocupamos el paquete javax.mail.Session, como se ve a continuación:
javax.mail.Session getMailSession = Session.getDefaultInstance(
mailServerProperties,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("mi.cuenta@gmail.com", "mi password");
}
});
3.- Enviado el correo
Enviando el correo
javax.mail.internet.MimeMessage generateMailMessage;
generateMailMessage = new MimeMessage(getMailSession);
//Estableciendo el destino (TO)
generateMailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress("destino@server.com"));
//Estableciendo el destino de la copia (CC)
generateMailMessage.addRecipient(Message.RecipientType.CC, new InternetAddress("con.copia@gmail.com"));
//Estableciendo el destino de la copia oculta (BCC)
generateMailMessage.addRecipient(Message.RecipientType.BCC, new InternetAddress("bcc@hotmail.com"));
//Estableciendo el titulo del mensaje (subject)
generateMailMessage.setSubject("titulo del mensaje a enviar");
// Estableciendo el contenido del correo electronico enriquesido(HTML)
String bodyEmail = "<h1>correo desde gmail</h1><p>Enviado de forma exitosa</p>";
generateMailMessage.setContent(bodyEmail, "text/html");
//Finalmente enviamos el correo
javax.mail.Transport.send(generateMailMessage);
Parte 2 .- Clase Gmail Una clase lista para enviar desde Gmail
Vamos a crear una clase llamada Gmail
en donde le vamos a agregar lo anterior explicado a la vez que la creamos de una forma que sea muy fácil de reutilizar, veamos como quedaría:
package com.mundosica.core.Utils;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class Gmail {
static Properties mailServerProperties;
static Session getMailSession;
static MimeMessage generateMailMessage;
static String login = "username";
static String password = "secret";
static String to = null;
static String cc = null;
static String bcc = null;
static String subject = null;
static String body = null;
public static void config(String... namesAndValues) {
if (namesAndValues.length % 2 == 1) {
throw new IllegalArgumentException("The number of arguments must be pair.");
}
String nameConfig = null, valueConfig = null;
for (int i = 0; i < namesAndValues.length - 1; i += 2) {
nameConfig = namesAndValues[i].trim().toLowerCase();
valueConfig = namesAndValues[i +1];
switch (nameConfig) {
case "username":
case "login":
Gmail.login = valueConfig;
break;
case "password":
case "pass":
Gmail.password = valueConfig;
break;
case "to":
Gmail.to = valueConfig;
break;
case "cc":
Gmail.cc = valueConfig;
break;
case "bcc":
Gmail.bcc = valueConfig;
break;
case "title":
case "subject":
Gmail.subject = valueConfig;
break;
case "msg":
case "body":
Gmail.body = valueConfig;
}
}
}
public static Boolean send(String... namesAndValues) {
Gmail.config(namesAndValues);
try {
return Gmail.send();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
public static Boolean send() throws AddressException, MessagingException {
Boolean success = false;
// step 1 set connection properties
mailServerProperties = System.getProperties();
mailServerProperties.put("mail.smtp.host", "smtp.gmail.com");
mailServerProperties.put("mail.smtp.socketFactory.port", "465");
mailServerProperties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
mailServerProperties.put("mail.smtp.auth", "true");
mailServerProperties.put("mail.smtp.port", "465");
// step 2 Authentication
if (Gmail.login == null || Gmail.password == null) {
return success;
}
Session getMailSession = Session.getDefaultInstance(mailServerProperties,new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(Gmail.login, Gmail.password);
}
});
// step 3 sending Email
generateMailMessage = new MimeMessage(getMailSession);
if (Gmail.to != null) {
generateMailMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(Gmail.to));
}
if (Gmail.cc != null) {
generateMailMessage.addRecipient(Message.RecipientType.CC, new InternetAddress(Gmail.cc));
}
if (Gmail.bcc != null) {
generateMailMessage.addRecipient(Message.RecipientType.BCC, new InternetAddress(Gmail.bcc));
}
if (Gmail.subject == null) {
Gmail.subject = "subject gmail object";
}
generateMailMessage.setSubject(Gmail.subject);
if (Gmail.body == null) {
Gmail.body = "<h1>body gmail object</h1><p>it's a simple test</p>";
}
generateMailMessage.setContent(Gmail.body, "text/html");
javax.mail.Transport.send(generateMailMessage);
return success;
}
}
Test Haciendo una prueba
Haciendo una prueba con Junit, dejo dos ejemplos de como utilizar la clase Gmail:
import org.junit.Test;
public class GmailTest {
@Test
public void testSendDirecto() {
Gmail.send(
"login", "some.user@gmail.com",
"password", "secret",
"to", "edw_inkisidor@hotmail.com",
"cc", "chanerec@gmail.com",
"bcc", "eymard@gmail.com",
"subject", "prueba de email",
"body", "<h1>Esto es una prueba de envio de correos</h1><p>exitosa!!</p>"
);
}
@Test
public void testConfigYSend() {
//Esto quizas en el archivo de configuracion
Gmail.config(
"username", "some.user@gmail.com", //alias de login
"pass", "**secret**", //alias de password
"to", "edw_inkisidor@hotmail.com",
"cc", "chanerec@gmail.com",
"bcc", "eymard@gmail.com"
);
//esto en donde se envia el correo previamente ya configurado los parametros
Gmail.send(
"title", "prueba de email",//alias de subject
"msg", "<h1>Esto es una prueba de envio de correos</h1><p>exitosa!!</p>"
);
}
}
Código en github
Este código forma parte de un conjunto de clases que hemos desarrollado en mundosica.com, del cual extraje esta parte y lo dejo en github para quien lo guste usar:
Visitar proyecto