Session.getInstance的Java Mail问题

我在尝试使用java邮件时收到以下exception;

java.lang.NoClassDefFoundError: com/sun/mail/util/MailLogger at javax.mail.Session.initLogger(Session.java:226) at javax.mail.Session.(Session.java:210) at javax.mail.Session.getInstance(Session.java:247) at com.secondstory.mailsender.MailSender.createSmtpSession(MailSender.java:67) at com.secondstory.mailsender.MailSender.sendSimpleMessage(MailSender.java:38) at com.secondstory.mailsender.MailSender.generateLostPasswordEmail(MailSender.java:79) at com.secondstory.mailsender.MailSenderTest.shouldReturnTrueWithCredentialsSet(MailSenderTest.java:49) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) Caused by: java.lang.ClassNotFoundException: com.sun.mail.util.MailLogger at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 30 more 

在广泛搜索堆栈溢出之后(可能不够广泛 – 让我们看看!)我发现我们需要在我们的maven pom中使用两个jar子来完成这项工作。 我有两个依赖如下;

  javax.mail javax.mail-api 1.5.2 runtime   javax.activation activation 1.1.1  

有些东西已经改变,但我不完全确定它是什么 – 因为这在以前有效。 我写的代码失败的代码如下:

 private static Session createSmtpSession() { final Properties props = new Properties(); props.setProperty("mail.host", "host"); props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.smtp.starttls.enable", "true"); props.setProperty("mail.transport.protocol", "smtp"); //props.setProperty("mail.debug", "true"); return Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication( "username", "password"); } }); } 

我错过了一些配置,还是应该使用我当前的设置?

谢谢

尝试将其添加到Maven POM中:

  com.sun.mail javax.mail 1.5.2  

问题是你正在尝试使用javax.mail-api.jar 。 那是错误的图书馆。 JavaMail是一个Java EE规范,该规范的接口发布在javax.mail-api-1.6.1.jar ,它只在编译时才有效。 它不提供规范的实现,因此它在运行时不起作用。

您需要在运行时使用JavaMail规范的实现。 您可以在https://javaee.github.io/javamail/上找到参考实现(但还有其他一些,例如Java EE应用程序服务器通常包含一个)。

对于javax.mail-api.jar , https : javax.mail-api.jar说:

仅适用于JavaMail API定义,适用于编译; 仅用于Maven“提供”依赖范围

特别是在您的情况下,您需要javax.mail.jarmailapi.jar +您要使用的特定协议的jar。 例如mailapi.jar + smtp.jar如果你只需要smtp支持。

使用Maven,您可以使用

  com.sun.mail javax.mail 1.6.1