libreria - javax.mail.NoSuchProviderException: Sin proveedor para smtps
javamail providers download (7)
Estoy intentando configurar mi proyecto Java para poder enviar correos electrónicos (a través de g-mail, si es que importa) y obtengo "javax.mail.NoSuchProviderException: No hay proveedor para smtps" cada vez que intento ejecutar el siguiente línea (que es copiar / pegar de su ejemplo).
Transport transport = session.getTransport("smtps");
Miré a mi alrededor y descubrí que esto generalmente se produce porque no tienes el mail.jar incluido en tu classpath, pero de hecho tengo el mail.jar incluido. Dado que ejecuto JDK 1.6, no necesito incluir el activation.jar de acuerdo con las preguntas frecuentes aquí ( http://www.oracle.com/technetwork/java/javamail/faq-135477.html#classpath ). Además, el archivo activation.jar no parece estar presente en la versión 1.4.7 de javamail.
En caso de que algo se corrompiera, volví a descargar todo el código postal del sitio web de Oracle, lo extraje y agregué el contenedor nuevo (después de eliminar el contenedor anterior) y sigo recibiendo el mismo error. ¿Alguna idea de cuál podría ser el problema en este momento?
EDITAR: Aquí está el seguimiento completo de la pila que se está imprimiendo:
javax.mail.NoSuchProviderException: No provider for smtps
at javax.mail.Session.getProvider(Session.java:433)
at javax.mail.Session.getTransport(Session.java:627)
at javax.mail.Session.getTransport(Session.java:608)
... my code that calls getTransport() ...
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
... more of my code ...
at java.lang.Thread.run(Thread.java:662)
Asegúrate de tener el javax.mail.jar en tu ruta de compilación. Si está utilizando eclipse, puede que tenga que actualizar o hacer clic con el botón derecho en su proyecto en el explorador de archivos, seleccionar configurar ruta de compilación, agregar JAR externo y luego agregarlo a la ruta de compilación. Enviar correo electrónico usando java proporciona un código de trabajo (lo he probado) en caso de que quiera mirar el suyo. Si ese no es el problema, o no está usando eclipse, un rastreo de pila sería agradable
Cuando usas Mail API, asegúrate de con qué protocolo estás esperando trabajar. En este caso, te falta smtp.jar con tu proyecto eclipse.
hay varios frascos para diferentes protocolos disponibles en la API de correo. EX: dsn.jar, gimap.jar, imap.jar, mailapi.jar, pop3.jar, smtp.jar
En caso de que alguien cometa el mismo error que yo tengo: debe usar letras minúsculas para que el protocolo funcione. Si escribe SMTP
como nombre de protocolo en lugar de smtp
obtendrá la NoSuchProviderException
. Lo más probable es que funcione de la misma manera para todos los demás proveedores.
Entonces resultó que el problema era que se incluyó una versión obsoleta de mail.jar en un proyecto al que estaba haciendo referencia y, al actualizar esa copia de mail.jar, se resolvió el problema.
Para referencia futura, ¿hay alguna manera de iniciar sesión o proporcionar visibilidad en tales conflictos de jar?
JavaMail le pide al ClassLoader el archivo de configuración que configura los proveedores de protocolo. Si ClassLoader no funciona correctamente, JavaMail no podrá encontrar el archivo de configuración. Existe una incompatibilidad entre la forma en que funcionan los OSGi ClassLoaders y lo que JavaMail espera, lo que puede causar este problema. Si está ejecutando su aplicación en Eclipse, eso podría explicar este problema. Otra causa común de este problema es la importación del archivo mail.jar en su proyecto de tal forma que los archivos de clase se extraen del archivo jar y se incluyen en su aplicación, pero los archivos de configuración se quedan atrás.
Intente ejecutar su programa desde la línea de comando usando el comando "java" y con el archivo mail.jar en su CLASSPATH.
para el beneficio de otros con un problema similar al que tuve.
asegúrate de recordar establecer
properties.put("mail.transport.protocol", "smtp"));
en lugar de
properties.put("mail.transport.protocol", "SMTP"));
tratar
Transport transport = session.getTransport("smtp");