Error enviar mail java

un saludo a todos!!

Tengo un pequeño problema al mandar un correo desde una clase de java.

Básicamente tengo una clase q manda el correo a X número de destinatarios, la clase funciona perfectamente si ejecuto la clase desde un main, el problema viene cuando con ayuda de NetBeans genero el .jar y lo incluyo como librería de un domain de glassfish (junto con la libreria necesaria mail.jar), que al llamarlo desde otro jar (ya que esta en un flujo de funciones y el mandar el correo es el último), en el log de glassfish me manda el siguiente error:

 
javax.mail.NoSuchProviderException: smtp

Así que me atrebo a preguntar si alguien m puede poner en la dirección correcta para solucionar este problema.

Gracias de antemano!!!

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ingscjoshua

ya revisaste el API

Ya revisaste el API de java mail? ahora porque hacer una jar y ponerlo en el domino ? a glasfish le puedes configurar el servidor de correo y solo implementar la clase que envia el mail?, no entiendo la razon de hacerlo asi, si vas a mandar el mail con un servidor de correo privativo o de una empresa privada revisa la seguridad si no requieres autenticarte antes

Bueno la razón de hacer el

Bueno la razón de hacer el jar es porq forma parte de una aplicación más compleja, cuyo core esta formado por un conjunto de jars, y ya he intentado configurar el servicio de correo de glassfish e implementar la clase pero el resultado es el mismo, con un main si corre, pero al llamarlo mediante otro jar y WebServices no funciona, y de la API de javamail, podrias por favor ser un poco más específico, ya que solo he descargado la libreria de mail.jar

Agradezco tu respuesta.

Imagen de neko069

Código

Postea el código y la configuración de los servicios que usas para el envío de tu correo.

este es el códigopublic

este es el código

public class MensajesElectronicos {
 
 private static String SMTP_HOST_NAME = null;// = "smtp.gmail.com";
 private static String SMTP_PORT = null;// = "465";
 private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

 private static String emailGoogle = null;
 private static String emailGooglePassword = null;
 JDBCConnectionPool bd = null;
 private static List<String> sendTo = new ArrayList();
 
public MensajesElectronicos (short numeroInstitucion) throws Exception
  {
      try
      {
          SQLProperties sqlProperties = new SQLProperties();
          bd = new JDBCConnectionPool();
          StringBuffer query = new StringBuffer();
          query.append("SELECT ");
          query.append("CORREO, ");
          query.append("SERVIDOR_SALIENTE, ");
          query.append("PASSWORD, ");
          query.append("PUERTO ");
          query.append("FROM CF_CORREO_ADMIN ");
          query.append("WHERE NUMERO_INSTITUCION = ");
          query.append(numeroInstitucion);
          System.out.println(query);
          ResultSet resultado = bd.executeQuery(query.toString());
          if (resultado.next())
          {
            SMTP_HOST_NAME = resultado.getString("SERVIDOR_SALIENTE");
            SMTP_PORT = resultado.getString("PUERTO");
            emailGoogle = resultado.getString("CORREO");
            emailGooglePassword = Cifrador.desencriptar(sqlProperties.getPalabraClave(), resultado.getString("PASSWORD"));            
          }
          sendTo.add("correo1@serv1.com");
          sendTo.add("correo2@serv1.com");
          bd.close();
      }
      catch (SQLException sqle)
      {
          sqle.getStackTrace();
          bd.close();
      }
     
 }
 
 public void enviaCorreo (String emailSubjectTxt, String emailMsgTxt ) throws Exception {
     System.out.println("Entra envia Correo");
     Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

     sendSSLMessage(sendTo, emailSubjectTxt, emailMsgTxt);

     System.out.println("Mail enviado a los destinatarios");
 }

