2014-10-08 52 views
4

以下是我的代碼發送電子郵件:javax.mail.NoSuchProviderException:SMTP

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. 最新的mail.jar和smtp.jar被添加到庫中。
  3. SMTP主機地址也是正確的。

如果有人能給我指針,它會有幫助。

+0

確保你使用的是相同版本的jar文件:http://stackoverflow.com/questions/16861553/javax-mail-nosuchproviderexception-no-provider-for-smtps – tjg184 2014-10-08 13:42:12

+0

你必須在你的tomcat中配置smtp server.xml,你做到了嗎? – user2504380 2014-10-08 13:42:24

+0

也許tomcat的已經擁有了自己javax.mail罐子(Geronimo的JavaMail的罐子),它與你的 – Leo 2014-10-08 13:43:24

回答

2

我也陷入類似的情況,但最終可以解決這個問題。在我的情況的問題是proguard_rules.txt文件,我需要添加:

-keep class javax.mail.** {*;} 
-keep class javax.activation.** {*;} 
-keep class com.sun.mail.dsn.** {*;} 
-keep class com.sun.mail.handlers.** {*;} 
-keep class com.sun.mail.smtp.** {*;} 
-keep class com.sun.mail.util.** {*;} 
2

我的mail.jar和activation.jar Tomcat的lib目錄和mailapi.jar和在應用程序的lib目錄中。應用程序在運行時閱讀mailapi.jar,因爲mailapi.jar是郵件API的輕量級版本,它需要smtp.jar,爲什麼應用程序正在拋出smtp異常。 所以,如果你想擺脫這個異常的,

請解決通過了mail.jar和mailapi.jar和之間的衝突:

  • 去除mailapi.jar和(如果它的存在在classpath)
  • 或只保留一對mailapi.jar和和smtp.jar的類路徑,並刪除了mail.jar
  • 或只保留一對的mail.jar和activation.jar的類路徑(清潔方法)

FYI:我搜索文件系統,查找郵件相關的jar文件和必須知道,我在下面的路徑(衝突的jar文件在類路徑中添加的gradle) C:\工作區\ .metadata.plugins \組織.eclipse.wst.server.core \ tmp0 \ wtpwebapps \ testapp \ WEB-INF \ lib)

1

我在將AWS SNS引入到項目中之後,在Android項目中遇到此問題。原來,該AWS-Android的SDK-核心2.2.20.jar庫包括一個名爲javamail.providers在其META-INF文件夾中的文件。

一旦我移除此異常走該.jar文件,我能夠通過Java郵件再次發送電子郵件。