web-dev-qa-db-fra.com

javax.mail.NoSuchProviderException: aucun fournisseur pour smtps

J'essaie de configurer mon projet Java pour pouvoir envoyer des e-mails (via g-mail, si cela compte) et je reçois "javax.mail.NoSuchProviderException: Aucun fournisseur pour smtps" chaque fois que j'essaie d'exécuter le ligne suivante (qui est copier/coller de leur exemple).

Transport transport = session.getTransport("smtps");

J'ai jeté un coup d'œil autour de moi et constaté que c'est généralement causé par le fait que mail.jar n'est pas inclus dans votre chemin de classe, mais que j'ai en fait mail.jar inclus. Depuis que j'utilise JDK 1.6, je n'ai pas besoin d'inclure le fichier activation.jar conformément à la FAQ ici ( http://www.Oracle.com/technetwork/Java/javamail/faq-135477. html # classpath ). En outre, le fichier activation.jar ne semble pas être présent dans la version 1.4.7 de javamail.

Juste au cas où quelque chose serait corrompu, j'ai retéléchargé l'intégralité du fichier Zip à partir du site Web d'Oracle, je l'ai extrait et ajouté le bocal frais (après avoir supprimé l'ancien bocal) et j'obtiens toujours la même erreur. Avez-vous une idée de ce que pourrait être le problème à ce stade?

EDIT: Voici la trace de pile complète en cours d’impression:

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)
8
JuniorIncanter

Il s’est donc avéré que le problème était qu’une version obsolète de mail.jar était incluse dans un projet que je faisais référence et que, lors de la mise à jour de cette copie de mail.jar, le problème était résolu.

Pour référence future, existe-t-il un moyen de se connecter ou de fournir une visibilité sur de tels conflits de fichiers JAR?

https://confluence.atlassian.com/confkb/cannot-send-email-due-to-javax-mail-nosuchproviderexception-smtp-error-154079.html

7
JuniorIncanter

Juste au cas où quelqu'un ferait la même erreur que moi: vous devez utiliser des lettres minuscules pour que le protocole se résolve au travail. Si vous tapez SMTP comme nom de protocole au lieu de smtp, vous obtiendrez la NoSuchProviderException. Cela fonctionne probablement de la même manière pour tous les autres fournisseurs.

5
Dariusz

Lorsque vous utilisez l’API de messagerie, assurez-vous que le protocole avec lequel vous comptez travailler est correct. Dans ce cas, smtp.jar manque avec votre projet Eclipse.

il existe plusieurs fichiers JAR pour différents protocoles dans l’API de messagerie. EX: dsn.jar, gimap.jar, imap.jar, mailapi.jar, pop3.jar, smtp.jar

4
nimesh makwana

Assurez-vous que javax.mail.jar est dans le chemin de génération. Si vous utilisez Eclipse, vous devrez peut-être actualiser ou cliquer avec le bouton droit de la souris sur votre projet dans l'explorateur de fichiers, sélectionner configurer le chemin d'accès à la construction, ajouter un fichier JAR externe, puis l'ajouter au chemin d'accès à la construction. Envoyer un email en Java donne le code de travail (je l’ai testé) au cas où vous voudriez simplement regarder le vôtre. Si ce n'est pas le problème, ou si vous n'utilisez pas Eclipse, une trace de pile serait bien

4
Keith Aylwin

JavaMail demande au ClassLoader le fichier de configuration qui configure les fournisseurs de protocole. Si ClassLoader ne fonctionne pas correctement, JavaMail ne pourra pas trouver le fichier de configuration. Il existe une incompatibilité entre le mode de fonctionnement des chargeurs de classes OSGi et les attentes de JavaMail, ce qui peut être à l'origine de ce problème. Si vous exécutez votre application dans Eclipse même, cela pourrait expliquer ce problème. Une autre cause fréquente de ce problème est l’importation du fichier mail.jar dans votre projet de telle sorte que les fichiers de classe soient extraits du fichier jar et inclus dans votre application, mais les fichiers de configuration sont laissés.

Essayez d’exécuter votre programme à partir de la ligne de commande à l’aide de la commande "Java" et du fichier mail.jar de votre CLASSPATH.

1
Bill Shannon

au profit d'autres personnes ayant le même problème que moi. 

assurez-vous de ne pas oublier 

 properties.put("mail.transport.protocol", "smtp"));

au lieu de 

 properties.put("mail.transport.protocol", "SMTP"));
0
virtuvious

J'ai le même problème. Je l'ai résolu en ajoutant la dépendance correcte dans maven. id de groupe - javax.mail artifactory - mail version 1.4.7

si vous le faites, sans construction maven, ajoutez la bibliothèque appropriée pour javax.mail

0
Siva Pandian

J'avais mail.jar et activation.jar dans le répertoire lib de Tomcat et mailapi.jar dans le répertoire lib de l'application. L'application lisait mailapi.jar pendant l'exécution, car mailapi.jar était une version allégée de mailing api et il fallait smtp.jar pour savoir pourquoi l'application lançait une exception smtp. Donc, si vous voulez vous débarrasser de cette exception,

Veuillez résoudre le conflit entre mail.jar et mailapi.jar en:

  • Suppression de mailapi.jar (s’il existe dans le chemin de classe). 
  • OU conservez Une paire de mailapi.jar et smtp.jar dans le chemin de classe et supprimez
    mail.jar.
  • OU conservez juste une paire de mail.jar et activation.jar dans Le chemin de classe (approche propre).

(Pour votre information, j'ai effectué une recherche dans le système de fichiers pour trouver des fichiers jar liés au courrier, et j'ai appris que mon fichier jar était en conflit dans le chemin suivant (ajouté par gradle dans classpath) C:\workspace.metadata.plugins\org.Eclipse.wst. serveur.core\tmp0\wtpwebapps\testapp\WEB-INF\lib)

0
Sumit Sundriyal