Javamail Could not convert socket to TLS GMail

匿名 (未验证) 提交于 2019-12-03 01:07:01

问题:

I am trying to send an email using JavaMail through gmails SMTP Server. however this code.

final String username = "mygmail@gmail.com";     final String password = "mygmailpassword";      Properties props = new Properties();     props.put("mail.smtp.auth", true);     props.put("mail.smtp.starttls.enable", true);     props.put("mail.smtp.host", "smtp.gmail.com");     props.put("mail.smtp.port", "587");      Session session = Session.getInstance(props,             new javax.mail.Authenticator() {                 protected PasswordAuthentication getPasswordAuthentication() {                     return new PasswordAuthentication(username, password);                 }             });      try {          Message message = new MimeMessage(session);         message.setFrom(new InternetAddress("no-reply@gmail.com"));         message.setRecipients(Message.RecipientType.TO,                 InternetAddress.parse("test@gmail.com"));         message.setSubject("Testing Subject");         message.setText("Dear Mail Crawler,"                 + "\n\n No spam to my email, please!");          Transport.send(message);          System.out.println("Done");      } catch (MessagingException e) {         throw new RuntimeException(e);     } 

Returns an this error

Could not convert socket to TLS; 

The Complete Stacktrace

Exception in thread "main" java.lang.RuntimeException: 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 Test.main(Test.java:43) Caused by: 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:317)     at javax.mail.Service.connect(Service.java:176)     at javax.mail.Service.connect(Service.java:125)     at javax.mail.Transport.send0(Transport.java:194)     at javax.mail.Transport.send(Transport.java:124)     at Test.main(Test.java:38) 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 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1649)     at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241)     at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235)     at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1206)     at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136)     at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)     at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:893)     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165)     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1149)     at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:549)     at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:486)     at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1902)     ... 7 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:323)     at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:217)     at sun.security.validator.Validator.validate(Validator.java:218)     at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)     at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)     at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)     at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1185)     ... 17 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:174)     at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)     at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:318)     ... 23 more 

回答1:

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


回答2:

Make sure your antivirus program isn't interfering and be sure to add an exclusion to your firewall.



回答3:

I disabled avast antivirus for 10 minutes and get it working.



回答4:

Try using the smtpsend program that comes with JavaMail, as described here. If that fails in the same way, there's something wrong with your JDK configuration or your network configuration.



回答5:

If your context is android application , then make sure your android device time is set to current date and time. The underlying exception is "The SSL certificates was not getting authenticated."



回答6:

The first answer from @carlos worked for me:

session.getProperties().put("mail.smtp.starttls.enable", "true"); 

I have tested the property below and worked perfectly for me too:

session.getProperties().put("mail.smtp.ssl.trust", "smtp.gmail.com"); 

The two properties alone solved this type of problem, but by guarantee I used both.



回答7:

Here is the working solution bro. It's guaranteed

1) First of all open your gmail account from which you wanted to send mail, like in you case ""xyz@gmail.com"

2) open this link below https://support.google.com/accounts/answer/6010255?hl=en

3) click on "Go to the "Less secure apps" section in My Account." option

4) Then turn on it

5) that's it (:

here is my code

import javax.mail.*; import javax.mail.internet.*; import java.util.*;  public class SendEmail {     final String senderEmailID = "Sender Email id"; final String senderPassword = "Sender Pass word"; final String emailSMTPserver = "smtp.gmail.com"; final String emailServerPort = "465"; String receiverEmailID = null; static String emailSubject = "Test Mail"; static String emailBody = ":)"; public SendEmail(String receiverEmailID, String emailSubject, String emailBody) { this.receiverEmailID=receiverEmailID; this.emailSubject=emailSubject; this.emailBody=emailBody; Properties props = new Properties(); props.put("mail.smtp.user",senderEmailID); props.put("mail.smtp.host", emailSMTPserver); props.put("mail.smtp.port", emailServerPort); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.socketFactory.port", emailServerPort); props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory"); props.put("mail.smtp.socketFactory.fallback", "false"); SecurityManager security = System.getSecurityManager(); try { Authenticator auth = new SMTPAuthenticator(); Session session = Session.getInstance(props, auth); MimeMessage msg = new MimeMessage(session); msg.setText(emailBody); msg.setSubject(emailSubject); msg.setFrom(new InternetAddress(senderEmailID)); msg.addRecipient(Message.RecipientType.TO, new InternetAddress(receiverEmailID)); Transport.send(msg); System.out.println("Message send Successfully:)"); } catch (Exception mex) { mex.printStackTrace(); } } public class SMTPAuthenticator extends javax.mail.Authenticator { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(senderEmailID, senderPassword); } }     public static void main(String[] args) {        SendEmail mailSender;         mailSender = new SendEmail("Receiver Email id","Testing Code 2 example","Testing Code Body yess");     }  } 


回答8:

What helped me fix this, and i have tried everything before this, was to configure my installed jre to JRE 1.8.

Steps in Eclipse: Windows>preferences>java>installed JRE>jre1.8.0

If it is set to jdk, switch to jre(which is what is supposed to be set to by default with the latest java version).



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!