2016-01-26 5 views
0

Я пытаюсь отправить электронную почту с моей java, и я не смог подключиться к моему хосту. Вот мои коды:Javamail - Не удалось подключиться к SMTP-хосту

public class sendEmail implements Runnable{ 
    @Override 
    public void run(){ 
     try{ 
      final String username = "user", password = "pass", from = "[email protected]", to = "[email protected]"; 

      Properties props = new Properties(); 
      props.setProperty("mail.smtp.user", username); 
      props.setProperty("mail.smtp.host", "mail.host.com"); 
      props.setProperty("mail.smtp.ssl.enable", "true"); 
      props.setProperty("mail.smtp.port", "465"); 
      props.setProperty("mail.smtp.starttls.enable", "true"); 
      props.setProperty("mail.smtp.debug", "true"); 
      props.setProperty("mail.smtp.auth", "true"); 
      props.setProperty("mail.smtp.socketFactory.port", "465"); 
      props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
      props.setProperty("mail.smtp.socketFactory.fallback", "false"); 
      Authenticator auth = new SMTPAuthenticator(); 
      Session session = Session.getInstance(props, auth); 
      session.setDebug(true); 

      Message msg = new MimeMessage(session); 
      try{ 
       msg.setSubject("Test SMTP"); 
       msg.setFrom(new InternetAddress(from)); 
       msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); 
       Transport transport = session.getTransport("smtp"); 
       transport.connect("mail.itbuntuksemua.com", username, password); 
       transport.sendMessage(msg, msg.getAllRecipients()); 
       transport.close(); 
       System.out.println("Done"); 
      }catch(MessagingException | NumberFormatException | HeadlessException ex){ 
       ex.printStackTrace(); 
      } 
     }catch(UnknownHostException | NumberFormatException ex){ 
      ex.printStackTrace(); 
     } 
    } 
} 

и здесь мои SMTPAuthenticator() коды:

private class SMTPAuthenticator extends javax.mail.Authenticator { 
    @Override 
    public PasswordAuthentication getPasswordAuthentication() { 
     String username = "user"; 
     String password = "pass"; 
     return new PasswordAuthentication(username, password); 
    } 
} 

и здесь снова, мои отчеты об ошибках:

DEBUG: setDebug: JavaMail версия 1.4.7 DEBUG : getProvider() возвращает javax.mail.Provider [TRANSPORT, smtp, com.sun.mail.smtp.SMTPTransport, Oracle] DEBUG SMTP: useEhlo true, useAuth true DEBUG SMTP: попытка подключения к хосту «mail.host.com», порт 465, isSSL true javax.mail.MessagingException: не удалось подключиться к SMTP-хосту: mail.host.com, порт: 465; Вложенное исключение: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Не удалось создать путь PKIX: sun.security.provider.certpath.SunCertPathBuilderException: не удалось найти действительный путь сертификации для запрошенной цели at com. sun.mail.smtp.SMTPTransport.openServer (SMTPTransport.java:1961) at com.sun.mail.smtp.SMTPTransport.protocolConnect (SMTPTransport.java:654) at javax.mail.Service.connect (Service.java: 295) на javax.mail.Service.connect (Service.java:176) на scam.ccChecker $ sendEmail.run (ccChecker.java:186) на java.lang.Thread.run (Thread.java:745) Вызвано: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Не удалось создать путь PKIX: sun .security.provider.certpath.SunCertPathBuilderException: не удалось найти допустимый путь сертификации для запрошенной цели at sun.security.ssl.Alerts.getSSLException (Alerts.java:192) at sun.security.ssl.SSLSocketImpl.fatal (SSLSocketImpl. java: 1937) at sun.security.ssl.Handshaker.fatalSE (Handshaker.java:302) at sun.security.ssl.Handshaker.fatalSE (Handshaker.java:296) at sun.security.ssl.ClientHandshaker. serverCertificate (ClientHandshaker.java:1478) at sun.security.ssl.ClientHandshaker.processMessage (ClientHandshaker.java:212) at sun.security.ssl.Handshaker.processLoop (Handshaker.java:957) at sun.security. ssl.Handshaker.process_record (Handshaker.java:892) at sun.security.ssl.SSLSocketImpl.readRecord (SSL SocketImpl.java:1050) на sun.security.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1363) на sun.security.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1391) в sun.security.ssl. SSLSocketImpl.startHandshake (SSLSocketImpl.java:1375) на com.sun.mail.util.SocketFetcher.configureSSLSocket (SocketFetcher.java:549) на com.sun.mail.util.SocketFetcher.createSocket (SocketFetcher.java:354) в com.sun.mail.util.SocketFetcher.getSocket (SocketFetcher.java:211) в com.sun.mail.smtp.SMTPTransport.openServer (SMTPTransport.java:1927) ... 5 более Вызванный: sun.security.validator.ValidatorException: Не удалось создать путь PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найдите действительный путь сертификации для запрошенной цели at sun.security.validator.PKIXValidator.doBuild (PKIXValidator.java:387) at sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.java:292) at sun.security.validator .Validator.validate (Validator.java:260) at sun.security.ssl.X509TrustManagerImpl.validate (X509TrustManagerImpl.java:324) at sun.security.ssl.X509TrustManagerImpl.checkTrusted (X509TrustManagerImpl.java:229) в sun.security.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:124) в sun.security.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1460) ... больше 16 Вызвано: sun.security.provider.certpath.SunCertPathBuilderException: не удалось найти действительный путь сертификации для запрошенной цели at sun.security.provider.certpath.SunCertPathBuilder.build (SunCertPathBuilder.java:145) at sun.security.provider .certpath.SunCertPathBuilder.engineBuild (SunCertPathBuilder.java:131) на java.security.cert.CertPathBuilder.build (CertPathBuilder.java:280) на sun.security.validator.PKIXValidator.doBuild (PKIXValidator.java:382) ... 22 подробнее

