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

时间:2013-05-31 16:08:20

标签: java jar javamail

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

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

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

万一有些东西被破坏了,我从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)

8 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:4)

确保您在构建路径中拥有javax.mail.jar。如果您正在使用eclipse,则可能必须在文件资源管理器中刷新或右键单击您的项目,选择configure build path,添加外部JAR,然后将其添加到构建路径。 Send email using java提供了工作代码(我已对其进行了测试)以防您只是想查看它。 如果那不是问题,或者你没有使用eclipse,那么堆栈跟踪就不错了

答案 3 :(得分:4)

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

请通过以下方式解决mail.jar和mailapi.jar之间的冲突:

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

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

答案 6 :(得分:0)

我遇到了同样的问题。我通过在Maven中添加正确的依赖关系来解决它。 组ID-javax.mail 人工制品-邮件 版本1.4.7

如果您正在做,并且没有maven构建,请为javax.mail添加正确的库

答案 7 :(得分:-1)

尝试

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