2012-11-28 17 views
6

私はsmtp経由で電子メールを送信するためにJavaメールを使用しています。 SMTP設定は以下の通り:sslなしのJavaメール - 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にtelnet接続によって検証されています。しかし、上記の設定をJavaメールで使用すると、以下の例外が発生します。それは、再び同じ認証失敗例外を発生さ

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

:私は行を追加し

 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 

。 、2番目の例外に関する様々なフォーラムのスレッドを通過した後

 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) 

は私がmail.smtp.starttls.enableには、認証が成功した場合、私は、次の例外を取得します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を使用してメールを送信するための正しいパラメータは、sslがないサーバには何ですか?

答えて

10

This JavaMail FAQ entryが役立ちます。

はこのようMailSSLSocketFactoryを使用してみてください:

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

に春ブーツを使用した場合。 FAQに説明されているようにInstallCertを使用しましたが、「javax.net.ssl.SSLException:認識できないSSLメッセージ、平文接続ですか?」という例外がありました。私のサーバーはSSLをまったく使用していないようです。 – janenz00

+0

InstallCert例外についても私の質問を編集しました。 – janenz00

+0

InstallCertの問題点は、InstallCertがSSL接続を開始できる場合にのみ機能することです。サーバーがSSL(TLS)接続に変換するプレーンテキスト接続のみをサポートしている場合、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

働いたこのプロパティの問題を更新する

props.putを解決した後、私は、Java 8でこの問題がありました( "mail.smtp.ssl.trust"、 "smtp.gmail.com")

application.property私は1つを試してみました

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