我有一个非常大的项目,有很多依赖项,在尝试发送邮件时遇到以下异常:
javax.mail.NoSuchProviderException: smtp
我知道代码有效,因为它是其他项目中使用的库的一部分。有谁知道会导致这种异常的原因是什么?我查看了所有的jar,唯一包含'javax.mail'的是'mail-1.4.4-SNAPSHOT.jar'。
是否有一些文件/类注册了'smtp'协议,它可能发生在我的类路径中的其他地方?
答案 0 :(得分:6)
自问这个问题以来已经有一段时间了,但仍然值得回答:
发生的事情是您的邮件服务使用SMTP(通常,它甚至被视为使用的默认协议)协议来发送邮件。无论您将哪些具体类用作邮件服务(可能取决于您是否正在使用Java EE,Spring或其他东西),它最终都会使用javamail API中的类。在此API中,为了建立与邮件服务器的连接,将创建javax.mail.Session的实例,并且此对象将动态加载为要使用的协议提供支持的类。
当加载所需的类时,如果找不到它,则会捕获ClassNotFoundException并将其作为javax.mail.NoSuchProviderException重新抛出,并显示一条消息,指示缺少协议支持。
在这种情况下,解决方案是将smtp.jar添加到类路径中。 使用基于Maven的项目,只需添加以下依赖项
即可 <dependency>
<groupId>com.sun.mail</groupId>
<artifactId>smtp</artifactId>
<version>1.4.5</version>
</dependency>
答案 1 :(得分:3)
我有这个问题。将smtp.jar放在classpath中解决了这个问题。
答案 2 :(得分:2)
我解决这个问题的方法是从类路径中删除邮件jar。在类路径的某个地方存在另一个mail.jar实例,我还能找到它。如果其他人遇到此问题,可以在此处找到有关故障排除的其他信息:
http://forum.springsource.org/showthread.php?t=90737 和 http://forums.sun.com/thread.jspa?threadID=5442371
答案 3 :(得分:2)
我们将jboss从4.x升级到6.x时遇到了同样的问题。
这里的问题是将classpath设置为更多的mail.jar文件(默认服务器将从其common / lib foler获取mail.jar,如果它在那里可用的话)。 要确认它正在使用哪个jar文件,以下语句是有用的。
<强>的System.out.println(的getClass()的getResource( “/的javax /邮件/ Address.class”)); 强>
如果它正在使用您不期望的另一个jar文件..将classpath设置为您正在使用的那个。另外,从上面打印的位置删除该jar文件。
答案 4 :(得分:1)
如果类路径中的“mailapi.jar”文件版本不正确,也会发生这种情况。
我最近升级了一个使用PayPal肥皂API的项目,而PayPal的发行版包含一个mailapi.jar文件,该文件与我目前在项目中的文件不同,导致我的应用程序在发送邮件时失败
所以对我来说,我只能回到我原来的mailapi.jar,我很好。
答案 5 :(得分:1)
我现在有这个问题。问题是在同一个类路径中有两个javax.mail.jar。