Java Mail:没有smtp的提供者

我正在使用JavaMail来创建一个简单的应用程序,当它在目录中找到一些文件时发送电子邮件。 我设法让它从Eclipse工作。 我运行应用程序,它发送的电子邮件没有错误。

但是,当我创建jar并执行它时,它在电子邮件发送部分失败了。 它给出了这个例外:

javax.mail.NoSuchProviderException: No provider for smtp at javax.mail.Session.getProvider(Session.java:460) at javax.mail.Session.getTransport(Session.java:655) at javax.mail.Session.getTransport(Session.java:636) at main.java.util.MailManager.sendMail(MailManager.java:69) at main.java.DownloadsMail.composeAndSendMail(DownloadsMail.java:16) at main.java.DownloadsController.checkDownloads(DownloadsController.java:51) at main.java.MainDownloadsController.run(MainDownloadsController.java:26) at java.lang.Thread.run(Unknown Source) 

我在这个方法中使用库:

 public static boolean sendMail(String subject, String text) { noExceptionsThrown = true; try { loadProperties(); } catch (IOException e1) { System.out.println("Problem encountered while loading properties"); e1.printStackTrace(); noExceptionsThrown = false; } Properties mailProps = new Properties(); String host = "mail.smtp.host"; mailProps.setProperty(host, connectionProps.getProperty(host)); String tls = "mail.smtp.starttls.enable"; mailProps.setProperty(tls, connectionProps.getProperty(tls)); String port = "mail.smtp.port"; mailProps.setProperty(port, connectionProps.getProperty(port)); String user = "mail.smtp.user"; mailProps.setProperty(user, connectionProps.getProperty(user)); String auth = "mail.smtp.auth"; mailProps.setProperty(auth, connectionProps.getProperty(auth)); Session session = Session.getDefaultInstance(mailProps); //session.setDebug(true); MimeMessage message = new MimeMessage(session); try { message.setFrom(new InternetAddress(messageProps.getProperty("from"))); message.addRecipient(Message.RecipientType.TO, new InternetAddress( messageProps.getProperty("to"))); message.setSubject(subject); message.setText(text); Transport t = session.getTransport("smtp"); try { t.connect(connectionProps.getProperty("user"), passwordProps .getProperty("password")); t.sendMessage(message, message.getAllRecipients()); } catch (Exception e) { System.out.println("Error encountered while sending the email"); e.printStackTrace(); noExceptionsThrown = false; } finally { t.close(); } } catch (Exception e) { System.out.println("Error encountered while creating the message"); e.printStackTrace(); noExceptionsThrown = false; } return noExceptionsThrown; } 

我从属性文件加载这些值。

 mail.smtp.host=smtp.gmail.com mail.smtp.starttls.enable=true mail.smtp.port=587 mail.smtp.auth=true 

我试图通过ssl://smtp.gmail.com更改主机,端口由465(仅用于尝试不同的东西),但它也不起作用。 无论如何,如果Eclipse使用原始参数工作正常,我想这些值是正确的,但问题是创建jar。 我不太了解创建jar时可能的结果或变化。 创建jar时,JavaMail库是否会出错?

你有什么想法?

支持jar:mail.jar和activation.jar不在您的类路径中。 构建jar时,需要在类路径中包含这些jar。

我有同样的问题。

您可以通过在Eclipse中创建Runnable JAR文件并使用库处理选项来修复它。 在制作JAR时选择第二个,即“将所需的库打包到生成的JAR中”

包所需的库

你需要添加smtp.jar文件,在谷歌搜索和检查一些较旧的项目后我也遇到了同样的错误我发现我错过了我的库中的这个特殊的jar,我将这个jar添加到库中并找到了问题固定。

我有同样的错误,从Oracle更新jar直接修复它。

对于使用Gradle的人:您可以按如下方式获取所有必需的Jars(1.5.5是最新版本):

  compile 'com.sun.mail:javax.mail:1.5.5' 

我设法修复了这个错误,这是由于一个糟糕的库。 我试图使用从maven下载的javax.mail jar,结果certificate是不完整的。 所以我再次搜索javamail并直接从Oracle获得一个(点击发布链接)。 这次它是一个zip文件。