Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Enviar emails desde java

Estas en el tema de Enviar emails desde java en el foro de Java en Foros del Web. Hola gente!!! estoy enviando emails desde java utilizando javamails, el problema es que me tarda demasiado en enviar un email, una media de 2-4 segundos, ...
  #1 (permalink)  
Antiguo 05/06/2013, 12:50
Avatar de rgf1987  
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 11 años, 4 meses
Puntos: 22
Enviar emails desde java

Hola gente!!!

estoy enviando emails desde java utilizando javamails, el problema es que me tarda demasiado en enviar un email, una media de 2-4 segundos, lo cual, desde mi punto de vista es muchisimo

el codigo es el siguiente:

Código JAVA:
Ver original
  1. public class Correo {
  2.     Properties props = new Properties();
  3.    
  4.     public void enviarCorreo(String emailDestino, String subject, String body, String otherDates)
  5.     {
  6.         Correo obj = new Correo();
  7.         String server = "smtp.gmail.com";
  8.         String userName = "[email protected]";
  9.         String password = "rootroot";
  10.         String fromAddres = "todomotorrevista";
  11.         String toAddres = emailDestino;
  12.         String cc = "";
  13.         String bcc = "";
  14.         boolean htmlFormat = false;        
  15.        
  16.         obj.sendMail(server, userName, password, fromAddres, toAddres, cc, bcc,
  17.                      htmlFormat, subject, body+otherDates);
  18.        
  19.     }
  20.  
  21.     private void sendMail(String server, String userName, String password, String fromAddress, String toAddress, String cc, String bcc, boolean htmlFormat, String subject, String body)
  22.     {
  23.    
  24.         Properties properties = System.getProperties();
  25.         properties.put("mail.smtps.host", server);
  26.         properties.put("mail.smtps.auth", "true");
  27.         Session ses  = Session.getInstance(properties);
  28.  
  29.         ses.setDebug(true);
  30.  
  31.         try{
  32.        
  33.             MimeMessage msg = new MimeMessage(ses);
  34.    
  35.             msg.setFrom(new InternetAddress(fromAddress));
  36.    
  37.             if (toAddress != null){
  38.                msg.addRecipients(Message.RecipientType.TO, toAddress);
  39.             }
  40.    
  41.             if (cc != null){
  42.                 msg.setRecipients(Message.RecipientType.CC,InternetAddress.parse(cc, false));
  43.             }
  44.    
  45.             if (bcc != null){
  46.                 msg.setRecipients(Message.RecipientType.BCC,InternetAddress.parse(bcc, false));
  47.             }
  48.    
  49.             if (htmlFormat){
  50.                 msg.setContent(body, "text/html");
  51.             }
  52.             else{
  53.                 msg.setContent(body, "text/plain");
  54.             }
  55.    
  56.             msg.setSubject(subject);
  57.             msg.saveChanges();
  58.    
  59.             Transport tr = ses.getTransport("smtps");
  60.             tr.connect(server,userName, password);
  61.             tr.sendMessage(msg, msg.getAllRecipients());
  62.             tr.close();
  63.         }
  64.        
  65.         catch(MessagingException e){
  66.             e.printStackTrace();
  67.         }  
  68.         }
  69. }
  70.  
  71. class MyPasswordAuthenticator extends Authenticator{
  72.    String user;
  73.    String pw;
  74.  
  75.    public MyPasswordAuthenticator (String username, String password)   {
  76.       super();
  77.       this.user = username;
  78.       this.pw = password;
  79.    }
  80.    public PasswordAuthentication getPasswordAuthentication()   {
  81.       return new PasswordAuthentication(user, pw);
  82.    }   
  83. }

Igual tarda tanto porque se tiene que conectar con la cuenta de gmail antes de poder enviar el mensaje, pero no estoy seguro... alguna ayuda / alternativa para que los mensajes se envien más rapido?

Un saludo!!!

Última edición por rgf1987; 05/06/2013 a las 13:05
  #2 (permalink)  
Antiguo 06/06/2013, 00:59
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Enviar emails desde java

Tarda mucho .... ¿desde dónde hasta dónde? ¿Desde que arrancas el programa hasta que ves el correo en tu buzón? ¿Desde que llamas a enviaCorreo() hasta que sale de ese método?...

Por medidas de tiempos para tratar de determinar qué es exactamente lo que tarda, si en establecer conexión, si en enviar el correo, etc.

Código java:
Ver original
  1. long inicio = System.currentTimeMillis();
  2. // Aquí código a medir
  3. System.out.println ("Tarda " + (System.currentTimeMills()-inicio) + " milisegundos");

En cualquier caso, 2 segundos puede o no ser mucho según qué estés midiendo. Si es desde que envías el correo hasta que lo ves en tu buzón de entrada, es más bien poco y el tiempo perdido puede no tener nada que ver con tu programa.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 06/06/2013, 03:12
Avatar de rgf1987  
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 11 años, 4 meses
Puntos: 22
Respuesta: Enviar emails desde java

Al darle a un botón "Guardar" almaceno datos en la base de datos y posteriormente si el guardado es correcto, envio un email al usuario.
Al darle a guardar, mientras envio el email la web se me bloquea y no puedo hacer nada más hasta que terminan de enviarse el email/s


Código Java:
Ver original
  1. @RequestMapping("confirmarArticulo")
  2.     public String confirmarArticulo(@RequestParam("idArticulo") int idArticulo, ModelMap modelo) throws DAOException {
  3.         long inicio = System.currentTimeMillis();      
  4.        
  5.         long guardarArticulo = System.currentTimeMillis();
  6.         ArticuloManager managerArticulo = ManagerFactory.getInstance().getArticuloManager();
  7.         EstadoManager managerEstado = ManagerFactory.getInstance().getEstadoManager();
  8.         ArticuloVO articulo =  managerArticulo.getArticulo(idArticulo);
  9.         if(articulo.getEstadoArticulo().getIdEstado()==Constantes.ARTICULO_NO_ENVIADO){
  10.             articulo.setEstadoArticulo(managerEstado.getEstado(Constantes.ARTICULO_PENDIENTE_REVISION));//PendienteRevision
  11.         }
  12.         else if(articulo.getEstadoArticulo().getIdEstado()==Constantes.ARTICULO_PENDIENTE_MODIFICACION){
  13.             articulo.setEstadoArticulo(managerEstado.getEstado(Constantes.ARTICULO_EN_REVISION));//PendienteENRevision
  14.         }
  15.        
  16.         managerArticulo.actualizarArticulo(articulo);
  17.         System.out.println ("Tarda " + (System.currentTimeMillis()-guardarArticulo) + " milisegundos en guardar articulo");
  18.         String datosAdicionales= "Titulo Articulo: "+articulo.getTituloArticulo();
  19.         long tcorreo = System.currentTimeMillis();
  20.         Correo correo = new Correo();
  21.         correo.enviarCorreo(
  22.                 articulo.getAutor().getEmailUsuario(),
  23.                 Constantes.TITULO_CORREO_ARTICULOENVIADO,
  24.                 Constantes.CUERPO_CORREO_ARTICULOENVIADO, datosAdicionales);
  25.         System.out.println ("Tarda " + (System.currentTimeMillis()-tcorreo) + " milisegundos en guardar correo");
  26.         System.out.println ("Tarda " + (System.currentTimeMillis()-inicio) + " milisegundos");
  27.         return "redirect:administracion.htm";
  28.     }

Esto me da los siguientes tiempos:
Tarda 82 milisegundos en guardar articulo
Tarda 2978 milisegundos en guardar correo
Tarda 3060 milisegundos

Última edición por rgf1987; 06/06/2013 a las 03:24
  #4 (permalink)  
Antiguo 06/06/2013, 03:24
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Enviar emails desde java

Hola:

Al darle a guardar haces varias cosas : base de datos y email. Imagino que la web se te bloquea desde que das al botón "guardar" hasta que puedes volver a trabajar con ella. ¿Qué te hace pensar que es problema de email? Hay dos tareas que haces ahí y suma el tiempo de las dos ¿no?.

Haz el guardado en base de datos y el envío de emails en un hilo separado, de forma que al dar al botón "guardar" lanzas el hilo y así la web se desbloquea inmediatamente.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 06/06/2013, 03:33
Avatar de rgf1987  
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 11 años, 4 meses
Puntos: 22
Respuesta: Enviar emails desde java

Supongo que no habras leido lo de los tiempos antes de contestar ;).

Sino el problema no esta al guardar en base de datos ya que solo me tarda 81 milisegundos como puedes ver.

