2010-06-05 19 views
9

Estoy usando JavaMail para hacer una aplicación simple que envía un correo electrónico cuando encuentra algunos archivos en un directorio. Logré que funcionara desde Eclipse. Ejecuto la aplicación y envió el correo electrónico sin errores.Java Mail: Sin proveedor para smtp

Pero cuando creé el jar y lo ejecuté, falla en la parte de envío del correo electrónico. Da a esta excepción:

javax.mail.NoSuchProviderException: No provider for smtp 
at javax.mail.Session.getProvider(Session.java:460) 
at javax.mail.Session.getTransport(Session.java:655) 
at javax.mail.Session.getTransport(Session.java:636) 
at main.java.util.MailManager.sendMail(MailManager.java:69) 
at main.java.DownloadsMail.composeAndSendMail(DownloadsMail.java:16) 
at main.java.DownloadsController.checkDownloads(DownloadsController.java:51) 
at main.java.MainDownloadsController.run(MainDownloadsController.java:26) 
at java.lang.Thread.run(Unknown Source) 

estoy usando la biblioteca en este método:

public static boolean sendMail(String subject, String text) { 

    noExceptionsThrown = true; 
    try { 
     loadProperties(); 
    } catch (IOException e1) { 
     System.out.println("Problem encountered while loading properties"); 
     e1.printStackTrace(); 
     noExceptionsThrown = false; 
    } 

    Properties mailProps = new Properties(); 

    String host = "mail.smtp.host"; 
    mailProps.setProperty(host, connectionProps.getProperty(host)); 

    String tls = "mail.smtp.starttls.enable"; 
    mailProps.setProperty(tls, connectionProps.getProperty(tls)); 

    String port = "mail.smtp.port"; 
    mailProps.setProperty(port, connectionProps.getProperty(port)); 

    String user = "mail.smtp.user"; 
    mailProps.setProperty(user, connectionProps.getProperty(user)); 

    String auth = "mail.smtp.auth"; 
    mailProps.setProperty(auth, connectionProps.getProperty(auth)); 

    Session session = Session.getDefaultInstance(mailProps); 
    //session.setDebug(true); 

    MimeMessage message = new MimeMessage(session); 

    try { 
     message.setFrom(new InternetAddress(messageProps.getProperty("from"))); 

     message.addRecipient(Message.RecipientType.TO, new InternetAddress(
       messageProps.getProperty("to"))); 

     message.setSubject(subject); 
     message.setText(text); 
     Transport t = session.getTransport("smtp"); 
     try { 
      t.connect(connectionProps.getProperty("user"), passwordProps 
        .getProperty("password")); 
      t.sendMessage(message, message.getAllRecipients()); 
     } catch (Exception e) { 
      System.out.println("Error encountered while sending the email"); 
      e.printStackTrace(); 
      noExceptionsThrown = false; 
     } finally { 
      t.close(); 
     } 
    } catch (Exception e) { 
     System.out.println("Error encountered while creating the message"); 
     e.printStackTrace(); 
     noExceptionsThrown = false; 
    } 
    return noExceptionsThrown; 
} 

Estoy cargando estos valores a partir de los archivos de propiedades.

mail.smtp.host=smtp.gmail.com 

mail.smtp.starttls.enable=true 

mail.smtp.port=587 

mail.smtp.auth=true 

he tratado de cambiar el host mediante SSL: //smtp.gmail.com, por el puerto 465 (sólo para probar algo diferente), pero no funciona bien. De todos modos, si funciona bien desde Eclipse con los parámetros originales, supongo que los valores son correctos, pero el problema es crear el contenedor. No sé mucho sobre los posibles resultados o cambios al crear un jar. ¿Podrían las bibliotecas JavaMail de alguna manera fallar cuando se crea el jar?

¿Tiene alguna idea?

Respuesta

10

Los archivos auxiliares: mail.jar y activation.jar no están en su classpath. Cuando construye su jar, necesita incluirlos en su classpath.

+0

muchas gracias por responder tan rápido. Acabo de intentar lo que me contó, no sé si lo hice de la manera correcta: Dentro de Eclipse, en las propiedades del proyecto, lo he visto en la ruta de compilación, en Librerías: activation.jar , mailapi.jar, smtp.jar ... están ahí. En Order and Export, he comprobado estos jar's. No fueron revisados ​​antes. He exportado el jar nuevamente, pero el error persiste. ¿Puedo haber hecho algo mal? Tal vez no debería hacerlo desde Eclipse? Gracias Mike. – pablof

+0

No estoy familiarizado con eclipse.Pero esto es definitivamente algo relacionado con el classpath. Puede cambiar la forma en que ejecuta el contenedor como el siguiente paso. Incluya la ruta a esos dos jar cuando ejecuta su jar. Así que fuera de la cabeza, algo así como: jar -cp ./full/path/to/activation.jar:./full/path/to/mail.jar -jar yourjarname.jar – Mike

+0

Gracias Mike. Voy a intentar con esto. – pablof

4

Tuve el mismo problema.

Puede solucionarlo creando el archivo Runnable JAR en Eclipse y utilizando las opciones de manejo de la biblioteca. Seleccione el segundo cuando haga su JAR, el que dice "Package required libraries into generated JAR".

package required libraries

-1

me las arreglé para corregir este error, que se debió a una mala biblioteca. Traté de usar javax.mail jar descargado de maven, que resultó estar incompleto. Así que busqué una vez más por javamail y obtuve una directly from Oracle (haga clic en Enlace de versión). Esta vez es un archivo zip.

3

es necesario agregar el archivo smtp.jar, también me quedé atrapado con el mismo error después de algún Búsqueda de Google y revisar en algunos proyectos más antiguos que he encontrado que echaba de menos este frasco particular, en mi biblioteca, añadí este frasco a la biblioteca y problema encontrado encontrado fijo.

1

Tuve el mismo error, al actualizar el jar de Oracle lo arreglé directamente.

0

Para aquellos que utilizan Gradle: usted puede conseguir todos los tarros necesarios los siguientes (1.5.5 es la última versión):

compile 'com.sun.mail:javax.mail:1.5.5' 
Cuestiones relacionadas