Может кто-нибудь мне помочь? :(

+0

Похоже, что (при догадках) они используют самозаверяющий сертификат. –

+0

Возможный дубликат [PACIX path building failed: невозможно найти допустимый путь сертификации для запрошенной цели] (http://stackoverflow.com/questions/4062307/pkix-path-building-failed-unable-to-find-valid-certification -path-to-request) – rjdkolb

+0

Возможно, у вас нет сертификата для этого почтового сервера. – Just1689

ответ

0

Может быть, вы можете попытаться установить сертификат, чтобы получить доступ к SMTP-порт что-то вроде этого:.

System.setProperty("javax.net.ssl.trustStore","key"); 
System.setProperty("javax.net.ssl.trustStorePassword","password"); 
+0

, как мне получить ключ «trustStore»? –

+0

Вам нужно сгенерировать его. Есть статьи, как это сделать. –

+0

Я получил это (https://docs.oracle.com/cd/E19509-01/820-3503/6nf1il6er/index.html).но я не понимаю –

2

Вы можете попытаться загрузить сертификат, установите его с помощью Keytool, а затем установить их в качестве системы . переменные Вот как:

  1. Перейти к URL в браузере Firefox, нажмите на HTTPS цепочку сертификатов (рядом с URL-адрес) нажмите "more info" > "security" > "show certificate" > "details" > "export.." Pickup имя и выбрать тип файла example.der Теперь у вас есть файл с хранилищем ключей и... вы должны добавить его в свой JVM
  2. Найдите файл $JAVA_HOME/jre/lib/security/cacerts
  3. Импорт example.der файла в файл cacerts, используя следующие:

    sudo keytool -import -alias example -keystore $JAVA_HOME/jre/lib/security/cacerts -file example.der 
    
  4. по умолчанию пароль хранилища ключей является «changeit»

  5. Вы можете просмотреть изменения, вы сделали с этой командой, которая показывает отпечаток сертификата.

    keytool -list -keystore cacerts 
    
  6. Если это не решает проблему, попробуйте добавить эти опции Java в качестве аргументов:

    -Djavax.net.ssl.trustStore="$JAVA_HOME/jre/lib/security/cacerts" 
    -Djavax.net.ssl.trustStorePassword="changeit" 
    
  7. Или вы можете поместить их в качестве системных переменных в коде Java:

    System.setProperty("javax.net.ssl.trustStore","/usr/lib/jvm/java-1.7.0-openjdk-amd64/jre/lib/security/cacerts"); 
    System.setProperty("javax.net.ssl.trustStorePassword","changeit"); 
    

Более подробные инструкции можно найти здесь: https://stackoverflow.com/a/36427118/1696153

+1

спасибо за ответ, я использую этот 'System.setProperty (« javax.net.ssl.trustStore »,« * »);' и его работы хорошо для меня. –

Смежные вопросы