Intentare utilizar hilos como me indicas, luego comentare ;)

Saludos!!
  #6 (permalink)  
Antiguo 06/06/2013, 04:00
Avatar de rgf1987  
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 11 años, 4 meses
Puntos: 22
Respuesta: Enviar emails desde java

Bueno al final lo hice con hilos como me dices, sigue tardando, pero como se ejecuta en segundo plano no me da problemas : ), al final el codigo quedó así:

Creo el hilo:

Código Java:
Ver original
  1. Correo correo = new Correo(articulo.getAutor().getEmailUsuario(),
  2.                 Constantes.TITULO_CORREO_ARTICULOENVIADO,
  3.                 Constantes.CUERPO_CORREO_ARTICULOENVIADO, datosAdicionales);
  4.         Thread hiloCorreo = new Thread (correo);
  5.         hiloCorreo.start();


Y la clase Correo quedaria asi implementando la interfaz Runnable:

Código Java:
Ver original
  1. public class Correo implements Runnable{
  2.     Properties props = new Properties();
  3.     String emailDestino;
  4.     String subject;
  5.     String body;
  6.     String otherDates;
  7.     public Correo(){}
  8.     public Correo(String emailDestino, String subject, String body, String otherDates){
  9.         this.emailDestino=emailDestino;
  10.         this.subject=subject;
  11.         this.body=body;
  12.         this.otherDates=otherDates;
  13.     }
  14.     @Override
  15.     public void run()
  16.     {
  17.         Correo obj = new Correo();
  18.         String server = "smtp.gmail.com";
  19.         String userName = "[email protected]";
  20.         String password = "rootroot";
  21.         String fromAddres = "todomotorrevista";
  22.         String toAddres = emailDestino;
  23.         String cc = "";
  24.         String bcc = "";
  25.         boolean htmlFormat = false;        
  26.        
  27.        
  28.         obj.sendMail(server, userName, password, fromAddres, toAddres, cc, bcc,
  29.                      htmlFormat, subject, body+otherDates);
  30.              
  31.        
  32.     }
  33.  
  34.     private void sendMail(String server, String userName, String password, String fromAddress, String toAddress, String cc, String bcc, boolean htmlFormat, String subject, String body)
  35.     {
  36.    
  37.         Properties properties = System.getProperties();
  38.         properties.put("mail.smtps.host", server);
  39.         properties.put("mail.smtps.auth", "true");
  40.         Session ses  = Session.getInstance(properties);
  41.  
  42.         ses.setDebug(true);
  43.  
  44.         try{
  45.        
  46.             MimeMessage msg = new MimeMessage(ses);
  47.    
  48.             msg.setFrom(new InternetAddress(fromAddress));
  49.    
  50.             if (toAddress != null){
  51.                msg.addRecipients(Message.RecipientType.TO, toAddress);
  52.             }
  53.    
  54.             if (cc != null){
  55.                 msg.setRecipients(Message.RecipientType.CC,InternetAddress.parse(cc, false));
  56.             }
  57.    
  58.             if (bcc != null){
  59.                 msg.setRecipients(Message.RecipientType.BCC,InternetAddress.parse(bcc, false));
  60.             }
  61.    
  62.             if (htmlFormat){
  63.                 msg.setContent(body, "text/html");
  64.             }
  65.             else{
  66.                 msg.setContent(body, "text/plain");
  67.             }
  68.    
  69.             msg.setSubject(subject);
  70.             msg.saveChanges();
  71.    
  72.             Transport tr = ses.getTransport("smtps");
  73.             tr.connect(server,userName, password);
  74.             tr.sendMessage(msg, msg.getAllRecipients());
  75.             tr.close();
  76.         }
  77.        
  78.         catch(MessagingException e){
  79.             e.printStackTrace();
  80.         }  
  81.         }
  82.    
  83. }
  84.  
  85. class MyPasswordAuthenticator extends Authenticator{
  86.    String user;
  87.    String pw;
  88.  
  89.    public MyPasswordAuthenticator (String username, String password)   {
  90.       super();
  91.       this.user = username;
  92.       this.pw = password;
  93.    }
  94.    public PasswordAuthentication getPasswordAuthentication()   {
  95.       return new PasswordAuthentication(user, pw);
  96.    }
  97.    
  98. }


En este caso... no haria falta sincronizacion, ¿o si?

Etiquetas: emails, html, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:08.