我正在尝试设置我的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)
答案 0 :(得分:7)
事实证明,问题是mail.jar的过时版本包含在我引用的项目中,并且在更新mail.jar的副本时,问题已得到解决。
为了将来参考,有没有办法记录或提供此类jar冲突的可见性?
答案 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之间的冲突:
(仅供参考:我搜索文件系统以找出与邮件相关的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");