【问题标题】:javax.mail.NoSuchProviderException: No provider for smtpsjavax.mail.NoSuchProviderException:没有 smtps 的提供者
【发布时间】:2013-05-27 12:38:48
【问题描述】:

我正在尝试将我的 Java 项目设置为能够发送电子邮件(通过 g-mail,如果重要的话)并且每次尝试时都会收到“javax.mail.NoSuchProviderException: No provider for 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)

【问题讨论】:

    标签: java jar jakarta-mail


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我在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)

      【讨论】:

        【解决方案3】:

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

        确保你记得设置

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

        而不是

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

          • 感谢此次更新。我有同样的问题和同样的原因。我的问题是通过将 javax.mail.jar 放在我的 CLASSPATH 的开头来解决的(我在 UNIX 环境中并且正在使用命令行)。
          • 我们在使用 Java 和 Wildfly 8 时遇到了同样的情况。我们解决了这个问题,包括 smtp 对 pom.xml 的依赖以强制加载提供程序。另一个有效的解决方案是在 Wildfly 管理上配置邮件并使用 @Resource。然而,最新的方法需要特定的应用服务器配置。
          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 这确实是很多情况下的答案。大多数人会更新 javamail 并且确实可以工作,但出现的问题是版本 1.4.7。 1.4.7版本需要smtp.jar。当您无法更新javamail版本时,这就是解决方案!
            【解决方案7】:

            试试

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

              • 我正在使用 Eclipse。根据我的(有限)理解,JDK 1.6 自动包含 JAF。不是这样吗?
              • 很抱歉,我在写这篇文章的时候脑子里转了转。您需要确保 javax.mail.jar 在您的构建路径中。(使用我上面写的相同步骤)。我刚刚重新运行了上面链接中的电子邮件代码,它在我的导入中没有框架的情况下运行。
              • 它在我的构建路径中。我已经通过右键单击我的项目(在 Eclipse 中),选择“属性”,选择“Java 构建路径”,最后选择“库”来确认这一点。我可以在那里看到mail.jar。我还可以在“订购和导出”选项卡下看到它。我已经添加了堆栈跟踪以防万一。
              • 另外,作为参考,我在您提供的链接 (stackoverflow.com/questions/3649014/send-email-using-java) 上添加了 Cheok Yan Cheng 的评论,我在同一行得到了同样的错误。
              【解决方案9】:

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

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

              【讨论】:

              • 试过了,认为它有一些机会,因为这解决了另一个问题,但在这种情况下没有骰子。
              • 但作为参考,我在 Eclipse 本身中运行应用程序。
              • 如果可以,请尝试在 Eclipse 之外运行它。 “smtp”是否以同样的方式失败?试试: session.addProvider(new Provider(Provider.Type.Transport, "smtps", "com.sun.mail.smtp.SMTPSSLTransport", "", ""));
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-08-13
              • 2012-07-07
              • 2018-06-29
              • 2018-08-11
              • 2017-06-04
              • 2018-04-24
              相关资源
              最近更新 更多