InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
También puedes ver ...
Oracle compra Sun Microsystems
Como conectar a ORACLE con Java
Recuperar datos BLOB de ORACLE
PL/SQL y Java
J2EE Y .NET: LA RIVALIDAD PERMANENTE


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

Como ya he explicado en la introducción a este articulo, no hace mucho que tuve que realizar un programa en Java que enviara emails.

Lo primero que necesitamos para enviar emails es un servidor SMTP (Single Mail Transmision Protocol), normalmente nuestro administrador de red nos dará la dirección de este servidor, pero si no disponemos de servidor SMTP podemos bajar uno facilmete de internet.

Para la realización de este articulo he utilizado el servidor QK SMTP Server , de QKSoft.  Podemos descargar una versión de evaluación de este programa pulsando en este enlace.  QK SMTP Server

El siguiente paso que debemos dar es decargar e instalar el API JavaMail, que contiene el conunto de  clases que nos van a permitir conectar con el servidor SMTP y enviar emails. Además necesitamos la última versión de JAF Activation.

Para descargar el API JavaMail, http://java.sun.com/products/javamail/downloads/index.html

Para descargar JAF Activation, http://java.sun.com/products/javabeans/glasgow/jaf.html 

Los ficheros .zip obtenidos de las descargas anteriores continen abundante documentación y los archivos java (.jar)  que necesitamos. Debemos extraer los archivos .jar y modificar nuestro CLASSPATH para incluirlos. Casi todos los IDE de Java permiten agregar referencias a los archivos .jar, y es el propio IDE quien se encarga de generar la variable CLASSPATH correcta en el momento de compilar. 

Si queremos un tutorial completo sobre el API JavaMail tenemos uno en el siguiente enlace http://www.programacion.com/java/tutorial/javamail/.

El siguiente programa muestra como enviar un email contra un servidor que requiere autenticación.

El programa está compuesto por las siguientes clases:

  • JavaMailSamples, que contiene el método main y sirve como punto de entrada del programa.
  • SendAuthentication, que nos proporciona un método estático Send  que es el encargado de enviar el email.
  • SMTPAuthentication, que es la clase que se encarga de proporcionar el nombre de usuario y clave de acceso al servidor SMTP.
  • ExceptionManager, que es la clase que se encarga de gestionar las posibles excepciones.

El listado de programa es el siguiente:

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 ="127.0.0.1";//Suponiendo que el servidor SMTPsea la propia máquina
String from =
"remitente";
String to =
"destinatario";


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 = "nombre_de_usuario";

String password = "clave";

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);

}

}

Ahora vamos a explicar brevemente el programa. El punto de entrada es la clase JavaMailSamples, que únicamente llama al método Send de la clase SendAuthentication. Lógicamente realizamos las importaciones necesarias para la correcta compilación del código.

El método Send de la clase SendAuthentication es quien realmente realiza todo el trabajo. El método comienza definiendo las variables que se utilizan en el proceso, remitente, destinatario, servidor SMTP .... 

Creamos un objeto Properties y le añadimos dos entradas, "mail.smtp.host",con el servidor SMTP que queramos utilizar y "mail.smtp.auth" , dandole el valor true, si no añadimos esta entrada al Properties se producirá una excepción al enviar el mensaje y no se producirá la autenticación en el servidor.

A continuación creamos un objeto de la clase SMTPAuthentication, esta clase está definida a continuación de SendAuthentication. La clase hereda de  javax.mail.Authenticator, que es una clase abstracta proporcionada por el API JavaMail. En dicha clase debemos implementar el método  getPasswordAuthentication(), definido como abstracto en la clase base, y que devuelve un objeto de tipo PasswordAuthentication. El objeto PasswordAuthentication proporcionará al API el nombre de usuario y clave que le indicamos en el constructor. El API JavaMail ya sabe en que momento debe utilizar estos datos. 

Con nuestros objetos Properties y SMTPAuthentication creamos un objeto Session a través del método estatico getInstance() de la propia clase Session.La clase Session pertenece al API y define la sesion utilizada para establecer la conexión con el servidor. Hemos aislado la formación del mensaje en el método getMessage(), que devuelve un objeto MimeMessage, tambien definido por el API, y que representa el mensaje a enviar.

Por último enviamos el mensaje a través del método estático send de la clase Transport. La clase Transport es la clase encargada de la entrega de mensajes al servidor.

La clase ExceptionManager únicamente imprime un mensaje en pantalla indicandonos que se ha producido una excepción.

Con esto hemos conseguido enviar el email.

Saludos a todos y hasta la proxima,