 public static void sendSSLMessage(List<String> recipients, String subject,
   String message) throws MessagingException {
  boolean debug = false;
 
  Properties props = new Properties();
  props.put("mail.smtp.host", SMTP_HOST_NAME);
  props.put("mail.smtp.auth", "true");
  props.put("mail.debug", "false");
  props.put("mail.smtp.port", SMTP_PORT);
  props.put("mail.smtp.socketFactory.port", SMTP_PORT);
  props.put("mail.smtp.socketFactory.class", SSL_FACTORY);
  props.put("mail.smtp.socketFactory.fallback", "false");

  Session session = Session.getDefaultInstance(props,
    new javax.mail.Authenticator() {    
           
   @Override
   protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(emailGoogle, emailGooglePassword);
   }
  });

  session.setDebug(debug);

  Message msg = new MimeMessage(session);
  InternetAddress addressFrom = new InternetAddress(emailGoogle);
  msg.setFrom(addressFrom);

  InternetAddress[] addressTo = new InternetAddress[recipients.size()];
  for (int i = 0; i < recipients.size(); i++) {
   addressTo[i] = new InternetAddress(recipients.get(i));
  }
  msg.setRecipients(Message.RecipientType.TO, addressTo);

  msg.setSubject(subject);
  msg.setContent(message, "text/plain");
  Transport transport = session.getTransport("smtp");  
  String aux = String.valueOf(session.getTransport("smtp"));
  System.out.println(aux);
  transport.connect(SMTP_HOST_NAME, emailGoogle, emailGooglePassword);  
  Transport.send(msg);  
  //Transport.send(msg);
 }
 
 public static void main (String [] args) throws Exception
 {
     MensajesElectronicos mensajes = new MensajesElectronicos((short) 1);
     mensajes.enviaCorreo(args[0], args[1]);
 }
}

Y de configuración de momento estoy haciendo pruebas sin configuraciones de glassfish, si es necesario les muestro otra clase q utiliza un servicio de mail de glassfish

Imagen de neko069

...

Si estás incluyendo tú mismo el mail.jar puede que sea por éso que te aviente la excepción, tengo entendido que el glassfish ya incluye ésa biblioteca así que no la tendrías que estar incluyendo manualmente. Prueba quitando el jar que agregas.

Imagen de ingscjoshua

mmmmm

Tienes mucho desorden porque no haces una clase de constantes y las importas, por otra parte dejame te pongo un ejemplo de una clase que envia mail yo yambien la mando con gmail y creo que gmail no requiere autenticacion

Si ya lo he intentado

Al importar la librería de glassfish resulta q el programa no la puede leer, no se si sea cuertión de permisos sobre la carpeta que contiene dicha libreria en glassfish

Te agradecería tu ejemplo

Te agardecería tu ejemplo enormemente, y si lo corres sobre glassfish estaría genial jejeje muchas gracias!!

Imagen de neko069

Cómo?

Al importar la librería de glassfish resulta q el programa no la puede leer

Éso sí me dejó confuso, cómo que no la puede leer? en tu proyecto tienes como dependencia las bibliotecas del glassfish? si es así deberías de poder usar las clases sin problema evitando importar jars manualmente.
Estoy casi seguro que, como tú lo colocas manual al hacer deploy de tu war ahí es donde truena.

Y ejemplos de cómo enviar email, hay muchos.
Aquí uno.
Aquí otro.
Y otro.
Y otro.

Imagen de greeneyed

El error lo dice

No he mirado el código y no se si hay otros problemas, pero el primer problema que estás encontrando lo dice el mensaje de error:

javax.mail.NoSuchProviderException: smtp

Y eso es por que no encuentra las clases para enviar mensajes por SMTP, que se encuentran en el fichero smtp.jar. Con el API no basta, también hay que poner en el classpath los proveedores. Habría que comprobar también que el problema no sea un incompatibilidad por haber puesto varias veces el API javamail en el classpath, así que miraría si el Glassfish lo incluye a nivel general y en ese caso no te haría falta, y en ese caso comprobar que el Glassfish también incluye las clases para envío por smtp.

Imagen de ezamudio

ah sí?

Yo tengo en mi classpath mail-1.4.4.jar y el de Spring para JavaMailSender (creo que spring-context-support) y con eso puedo enviar mails por SMTP (incluso usando TLS). Y es una aplicación JSE, ni siquiera está en un contenedor...