2013-06-13 53 views
7

Tôi đã tìm kiếm một số bài đăng có liên quan tại đây và ở những nơi khác, nhưng không ai trong số họ giải quyết được sự cố của tôi. Tôi có một chương trình gửi email đến một nhóm người sử dụng "API javamail". Nó hoạt động tốt một lần. Hôm nay tôi cần một lần nữa, nhưng tôi không thể gửi bất kỳ email ... phương pháp SendEmail của tôi là như sau:Chương trình Java của tôi đã ngừng gửi email bằng Tài khoản gmail của tôi

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); 

} 

Vì vậy, bây giờ là cố gắng gọi phương thức này, tôi đã nhận lỗi sau (Tôi đang sử dụng 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 

Tôi không biết cách giải quyết vấn đề này vì nó đã từng hoạt động trước đây ... Ngoài ra, tôi không biết liệu Gmail của tôi có liên quan gì không (nếu có đã chặn quyền truy cập này ...)

Tôi đánh giá cao mọi trợ giúp.

Trả lời

24

Các lỗi chủ yếu là thế này:

Nguyên nhân: sun.security.provider.certpath.SunCertPathBuilderException: không thể tìm thấy con đường chứng nhận hợp lệ với mục tiêu yêu cầu

Xem this JavaMail FAQ entry.

Vì bạn đang kết nối với Gmail, điều này sẽ không xảy ra. Các nguyên nhân có khả năng nhất là:

  • Có tường lửa hoặc chương trình chống vi rút chặn yêu cầu của bạn.
  • Đã xảy ra lỗi trong cài đặt JDK của bạn ngăn chặn nó từ việc tìm kiếm các nhà chức trách chứng chỉ tin cậy
  • Bạn đang chạy trong một máy chủ ứng dụng đã ghi đè danh sách các cơ quan chức năng chứng chỉ tin cậy
+8

tôi cuối cùng đã tìm thấy được vấn đề! Đó là phần mềm chống virus chặn ứng dụng. Cảm ơn rất nhiều! – user2484053

+0

Mẹo của bạn đã giúp rất nhiều :-) – user2484053

+2

Điều này đã giúp ... trong trường hợp của tôi avast đã làm điều đó. –

5

tôi đã phải vật lộn với của JDK lỗi này trong vài giờ. Tôi đã cố gắng cài đặt các chứng chỉ máy chủ bằng cách sử dụng câu trả lời được cung cấp bởi Bil Shannon. Không có gì hiệu quả.

Sự cố của tôi là AVAST Antivirus. Khi tôi đã tắt Avast Mail Shield, tôi có thể gửi thư qua tài khoản gmail từ ứng dụng web của tôi.

+1

Tôi cũng vậy - AVAST ngu ngốc. – Simon

+1

Phải, đó là điểm đầu tiên của tôi ở trên. –

0

Tôi có vấn đề này với java 8. Sau khi cập nhật vấn đề này bất động sản giải quyết

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

nếu được sử dụng khởi động mùa xuân trong application.property

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