Devjoker.


 Versión para imprimir  Foros de consulta

 
Adjuntar archivos a email en pl/sql por Erick Marquez
Respuesta recibida el [01/06/2007 05:46:25]
HOLA! Por favor, alguien me puede decir cómo adjunto un archivo pdf a mi email cuyo código está en pl/sql??? ewmr11@cantv.net, erick.marquez@premierseguros.com

 
muy currado tío por opalo
Respuesta recibida el [28/11/2007 02:14:16]
Gracias por el código. Me ha sido de mucha ayuda.
Un saludo.

 
tengo un gran problema por ALAN
Respuesta recibida el [23/01/2008 06:47:59]
hola, tengo un problema con el codigo, en la variable from y to asigne los valores:
from = "micorreo@hotmail.com";
to = "correodestino@hotmail.com";

y en la clase SMTPAuthentication en la variables username y password asigno:

username = "micorreo@hotmail.com";
password = "micontraseña";

bueno cuando compilo me manda este error:

javax.mail.AuthenticationFailedException
at javax.mail.Service.connect(Service.java:306)
at javax.mail.Service.connect(Service.java:156)
at javax.mail.Service.connect(Service.java:105)
at javax.mail.Transport.send0(Transport.java:168)
at javax.mail.Transport.send(Transport.java:98)
at JavaMail.SendAuthentication.Send(JavaMailSamples.java:56)
at JavaMail.JavaMailSamples.main(JavaMailSamples.java:23)

BUENO ESPERO SU AYUDA O ES QUE ESTOY ASIGNADO LOS VALORES INCORRECTOS.
a ver si me dan una ayudadita mi correo es alanmiki@hot....

 
J2EE enviar listas de email por Alex Ec
Respuesta recibida el [05/02/2008 04:42:38]
Hola a todos voy a realizar mi proyecto de fin de carrera y desaeria ayuda y orientacionpara crarme una aplicacion J2EE con jsp y beans para enviar listas de correo.

 
ayudarme por Christopher
Respuesta recibida el [26/02/2008 11:50:56]
soy nuevo en esto ice un servidor pero no resive mensaje favor de ayudarme email is christopher.cedeno@hotmail.com o gmail.com o elduroxp@gmail.com

 
Otra mamada... por Miguel Guerrero
Respuesta recibida el [09/04/2008 11:50:26]
Sigue siendo lo mismo, explicas lo mismo que los demas tutoriales, pero no das tips claves, otro manual mas, ahi se queda.

 
Una pregunta por Max
Respuesta recibida el [16/04/2008 05:02:00]
Oye hermano necesito una ayuda, como puedo enmascarar la direccion del remitente para que esta no se muestre o de lo contrario poder motrar otra direccion al Destinatario

 
muy util por jesus
Respuesta recibida el [17/07/2008 03:16:12]
hola,
incluir los jars desde los links,
copipastear el codigo
y configurar el from to host y username/password y funciona prefectamente.
Muchas gracias

 
Cual es el host para gmail, hotmail por Alejandro
Respuesta recibida el [29/07/2008 12:06:42]
Hola que tal me funciona de maravilla con el host de yahoo(smtp.mail.yahoo.com.mx) pero no he podido hacerlo para gmail hotmail y demas a que se debe... 
P.D. Gracias por tus aportaciones son excelentes

 
Como instalo y de donde bajo javax por ayuda con javax
Respuesta recibida el [05/08/2008 01:05:21]
Soy nuevo en Java y copié el código de arriba para probarlo y ver que hacia pero me marca el error:
JavaMailSamples.java:1: package javax.activation does not exist
import javax.activation.*;

y todos los que tienen que ver con javax, yo pensé que ya lo tenia instalado mi jdk pero al parecer no, la version de mi jdk es 1.5 (creo)

Gracias

 
Mejoras por Guillermo
Respuesta recibida el [09/10/2008 09:41:23]
Muy bueno el tutorial, una recomendación si me permiten, al user, pass y IP del SMTP server guardenlos en properties, y encriptadas sería mejor.

 
Bien por Walter
Respuesta recibida el [17/11/2008 04:14:47]
Primer codigo para enviar mail que funciona de verdad. Gracias.

 
duda por ignacio
Respuesta recibida el [04/12/2008 02:00:56]
que parametros debo cambiar para que funcione

 
duda por ignacio
Respuesta recibida el [04/12/2008 02:02:27]
debo tener un servidor, o en una pc normal con qk smtp servidor intalado

 
duda por ignacio
Respuesta recibida el [04/12/2008 02:49:01]
como le hicieron para el caso de yahoo

 
Excelente material por Gustavo
Respuesta recibida el [20/01/2009 11:14:16]
Pedro, excelente tu publicación, de muy simple instalación.

