简体   繁体   中英

javax.mail.NoSuchProviderException: No provider for smtps

I'm trying to set up my Java project to be able to send e-mail (via g-mail, if it matters) and am getting "javax.mail.NoSuchProviderException: No provider for smtps" every time I try to run the following line (which is copy/paste from their example).

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

I've looked around and found that this is generally thrown because you don't have the mail.jar included in your classpath, but I do in fact have the mail.jar included. Since I am running JDK 1.6 I do not need to include the activation.jar according to the FAQ here ( http://www.oracle.com/technetwork/java/javamail/faq-135477.html#classpath ). Further, the activation.jar does not seem to be present in version 1.4.7 of javamail.

Just in case something got corrupted, I re-downloaded the entire zip from oracle's website, extracted it and added the jar fresh (after deleting the old jar) and I am still getting the same error. Any thoughts as to what the issue could be at this point?

EDIT: Here is the full stack trace that is being printed:

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)

So it turns out that the issue was that an outdated version of mail.jar was included in a project that I was referencing and, upon updating that copy of the mail.jar, the issue was resolved.

For future reference, is there any way to log or provide visibility on such jar conflicts?

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

Just in case anyone makes the same mistake as I have: you have to use lowercase letters for the protocol resolving to work. If you type SMTP as a protocol name instead of smtp you will get the NoSuchProviderException . It most likely works the same way for all other providers.

Make sure that you have the javax.mail.jar in you build path. If you are using eclipse you may have to refresh or right click your project in the files explorer, select configure build path, add external JAR and then add it to the build path. Send email using java gives working code (I've tested it) in case you just want to look over yours. If that is not the problem, or you are not using eclipse, a stack trace would be nice

When you use Mail API make sure that which protocol are you expecting to work with? In this case you are missing smtp.jar with your eclipse project.

there are several jars for different protocols are available in mail api. EX: dsn.jar , gimap.jar , imap.jar ,mailapi.jar ,pop3.jar ,smtp.jar

JavaMail asks the ClassLoader for the configuration file that configures the protocol providers. If the ClassLoader doesn't work correctly, JavaMail won't be able to find the configuration file. There's an incompatibility between the way the OSGi ClassLoaders work and what JavaMail expects, which can cause this problem. If you're running your application in Eclipse itself, that might explain this problem. Another common cause of this problem is importing the mail.jar file into your project in such a way that the class files are extracted from the jar file and included in your application, but the configuration files are left behind.

Try running your program from the command line using the "java" command and with the mail.jar file in your CLASSPATH.

for the benefit of others with a similar problem as I had.

make sure you remember to set

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

instead of

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

I had mail.jar and activation.jar in tomcat's lib directory and mailapi.jar in application's lib directory. Application was reading mailapi.jar during runtime, since mailapi.jar is light weight version of mailing api and it needs smtp.jar that why application was throwing smtp exception. So, if you want to get rid of this exception,

Please resolve conflict between mail.jar and mailapi.jar by:

  • Removing mailapi.jar (if it is there in the classpath).
  • OR just keep one pair of mailapi.jar and smtp.jar in the classpath and remove
    mail.jar.
  • OR just keep one pair of mail.jar and activation.jar in the classpath (clean approach).

(FYI: I searched file system to find out mail related jar files and got to know that I have conflicting jar file in the following path (added by gradle in classpath) C:\\workspace.metadata.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\testapp\\WEB-INF\\lib)

I got the same issue. i resolved it by adding the correct dependency in maven. group id - javax.mail artifactory - mail version 1.4.7

if you are doing, without maven build, add the correct library for javax.mail

尝试

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM