javax.mail.NoSuchProviderException:没有smtps的提供者

我正在尝试设置我的Java项目以便能够发送电子邮件(通过g-mail,如果它很重要)并且每次我尝试运行时都会收到“javax.mail.NoSuchProviderException:没有smtps的提供者”以下行(从他们的例子中复制/粘贴)。

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

我环顾四周,发现这通常被抛出,因为你没有包含在你的类路径中的mail.jar,但事实上我确实包含了mail.jar。 由于我正在运行JDK 1.6,因此我不需要根据FAQ( http://www.oracle.com/technetwork/java/javamail/faq-135477.html#classpath )包含activation.jar。 此外,activation.jar似乎不存在于javamail的1.4.7版本中。

为了防止出现问题,我从oracle的网站上重新下载了整个zip,解压缩并添加了jar(在删除旧jar后),我仍然得到同样的错误。 关于这个问题到底有什么想法吗?

编辑:这是正在打印的完整堆栈跟踪:

 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) 

事实certificate,问题是mail.jar的过时版本包含在我引用的项目中,并且在更新mail.jar的副本时,问题已得到解决。

为了将来参考,有没有办法记录或提供这种jar冲突的可见性?

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

万一有人犯了与我相同的错误: 你必须使用小写字母才能使协议解析起作用。 如果您键入SMTP作为协议名称而不是smtp您将获得NoSuchProviderException 。 对于所有其他提供商,它很可能以相同的方式工作。

确保在构建路径中有javax.mail.jar。 如果您正在使用eclipse,则可能必须在文件资源管理器中刷新或右键单击您的项目,选择configure build path,添加外部JAR,然后将其添加到构建路径。 使用java发送电子邮件给出了工作代码(我已经测试过),以防您只是想看看你的。 如果这不是问题,或者你没有使用eclipse,那么堆栈跟踪会很好

当您使用Mail API时,请确保您希望使用哪种协议? 在这种情况下,你的eclipse项目缺少smtp.jar。

在邮件api中有几个不同协议的jar子。 EX:dsn.jar,gimap.jar,imap.jar,mailapi.jar,pop3.jar,smtp.jar

JavaMail向ClassLoader请求配置协议提供程序的配置文件。 如果ClassLoader无法正常工作,JavaMail将无法找到配置文件。 OSGi ClassLoader的工作方式与JavaMail期望的方式之间存在不兼容性,这可能导致此问题。 如果您在Eclipse中运行应用程序,则可能会解释此问题。 此问题的另一个常见原因是将mail.jar文件导入到项目中,以便从jar文件中提取类文件并将其包含在应用程序中,但配置文件会被遗忘。

尝试使用“java”命令和CLASSPATH中的mail.jar文件从命令行运行程序。

为了与我有类似问题的其他人的利益。

确保你记得设置

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

代替

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

我在tomcat的lib目录中有mail.jar和activation.jar,在应用程序的lib目录中有mailapi.jar。 应用程序在运行时读取mailapi.jar,因为mailapi.jar是邮件api的轻量级版本,它需要smtp.jar,为什么应用程序抛出smtpexception。 所以,如果你想摆脱这个例外,

请解决mail.jar和mailapi.jar之间的冲突:

  • 删除mailapi.jar(如果它在类路径中)。
  • 或者只是在类路径中保留一对mailapi.jar和smtp.jar并删除
    的mail.jar。
  • 或者只在类路径中保留一对mail.jar和activation.jar(干净的方法)。

(仅供参考:我搜索文件系统以找出与邮件相关的jar文件,并且知道我在以下路径中有冲突的jar文件(在类路径中由gradle添加)C:\ workspace.metadata.plugins \ org.eclipse.wst。 server.core \ TMP0 \ wtpwebapps \ testapp \ WEB-INF \ lib中)

我遇到了同样的问题。 我通过在maven中添加正确的依赖项来解决它。 group id – javax.mail artifactory – 邮件版本1.4.7

如果你正在做,没有maven build,为javax.mail添加正确的库

尝试

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