Ha sido de gran utilidad.
Muchas Gracias

 
Problemas Codigo por Ruben
Respuesta recibida el [20/01/2009 03:30:16]
El editor de Java que tengo me marca demasiados errores en sintaxis en varias lineas del codigo: linea:
8,12,22,25,30,31,32,38,51,52,53,67,68,70,72,76,79,80,83,85,86,87,88,89,91,93,94,etc,etc,etc. cual seria la sugerencia pera resolverlo, o esto es normal?

 
como tan pavos por francisco
Respuesta recibida el [23/01/2009 01:49:12]
abren el QK SMTP Server
luego se van a settings/users
crean un usuario y lo ingresan a la clase java y listo


 
exelente por andres p
Respuesta recibida el [11/02/2009 09:13:29]
al fin un tutorial que explica claro como funciona, todo estuvo ok

 
unsupporteddatatypeexception por favrycio
Respuesta recibida el [16/02/2009 09:08:26]
javax.activation.unsupporteddatatypeexception?

Este problema se me presenta en una maquina si y en otras no, es una aplicacion swing. a alguien mas le pasa esto?

 
Agradecimiento por Abraham
Respuesta recibida el [20/02/2009 12:05:21]
Gracias la verdad me ha servido de muchos, agradezco que todavia haya gente pro y que comparta sus conocimientos para que todos mejoremos thx

 
coment por fernando
Respuesta recibida el [26/02/2009 12:47:42]
muy buen codigo, funciona de maravilla gracias.

 
buen codigo , pero me gustaria... por program
Respuesta recibida el [29/03/2009 04:55:28]
buen codigo , pero me gustaria conocer otros host diferentes, por ejemplo hotmail, para enviar correos de este, lo intente con 

InetAddress addr = InetAddress.getByName("hotmail.com");
System.out.println(addr.getHostAddress());

pero no funciona con la direccion del host que me da como resultado este codigo

gracias

 
chupenme las bolas por domingaso
Respuesta recibida el [02/04/2009 07:41:55]
Hola a todos, chupenme las bolas, soy domingaso alias giovanni

 
chupenme las bolas por domingaso
Respuesta recibida el [02/04/2009 07:42:15]
Hola a todos, chupenme las bolas, soy domingaso alias giovanni

 
son putos los programadores por gabo
Respuesta recibida el [02/04/2009 07:43:19]
Soy gabriel del cecyt 9 del politecnico, y pienso que todos los programadores son putos, jajajaja

 
Error del socjet por Juan Carlos
Respuesta recibida el [07/04/2009 10:17:56]
Como estan necesito su ayuda gente, miren me esta saliendo un error de socket en el QK SMPT y no se a que se debe ayuden....
GRACIAS

 
Como hago mi servidor SMTP por gcguerrero
Respuesta recibida el [25/04/2009 09:12:05]
No se como hacer mi máquina un SMTP Server, tengo Windows Vista....
Oh necesariamente debo estar conectado a internet para probarlo o tener un windows server_
Alguien que me ayude

 
Adjuntar por roneypc
Respuesta recibida el [27/04/2009 04:57:03]
Hola, el código funciona perfectamente pero, como puedo adjuntar archivos en los mails? Tienes algo sobre esto?
Thanks..

 
Muy bueno, realmente por Pablo
Respuesta recibida el [13/06/2009 11:35:04]
Muy bueno che el mensaje, he probado muchos tutoriale y el mejor.  el problema es que con gmail nose porque no me funcoina

 
gracias por el post por michael rodas
Respuesta recibida el [06/09/2009 08:41:44]
man muchas gracias por el post, sabes cómo hacer eso en java faces en un jsp? no se cómo hacerlo
mi correo es hollowlife7@gmail.com si me puedes ayudar eso sería estupendo, gracias

 
Servidor SMTP por hibis
Respuesta recibida el [26/11/2009 07:12:30]
necesito enviar Mail a todos los dominio, ejemplo@XXX.com.xx, como lo podria hacer..gracias mi correo es hibis@hotmail.com en asunto : mandar mail en java

 
que haces por daniel
Respuesta recibida el [10/12/2009 10:17:34]
 hola

 
