2013-06-13 10 views
7

Ho cercato diversi post correlati qui e in altri luoghi, ma nessuno di loro ha risolto il mio problema. Ho un programma che invia e-mail a un gruppo di persone che usano "javamail API". Ha funzionato bene una volta. Oggi ho bisogno di nuovo, ma non riesco a inviare alcuna email ... Il mio metodo sendEmail è la seguente:Il mio programma Java ha smesso di inviare email usando il mio account 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); 

} 

Così, ora il tentativo di chiamare questo metodo ho ottenuto il seguente errore (sto usando 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 

non so come risolvere questo problema, dal momento che consente di lavorare prima ... Inoltre, non so se la mia Gmail ha qualcosa a che fare con questo (se bloccato questo accesso ...)

Apprezzo qualsiasi aiuto.

risposta

24

L'errore fondamentale è questo:

Causato da: sun.security.provider.certpath.SunCertPathBuilderException: incapace di trovare valido percorso di certificazione al target richiesto

Vedi this JavaMail FAQ entry.

Dato che ci si sta collegando a Gmail, questo non dovrebbe accadere. Le cause più probabili sono:

  • C'è un firewall o un programma antivirus che intercetta la richiesta.
  • C'è qualcosa che non va nella propria installazione JDK impedendole di trovare le autorità di certificazione attendibili
  • si sta eseguendo in un application server che ha ignorato elenco di autorità di certificazione attendibili
+8

ho finalmente trovato il problema! Era l'anti-virus che bloccava l'applicazione. Molte grazie! – user2484053

+0

I tuoi consigli mi hanno aiutato molto :-) – user2484053

+2

Questo mi ha aiutato ... nel mio caso lo ha fatto avast. –

5

sono stato alle prese con il JDK questo errore per diverse ore. Ho provato ad installare i certificati del server utilizzando la risposta fornita da Bil Shannon. Niente ha funzionato

Il mio problema era AVAST Antivirus. Una volta disabilitato Avast Mail Shield, sono riuscito a inviare mail tramite l'account Gmail dalla mia app Web.

+1

Anch'io - stupido AVAST. – Simon

+1

Giusto, quello era il mio primo punto elenco sopra. –

0

Ho avuto questo problema con java 8. Dopo l'aggiornamento questo problema risolto struttura

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

se stivale primavera utilizzato in application.property

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

Problemi correlati