2016-02-03 74 views
0

我試圖從Java郵件API發送郵件時面臨以下異常: javax.mail.MessagingException: Can't send command to SMTP host; nested exception is: javax.net.ssl.SSLHandshakeException: com.ibm.jsse2.util.j: PKIX path building failed: java.security.cert.CertPathBuilderException: PKIXCertPathBuilderImpl could not build a valid CertPath.; internal cause is: java.security.cert.CertPathValidatorException: The certificate issued by CN=Baltimore CyberTrust Root, OU=CyberTrust, O=Baltimore, C=IE is not trusted; internal cause is: java.security.cert.CertPathValidatorException: Certificate chaining errorjavax.mail.MessagingException的:無法發送命令到SMTP主機

下面是我的Java代碼。這個相同的代碼在我的本地系統上工作正常。當我在tomcat服務器上發佈web應用程序時,但是相同的代碼無法正常工作。在IBM WebSphere Application Server上部署此應用程序時。

The certificate issued by CN=Baltimore CyberTrust Root, OU=CyberTrust, O=Baltimore, C=IE is not trusted; 

您使用SSL連接到您的SMTP服務器:

它顯示了上面的異常,

public static void sendMail(String toMailIds,String subject,String htmlMsg){ 
     String[] recipientList = toMailIds.split(","); 
     InternetAddress[] recipientAddress = new InternetAddress[recipientList.length]; 
     int counter = 0; 
     for (String recipient1 : recipientList) { 
      try { 
       recipientAddress[counter] = new InternetAddress(recipient1.trim()); 
      } catch (AddressException e) { 
       e.printStackTrace(); 
      } 
      counter++; 
     } 

    // Sender's email ID needs to be mentioned 
    String from = "[email protected]"; 
    final String username = "[email protected]";//change accordingly 
    final String password ="password`enter code here`";//change accordingly 

    String host = "smtp.office365.com"; 
    Properties props = new Properties(); 
    props.put("mail.smtp.starttls.enable", "true"); 
    props.put("mail.smtp.host", host); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.ssl.trust", host); 
    // props.put("mail.smtp.ssl.enable", "true"); 
    props.put("mail.smtp.port", "587"); 
    props.put("mail.smtp.debug", "true"); 
    props.put("mail.smtp.user", username); 



// Get the Session object. 
    Session session = Session.getInstance(props, 
     new javax.mail.Authenticator() { 
      protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication(username, password); 
       } 
     }); 

    try { 
       Transport tr = session.getTransport("smtp"); 
       tr.connect(); 
       System.out.println("Validating email finished"); 
       // Create a default MimeMessage object. 
       Message message = new MimeMessage(session); 

       // Set From: header field of the header. 
       message.setFrom(new InternetAddress(from)); 

       // Set To: header field of the header. 
       message.setRecipients(Message.RecipientType.TO, recipientAddress); 

       // Set Subject: header field 
       message.setSubject(subject); 

       // HTML TEXT 
       message.setContent(htmlMsg, "text/html"); 


       // Send message 
       Transport.send(message); 

       System.out.println("Sent message successfully...."); 

    } catch (Exception e) { 
     System.out.println("Exception--------------------"+e); 
     throw new RuntimeException(e); 
    }  

       // TODO Auto-generated constructor stub 
}` 

回答

1

見異常。您必須將SMTP服務器證書放入WebSphere Application Truststore才能建立連接。您的Tomcat服務器使用不同的JDK,因此使用不同的信任庫。

查看其他帖子如何在WAS中添加簽署者證書到truststore。

第二個考慮是你應該在WAS中使用MailSession,而不是在代碼中對所有郵件服務器數據進行硬編碼。這是在Java EE應用程序中獲取郵件會話的推薦方式。

如果您不想在完整的WAS上開發,那麼您應該使用WebSphere Liberty配置文件來代替Tomcat進行開發。它在啓動時和內存佔用方面與Tomcat一樣輕巧,並且WAS中已包含庫,因此您不必添加第三方庫。

相關問題