No es otra mamad.. mas... por Lupis
Respuesta recibida el [18/02/2010 12:38:37]
Hola, yo entre aqui buscando ayuda, buscando tips como dicen arriba, pues ya tenia un código, en fin, copie y pegue este y seguia sin correr, depues de varias cosas me di cuenta que lo que me faltaba era la libreria JAF la agregué y con esto ya mi mensaje se envió y es desde un dominio comprado para la pagina del negocio de donde trabajo osea que tambien corre en otros no nomas en yahoo, si de algo les sirve la ayuda ahi les va lo que yo cambie en este codigo:
*Cambie el nombre del host, para esto, llame a mi proveedor del dominio y pregunte por el nombre del servidor smtp.
*Cambie el usuario y contraseña, igual esto te la asignan o las creas, si usas el host de yahoo obvio tu username sera algo@yahoo.com etc..

y con esto ya pude ahora solo investigare como enviar una imagen adjunta :D


 
Para Gmail Tambien Sirve... por Rafael
Respuesta recibida el [07/03/2010 01:34:08]
Para gmail tambien sirve.. lo que pasa es que smtp utiliza por defecto el puerto 25, pero gmail no utiliza ese puerto.. Utiliza el puerto 465..

Asi que si quieren enviar mail a gmail
deben adicionar..

prop.put("mail.smtp.port", "465");

Y listo..


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



 Versión para imprimir

Enviar emails a través de un servidor SMTP autenticado con Java
Autor: Pedro Herrarte Sánchez
Visitas: 33325 Fecha de publicación: 18/10/2005
Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación.

Posee mas de diez años de experiencia trabajando para las principales empresas de España.

Es especialista en tecnologías .NET, entornos Web, bases de datos (SQL Server y ORACLE) e integración de sistemas.

Es experto en desarrollo (C#, ASP.NET, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE).

Es fundador, diseñador y programador de www.devjoker.com.




Visitas: 89 | Comentarios: 2 | Archivo: Articulos
02/02/2010 iPad vs Telesketch
Visitas: 794 | Comentarios: 2 | Archivo: Articulos
Categorias: Humor
Visitas: 749 | Comentarios: 3 | Archivo: Articulos
Visitas: 3144 | Comentarios: 2 | Archivo: Articulos
Categorias: C#
Visitas: 14504 | Comentarios: 7 | Archivo: Articulos
Categorias: C#|Seguridad
Visitas: 1478 | Comentarios: 3 | Archivo: Articulos
Visitas: 691 | Comentarios: 2 | Archivo: Articulos
Visitas: 369 | Comentarios: 0 | Archivo: Articulos
Visitas: 2012 | Comentarios: 2 | Archivo: Articulos
Categorias: C#

Útimos temas recibidos en los foros ...
certificado de pensiones del bbva horizonte por danger ... [Actualidad] 123 12/01/2010
certificado de pensiones horizonte por ruby ... [Actualidad] 32 14/02/2010
jalar datos a un listbox por happypeace31 ... [Visual Basic .NET] 1 21/09/2009
fecha valida datetimepicker por jess ... [Visual Basic .NET] 1 04/03/2010
Mi numero de autogenerado por chari ... [Visual Basic .NET] 4 01/03/2010
quiero saber en que entidad estoy afiliada a cesantias y pensiones por adriana ... [WIN 98/NT/2000/XP] 23 28/11/2009
Certificado de afiliacion Pensiones y Cesantias por VIVIANA ... [Actualidad] 1 10/03/2010
CERTIFICADO por LIZETH ... [Actualidad] 0 11/03/2010
certificado de afiliación de pensiones y cesantias por secre ... [Actualidad] 111 28/01/2010
Solicitud certificado de afiliaciones a pensiones y cesantias proteccion por hz ... [Actualidad] 54 10/02/2010
certificado pensiones horizonte por angela patricia rodriguez ... [Actualidad] 135 26/01/2010
pensiones por eduard ... [Visual Basic 6.0] 0 11/03/2010

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
02/09/2007 Procedimientos almacenados en Transact SQL    forma parte de...Tutorial de Transact SQL
09/11/2006 Interfaces    forma parte de...Tutorial C#
01/01/2006 Borrado de datos. DELETE    forma parte de...Tutorial SQL
22/10/2005 Insertar datos. INSERT    forma parte de...Tutorial SQL
11/10/2006 Métodos    forma parte de...Tutorial C#
24/12/2009 Encriptación con AES Rijndael - Ejemplo
12/01/2006 Programación con PL/SQL    forma parte de...Tutorial PL/SQL
01/04/2006 Estructuras de control en PL/SQL    forma parte de...Tutorial PL/SQL
31/03/2006 Fundamentos de PL/SQL    forma parte de...Tutorial PL/SQL
25/03/2008 Sitios Web de ejemplo ASP.NET

 

Encuesta
¿A que perfil te adaptas mejor?




[Ver] [Votar]