11

我正在尝试将我的 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 。此外,1.4.7 版的 javamail 中似乎不存在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)
4

9 回答 9

8

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

邮件 api 中有几个用于不同协议的 jar。例如:dsn.jar、gimap.jar、imap.jar、mailapi.jar、pop3.jar、smtp.jar

于 2014-09-22T06:14:22.520 回答
8

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

于 2015-09-07T10:29:17.833 回答
7

所以事实证明,问题在于我引用的项目中包含了一个过时的 mail.jar 版本,并且在更新该 mail.jar 的副本后,问题得到了解决。

以供将来参考,是否有任何方法可以记录或提供此类 jar 冲突的可见性?

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

于 2013-06-05T15:27:57.190 回答
4

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

于 2013-05-31T17:34:26.587 回答
1

JavaMail 向 ClassLoader 请求配置协议提供程序的配置文件。如果 ClassLoader 不能正常工作,JavaMail 将无法找到配置文件。OSGi 类加载器的工作方式与 JavaMail 的预期不兼容,这可能会导致此问题。如果您在 Eclipse 本身中运行您的应用程序,那可能会解释这个问题。此问题的另一个常见原因是将 mail.jar 文件导入到您的项目中,从而将类文件从 jar 文件中提取并包含在您的应用程序中,但留下了配置文件。

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

于 2013-05-31T20:20:47.110 回答
0

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

确保你记得设置

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

代替

 properties.put("mail.transport.protocol", "SMTP"));
于 2016-04-11T10:02:59.727 回答
0

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

请通过以下方式解决 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)

于 2018-03-09T17:23:55.110 回答
0

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

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

于 2018-06-28T03:00:33.910 回答
-1

尝试

Transport transport = session.getTransport("smtp");
于 2013-10-15T19:03:31.543 回答