javax.mail.NoSuchProviderException:smtp

时间:2014-10-08 13:38:08

标签: java email

以下是我发送电子邮件的代码:

    Properties props = new Properties();
    props.put("mail.smtp.host", host);
    props.put("mail.debug", "false");

    final Session session = Session.getInstance(props);
    final Message msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress(from));
    msg.setRecipients(Message.RecipientType.TO, toAddress);
    msg.setSubject(subject);
    msg.setSentDate(new Date());
    Multipart multipart = new MimeMultipart("related");
    BodyPart mbp1 = new MimeBodyPart();
    mbp1.setContent(body, "text/html");         
    multipart.addBodyPart(mbp1);
    Transport.send(msg);

错误堆栈跟踪:

javax.mail.NoSuchProviderException: smtp
    at javax.mail.Session.getService(Session.java:764)
    at javax.mail.Session.getTransport(Session.java:689)
    at javax.mail.Session.getTransport(Session.java:632)
    at javax.mail.Session.getTransport(Session.java:612)
    at javax.mail.Session.getTransport(Session.java:667)
    at javax.mail.Transport.send0(Transport.java:154)
    at javax.mail.Transport.send(Transport.java:80)

注意:

  
      
  1. 如果作为桌面应用程序执行,则相同的代码有效。但是在tomcat上部署时会抛出异常。
  2.   
  3. 最新的mail.jar和smtp.jar已添加到库中。
  4.   
  5. SMTP主机地址也正确。
  6.   

如果有人可以指点我会有所帮助。

3 个答案:

答案 0 :(得分:3)

我也遇到了类似的情况,但最终还是可以解决它。在我的情况下,问题是我需要添加的static void Main(string[] args) { var someArray = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var fns = new List<Action>(); for (int i = 0; i < someArray.Length; i++) { var local = i; fns.Add(() => myFunction(local, someArray[local])); } foreach (var fn in fns) fn(); } private static void myFunction(int i, int v) { Console.WriteLine($"{v} at idx:{i}"); } 文件:

proguard_rules.txt

答案 1 :(得分: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文件(在classpath中由gradle添加) C:\工作空间\ .metadata.plugins \ org.eclipse.wst.server.core \ TMP0 \ wtpwebapps \ testapp \ WEB-INF \ lib中)

答案 2 :(得分:1)

我在将AWS SNS引入项目后工作的Android项目中遇到此问题。事实证明, aws-android-sdk-core-2.2.20.jar 库在其META-INF文件夹中包含一个名为 javamail.providers 的文件。

一旦我从.jar中删除了这个文件,这个例外就消失了,我又可以通过java邮件再次发送电子邮件了。