2013-06-13 31 views
7

Przeszukałem kilka pokrewnych postów tutaj i w innych miejscach, ale żaden z nich nie rozwiązał mojego problemu. Mam program, który wysyła e-maile do zestawu osób za pomocą "interfejsu API javamail". Raz zadziałało. Dziś musiałem jeszcze raz, ale nie mogę wysyłać wiadomości e-mail ... Mój SendEmail metoda jest następująca:Mój program Java przestał wysyłać wiadomości e-mail przy użyciu mojego konta Gmail

public void sendEmail(String userName, String password, String toAddress, 
     String subject, String message, String[] attachFiles) 
     throws AddressException, MessagingException { 

    // sets SMTP properties 
    Properties properties = new Properties(); 
    properties.put("mail.smtp.host", "smtp.gmail.com"); 
    properties.put("mail.smtp.port", "587"); 
    properties.put("mail.smtp.auth", "true"); 
    properties.put("mail.smtp.starttls.enable", "true"); 
    properties.put("mail.user", userName); 
    properties.put("mail.password", password); 

    // creates a new session with an authenticator 
    Authenticator auth = new SMTPAuthenticator(userName, password); 
    Session session = Session.getInstance(properties, auth); 

    // creates a new e-mail message 
    MimeMessage msg = new MimeMessage(session); 

    try { 
     msg.setFrom(new InternetAddress(userName, "My name")); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 
    InternetAddress[] toAddresses = {new InternetAddress(toAddress)};   
    msg.setRecipients(Message.RecipientType.TO, toAddresses); 
    msg.setSubject(subject); 
    msg.setSentDate(new Date()); 

    // creates message part 
    MimeBodyPart messageBodyPart = new MimeBodyPart(); 
    messageBodyPart.setContent(message, "text/html"); 

    // creates multi-part 
    Multipart multipart = new MimeMultipart(); 
    multipart.addBodyPart(messageBodyPart);  

    // adds attachments 
    if (attachFiles != null && attachFiles.length > 0) { 
     for (String filePath : attachFiles) { 
      addAttachment(multipart, filePath); 
     } 
    } 

    // sets the multi-part as e-mail's content 
    msg.setContent(multipart); 

    // sends the e-mail 
    Transport.send(msg); 

} 

Więc teraz próba wywołania tej metody mam następujący błąd (używam JDK 1.7 .0_21):

Sending email Failed... 

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:1907) 
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:666) 
    at javax.mail.Service.connect(Service.java:367) 
    at javax.mail.Service.connect(Service.java:226) 
    at javax.mail.Service.connect(Service.java:175) 
    at javax.mail.Transport.send0(Transport.java:253) 
    at javax.mail.Transport.send(Transport.java:124) 
    at EmailSender.sendEmail(EmailSender.java:86) 
    at CFP_LaWasp_EmailSender.sendCFPLaWasp(CFP_LaWasp_EmailSender.java:178) 
    at CFP_LaWasp_EmailSender.main(CFP_LaWasp_EmailSender.java:220) 
Caused by: 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 sun.security.ssl.Alerts.getSSLException(Alerts.java:192) 
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1886) 
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276) 
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270) 
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1341) 
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153) 
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868) 
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:804) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323) 
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:528) 
    at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:465) 
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1902) 
    ... 9 more 
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385) 
    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:326) 
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231) 
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126) 
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323) 
    ... 19 more 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196) 
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268) 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380) 
    ... 25 more 

nie wiem jak rozwiązać ten problem, ponieważ wykorzystywane do pracy przed ... Ponadto, nie wiem, czy mój Gmail ma coś wspólnego z tym (jeśli zablokował ten dostęp ...)

Doceniam każdą pomoc.

Odpowiedz

24

Kluczem błąd to:

Spowodowany przez: sun.security.provider.certpath.SunCertPathBuilderException: Nie można odnaleźć prawidłową ścieżkę certyfikacji do żądanej docelowej

Zobacz this JavaMail FAQ entry.

Od czasu połączenia z Gmailem nie powinno to mieć miejsca. Najbardziej prawdopodobne przyczyny to:

  • Istnieje zapora lub program antywirusowy przechwytujący żądanie.
  • Jest coś złego w instalacji JDK uniemożliwiając znalezienie zaufanych urzędów certyfikacji
  • używasz w serwerze aplikacji, które zamienione na listę JDK zaufanych urzędów certyfikacji
+8

końcu znalazłem problem! To był program antywirusowy blokujący aplikację. Wielkie dzięki! – user2484053

+0

Wasze wskazówki bardzo pomogły :-) – user2484053

+2

Ten pomógł ... w moim przypadku zrobił to avast. –

5

mam zmaga się z ten błąd przez kilka godzin. Próbowałem zainstalować certyfikaty serwera za pomocą odpowiedzi dostarczonej przez Bil Shannon. Nic nie działało.

Moim problemem był program AVAST Antivirus. Po wyłączeniu Avast Mail Shield mogłem wysyłać wiadomości e-mail za pośrednictwem konta Gmail z mojej aplikacji internetowej.

+1

Ja też - głupi AVAST. – Simon

+1

Dobrze, to był mój pierwszy punkt powyżej. –

0

miałem ten problem, Java 8. Po aktualizacji tej właściwości problem rozwiązany

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

jeśli jest stosowany bagażnika sprężyna w application.property

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