2012-11-28 7 views
6

मैं smtp पर ईमेल भेजने के लिए जावा मेल का उपयोग कर रहा हूं। SMTP सेटिंग नीचे दिए गए:एसएसएल के बिना जावा मेल - PKIX पथ निर्माण विफल:

 Properties props = new Properties(); 
     Object put = props.put("mail.smtp.host", smtpHost); 
     props.put("mail.smtp.user", smtpUser); 
     props.put("mail.smtp.auth", true); 
     props.put("mail.debug", mailDebug); 
     props.put("mail.smtp.port", port); 

smtp साख उपर्युक्त विवरण मेरी smtpHost को telnetting द्वारा सत्यापित किया गया है। हालांकि, जब मैं जावा मेल में उपर्युक्त सेटिंग्स का उपयोग करता हूं तो मुझे निम्न अपवाद मिलता है।

 250-AUTH PLAIN LOGIN 
     250-STARTTLS 
     250 HELP 
     DEBUG SMTP: Found extension "SIZE", arg "52428800" 
     DEBUG SMTP: Found extension "8BITMIME", arg "" 
     DEBUG SMTP: Found extension "PIPELINING", arg "" 
     DEBUG SMTP: Found extension "AUTH", arg "PLAIN LOGIN" 
     DEBUG SMTP: Found extension "STARTTLS", arg "" 
     DEBUG SMTP: Found extension "HELP", arg "" 
     DEBUG SMTP: Attempt to authenticate 
     DEBUG SMTP: check mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM 
     DEBUG SMTP: AUTH LOGIN command trace suppressed 
     DEBUG SMTP: AUTH LOGIN failed 
     Nov 29, 2012 11:54:40 AM com.Test main 
     SEVERE: null 
     javax.mail.AuthenticationFailedException: 535 Incorrect authentication data 

जब मैं पंक्ति जोड़ें:

 props.put("mail.smtp.starttls.enable", false); 

यह फिर से एक ही प्रमाणीकरण विफल अपवाद उत्पन्न करता है।

अगर मैं सेट mail.smtp.starttls.enableसच करने के लिए, प्रमाणीकरण सफल होता है, लेकिन मैं निम्नलिखित अपवाद: दूसरा अपवाद के बारे में विभिन्न मंच धागे अध्ययन करने के बाद

 220 TLS go ahead 
    Nov 28, 2012 5:32:36 PM com.Test main 
    SEVERE: null 
    javax.mail.MessagingException: Could not convert socket to TLS; 
    nested exception is: 
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1918) 
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:652) 
    at javax.mail.Service.connect(Service.java:317) 

, मैंने सर्वर के स्वयं-हस्ताक्षरित प्रमाणपत्र लाने के लिए InstallCert प्रोग्राम चलाया। InstallCert निम्न अपवाद फेंकता है:

  Opening connection to mydomain.com.au:443... 
      Starting SSL handshake... 
      javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? 
        at sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:542) 
        at sun.security.ssl.InputRecord.read(InputRecord.java:374) 
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:850) 
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1190) 
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1217) 
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1201) 
        at InstallCert.main(InstallCert.java:100) 
      Could not obtain server certificate chain 

तो, लग रहा है अपने सर्वर की तरह ssl नहीं है, लेकिन STARTTLS सक्षम है। किसी एसएसएल वाले सर्वर पर STARTTLS के साथ मेल भेजने के लिए सही पैरामीटर क्या हैं?

उत्तर

10

This JavaMail FAQ entry सहायता चाहिए।

इस तरह MailSSLSocketFactory उपयोग करके देखें:

MailSSLSocketFactory sf = new MailSSLSocketFactory(); 
    sf.setTrustAllHosts(true); 
    props.put("mail.smtp.ssl.socketFactory", sf); 
+0

मैं कोशिश की थी कि एक। एफएक्यू में वर्णित प्रयुक्त इंस्टॉलकर्ट, और मुझे अपवाद मिला "javax.net.ssl.SSLException: अपरिचित एसएसएल संदेश, सादा टेक्स्ट कनेक्शन?"। ऐसा लगता है कि मेरा सर्वर एसएसएल का उपयोग नहीं कर रहा है। – janenz00

+0

इंस्टॉलकर्ट अपवाद के साथ भी मेरा प्रश्न संपादित किया। – janenz00

+0

इंस्टॉलकर्ट के साथ समस्या यह है कि यह केवल तभी काम करता है जब आप एसएसएल कनेक्शन शुरू कर सकें। यदि आपका सर्वर केवल सादा पाठ कनेक्शन का समर्थन करता है जो एसएसएल (टीएलएस) कनेक्शन में परिवर्तित हो जाते हैं, तो InstalCert मदद नहीं करेगा। आप [MailSSLSocketFactory] (http://javamail.kenai.com/nonav/javadocs/com/sun/mail/util/MailSSLSocketFactory.html) कक्षा को देखना चाहते हैं, जो आपके लिए स्वयं हस्ताक्षरित करने में आसान बनाता है प्रमाण पत्र जो अन्यथा सत्यापित नहीं करेंगे। –

2

मुझे :)

Properties props = new Properties(); 
     props.put("mail.transport.protocol", "smtp"); 
     props.put("mail.smtp.host", "smtp.companydomain.biz"); // 
     props.put("mail.smtp.auth", "true"); 
     props.put("mail.debug", "true"); 
     props.put("mail.smtp.starttls.enable", "true");`enter code here` 
     props.put("mail.smtp.port", "25"); 
     props.put("mail.smtp.socketFactory.port", "25"); 
     props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
     props.put("mail.smtp.socketFactory.fallback", "true"); 

     MailSSLSocketFactory sf = null; 
     try { 
      sf = new MailSSLSocketFactory(); 
     } catch (GeneralSecurityException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     sf.setTrustAllHosts(true); 
     props.put("mail.smtp.ssl.socketFactory", sf); 

     Session mailSession = Session.getInstance(props, new javax.mail.Authenticator() { 

      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication("[email protected]", "password"); 
      } 
     }); 

     mailSession.setDebug(true); // Enable the debug mode 

     Message msg = new MimeMessage(mailSession); 

     //--[ Set the FROM, TO, DATE and SUBJECT fields 
     try { 
      msg.setFrom(new InternetAddress("[email protected]")); 
     } catch (AddressException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (MessagingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      msg.setRecipients(Message.RecipientType.TO,InternetAddress.parse("[email protected]")); 
     } catch (AddressException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (MessagingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     //msg.setSentDate(new Date()); 
     try { 
      msg.setSubject("Hello World!"); 
     } catch (MessagingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     //--[ Create the body of the mail 
     try { 
      msg.setText("Hello from my first e-mail sent with JavaMail"); 
     } catch (MessagingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     //--[ Ask the Transport class to send our mail message 
     try { 
      Transport.send(msg); 
     } catch (MessagingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
0

के लिए काम किया मैं जावा 8. के ​​साथ इस समस्या थी इस संपत्ति समस्या अद्यतन करने के बाद हल

props.put ("mail.smtp.ssl.trust", "smtp.gmail.com")

यदि application.property में इस्तेमाल वसंत बूट

spring.mail.properties.mail.smtp.ssl.trust = smtp.gmail.com

संबंधित मुद्दे