SMTP EN JAVA

|

Enviar emails a través de un servidor SMTP autenticado con Java

El Correo Electrónico:

El correo electrónico es un servicio de red que permite intercambiar mensajesentre distintos usuarios de manera asíncrona; estos mensajes pueden contener o noficheros adjuntos. Según la el diccionario de la RAE el correo electrónico se definecomo: «Sistema de comunicación personal por ordenador a través de redes informáticas».

Muestra el funcionamiento básico del envío y recepción de unmensaje de correo electrónico entre dos usuarios llamados A y B.Los pasos que se siguen para enviar un mensaje desde A hasta B son:1.-El usuario A se prepara para enviar un correo electrónico al usuario B. Esteprocedimiento se puede realizar de dos formas:1.1.-El usuario A usa un programa de tipo MUA (Mail User Agent o Agentede Usuario de Correo), que son programas que se usan para crear y enviar(entre otras funciones) correos electrónicos, y entre los que se puedendestacar Microsoft Office Outlook , Mozilla Thunderbird, Eudora,Pegasus, etc. El usuario compone el mensaje y selecciona la opción deenviar. El MUA del usuario A le indica al servidor de correo de este usuario quién está enviando el mensaje y quiénes son los destinatarios, ya continuación envía el mensaje usando el protocolo SMTP (Simple MailTransfer Protocol - Protocolo Simple de Transferencia de CorreoElectrónico). Cuando el servidor recoge el mensaje y acepta transferirlohasta su destino, el MUA informa al usuario A que el envió ha tenidoéxito.1.2.-El usuario A usa directamente su servidor de correo electrónico vía web.Esta forma de acceder al correo electrónico se conoce como WebMail oCorreo Web. Se trata de un servicio que permite el acceso al correomediante páginas web, usando para ello un navegador. Para ello, elusuario ha de autenticarse en el servidor introduciendo su nombre deusuario y contraseña; a continuación compone el mensaje y selecciona laopción de enviar. Entre las ventajas de este método se puede decir que losmensajes no se descargan al ordenador, es posible acceder desde cualquiermáquina sin que tenga que tener ningún software específico (todos lossistemas operativos suelen incluir un navegador web) y la creación de unacuenta de correo es más sencilla que desde un programa MUA. Laprincipal desventaja es que el espacio de almacenamiento de mensajes selimita a lo que ofrece el servidor de correo, en lugar de la capacidad dealmacenamiento del propio disco duro que ofrece un programa MUA.Además requiere una conexión permanente a Internet mientras lo usemosy los mensajes ocupan bastante más espacio pues van embebidos enHTML, lo que implica que tardan más en enviarse.2.-El mensaje es almacenado en el servidor de correo del usuario A
.3.-El servidor de correo del usuario A solicita al del usuario B el nombre delservidor al que tiene que enviar el mensaje. El servidor del usuario B se conocegracias a la parte de la dirección de correo que sigue a la arroba, ej. @gmail.com.4.-El servidor de correo del usuario B le responde al del usuario A, enviándole unregistro MX (MX record), que es un registro de correo. En este registro constanlas direcciones de correo que pertenecen a un dominio concreto y la máquina quese corresponde con cada dirección. Así cuando se envía un correo, se compruebaen la lista de registros MX de ese dominio si contiene esa dirección de correo, noaceptándola en caso contrario. En el registro MX pueden aparecer distintasmáquinas, estableciéndose prioridades entre ellas o balanceando la carga decorreo por las distintas máquinas. Por ejemplo un servidor le devolverá al otrouna lista con una serie de máquinas en orden de prioridad. Si al enviar el correoa la primera máquina esta fallase o estuviese saturada, se enviaría a la segunda,y así sucesivamente.5.-El servidor de correo del usuario A envía entonces el mensaje al servidorcorrespondiente a esa dirección de correo, usando el protocolo SMTP. 6.-El mensaje es almacenado en el servidor de correo del usuario B y se coloca enel buzón de correo del usuario.7.-El último paso sería la lectura del mensaje por parte del usuario B, lo que sepuede llevar a cabo de 3 formas:7.1.-El usuario B accede directamente a su servidor de correo vía webmail ylee sus mensajes del servidor sin descargarlos.
El usuario B accede a su correo a través de un programa de tipo MUA. Silo hace de esta forma tiene dos opciones:7.2.1.-Descargar los mensajes a su máquina usando el protocolo POP3(
Post Office Protocol
- Protocolo de Oficina Postal versión 3).7.2.2.-Descargar los mensajes a su máquina o leerlos directamente enel servidor usando el protocolo IMAP (
Internet Message AccessProtocol
- Protocolo de Internet para el Acceso a MensajesElectrónicos)

SMTP (Simple Mail Transfer Protocol)

El protocolo SMTP es un protocolo que se usa para el envío de correoelectrónico (Protocolo Simple de Transferencia de Correo Electrónico). SMTPtransfiere los mensajes desde la máquina cliente al servidor, quedándose este últimocon el mensaje, si se trata del destino final, o transfiriéndolo a otro servidor, tambiénvía SMTP, para que el mensaje llegue al servidor del destinatario. El protocolocompleto está descrito en los RFC 821 y 822, donde se define el funcionamiento deSMTP y el formato de mensaje respectivamente. Estos RFC han sido actualizados porlos RFC 2821 y 2822 (http://www.faqs.org/rfcs/rfc2821.html yhttp://www.faqs.org/rfcs/rfc2822.html).Algunas de las características de SMTP son las siguientes:• Utiliza el puerto 25 para establecer la conexión.• Se pueden comunicar entre sí servidores de plataformas distintas.• Dos sistemas que intercambien correo mediante SMTP no necesitan unaconexión activa, ya que posee sistema de almacenamiento y reenvío demensajes, es decir, si el receptor no está disponible el mensaje será reenviadoposteriormente.Algunos de los principales problemas de SMTP en su forma original son:• Falta de soporte para idiomas distintos del inglés pues solo acepta caracteresASCII de 7 bits, lo que impedía usar caracteres propios de otros idiomascomo la ñ o los acentos.• Los datos no viajan de forma segura.• Facilita la expansión del spam, pues no requiere autenticación en el servidor.Estos problemas se han ido solventando con distintas revisiones de SMTP.El uso de códigos de 8 bits se puede conseguir empleando ESMTP (Extended SMTP-SMTP Extendido) o mediante extensiones MIME. También existe una revisión para trabajar con SMTP seguro sobre TLS , lo que permite un transporte más seguro de los datos; esta revisión se define en el RFC 3207. Por último, comentar la extensióndefinida en el RFC 2554 que introduce el comando AUTH, lo que permiteautenticación frente al servidor. Si bien los problemas que planteaba el SMTP básico se han mejorado, elproblema del spam sigue sin solucionarse, por lo que ya se proponen mecanismosalternativos para definir una infraestructura de correo, como Internet Mail 2000(http://www.im2000.org./).La API JavaMailJavaMail es una API opcional a la versión estándar de Java (J2SDK) queproporciona funcionalidades de correo electrónico, a través del paquete javax.mail.Permite realizar desde tareas básicas como enviar, leer y componer mensajes, hastatareas más sofisticadas como manejar gran variedad de formatos de mensajes y datos,y definir protocolos de acceso y transporte. Aunque a primera vista pueda parecer quesu utilidad se orienta a construir clientes de correo-e de tipo Outlook, ThunderBird,etc., su aplicación se puede generalizar a cualquier programa Java que necesite enviary/o recibir mensajes, como por ejemplo, aplicaciones de intranets, páginas JSP, etc.JavaMail soporta, por defecto, los protocolos de envío y recepción SMTP,IMAP, POP3 y las versiones seguras de estos protocolos SMTPS, IMAPS, POP3S(estos 3 últimos a partir de la versión JDK 1.3.2), si bien puede implementar otrosprotocolos. El envío y recepción son independientes del protocolo, aunque podremosnecesitar usar un protocolo u otro según nuestras necesidades
Posibilidades de JavaMail
JavaMail está diseñada para facilitar las funcionalidades más comunes, sibien también posee características más avanzadas, que permiten sacar el máximopartido a los estándares de correo electrónico. Las funciones más importantes sedetallan a continuación:• Componer y enviar un mensaje: el primer paso que ha de realizar cualquieraplicación que pretenda enviar un correo electrónico es componer elmensaje. Es posible crear un mensaje de texto plano, es decir, un mensaje sinadjuntos que contenga exclusivamente texto formado por caracteres ASCII;pero es igualmente sencillo componer mensajes más completos quecontengan adjuntos. También se pueden componer mensajes que contengancódigo HTML e incluso imágenes embebidas en el texto.• Descargar Mensajes: se pueden descargar los mensajes desde la carpeta quese indique ubicada en el servidor que en ese momento se esté usando. Estosmensajes pueden ser de texto plano, contener adjuntos, HTML, etc.• Usar flags (banderines): para indicar, por ejemplo, que un mensaje ha sidoleído, borrado, etc., en función de cuáles de estos flags estén soportados porel servidor. • Establecer una conexión segura: actualmente algunos servidores de correorequieren de una conexión segura, ya sea para descargar el correoalmacenado en ellos, o para enviar mensajes a través de ellos. JavaMailofrece la posibilidad de establecer este tipo de conexiones, indicando que setrata de una conexión segura, además de poder indicar otros parámetros, enalgunos casos necesarios, como el puerto donde establecer la conexión. Estacapacidad está disponible desde la versión de JDK 1.3.2• Autenticarse en un servidor: ciertos servidores requieren autenticación ya nosólo para leer sino también para enviar. JavaMail ofrece también laposibilidad de autenticación a la hora de enviar un correo.• Definir protocolos: JavaMail soporta por defecto los protocolos de envío yrecepción SMTP, IMAP, POP3, (y sus correspondiente seguros a partir dela versión de JDK 1.3.2), si bien puede implementar otros protocolos. Parausar otros protocolos, o desarrollar por nuestra cuenta soporte para algúnprotocolo no definido por defecto en JavaMail, podemos es posible consultarla página de Sun, http://java.sun.com/products/javamail/Third_Party.html
,donde se detallan una serie de protocolos que podemos usar, y que no seofrecen por defecto con JavaMail ya que no son estándares. • Manejar adjuntos: JavaMail ofrece la posibilidad de añadir adjuntos a losmensajes de salida, así como obtener y manipular los adjuntos contenidos enun mensaje de entrada.• Búsquedas: JavaMail ofrece la posibilidad de buscar mensajes dentro de lacuenta de correo en el propio servidor -sin necesidad de descargar todo elcorreo- que concuerden con un criterio de búsqueda previamente definido.Para ello dispone de varias clases que permiten buscar mensajes con un subject determinado, un from concreto, etc., devolviendo un array con losmensajes que cumplan estos criterios. En el capítulo 7 veremos esto con másdetenimiento.• Acuse de recibo y prioridad: Se puede incluir un acuse de recibo en losmensajes de salida, para que el remitente sepa si un mensaje ha sido leído ono por el destinatario, si bien no todos los servidores soportan estafuncionalidad. Además se puede establecer la prioridad de un mensaje deforma muy sencilla.

CODIGO:

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

public class JavaMailSamples
{

public static void main(String[] args)
{

SendAuthentication.Send();

}

}

class SendAuthentication
{

public static void Send()
{

String host ="172.16.18.29";//Suponiendo que el servidor SMTPsea la propia máquina
String from ="lizbeth@unitek.com";
String to = "genesis_dcta@hotmail.com";


System.out.println ("Prueba para enviar un mail..." + new java.util.Date());

Properties prop = new Properties();

prop.put("mail.smtp.host", host);
/*Esta línea es la que indica al API que debe autenticarse*/
prop.put("mail.smtp.auth", "true");

/*Añadir esta linea si queremos ver una salida detallada del programa*/
//prop.put("mail.debug", "true");

try{

SMTPAuthentication auth = new SMTPAuthentication();
Session session = Session.getInstance(prop , auth );
Message msg = getMessage(session, from, to);
System.out.println ("Enviando ..." );

Transport.send(msg);

System.out.println ("Mensaje enviado!");

}

catch (Exception e)
{

ExceptionManager.ManageException(e);

}

}

private static MimeMessage getMessage(Session session, String from, String to)
{

try{

MimeMessage msg = new MimeMessage(session);
msg.setText("El mail desde java. Este mensaje a utilizado autenticacion en el servidor.");
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setFrom(new InternetAddress(from,"JavaMail en accion"));
return msg;

}

catch (java.io.UnsupportedEncodingException ex)
{

ExceptionManager.ManageException(ex);
return null;

}

catch (MessagingException ex)
{

ExceptionManager.ManageException(ex);
return null;

}

}

}

class SMTPAuthentication extends javax.mail.Authenticator
{

public PasswordAuthentication getPasswordAuthentication()
{

String username = "lizbeth@unitek.com";

String password = "123456";

return new PasswordAuthentication(username, password);

}

}

class ExceptionManager
{

public static void ManageException (Exception e)
{

System.out.println ("Se ha producido una exception");

System.out.println (e.getMessage());

e.printStackTrace(System.out);

}

}

0 comentarios:

Publicar un comentario