Java Mailing Logic: Could not convert socket to TLS

42,451

Solution 1

Whether SSL/TLS is required or not is controlled by your mail server. If it requires it, you have to use it.

You can set the mail.smtp.ssl.trust property to ignore the certificate issue, or you can fix it as described in the JavaMail FAQ.

Solution 2

If you are using

        props.put("mail.smtp.socketFactory.class",
            "javax.net.ssl.SSLSocketFactory");

Please remove this snippet to avoid SSL Configuration from SMTP server.

Solution 3

I've found that we have to set the correct TLS version also, otherwise we may get the same error. Below property settings helped to solve the issue.

<props>
    <prop key="mail.smtp.auth">true</prop>
    <prop key="mail.smtp.starttls.enable">true</prop>
    <prop key="mail.smtp.ssl.protocols">TLSv1.2</prop>
    <prop key="mail.smtp.ssl.trust">mail.XyZ.com</prop>
</props>
Share:
42,451
Shailesh Saxena
Author by

Shailesh Saxena

Qualification: MCA from Kamla Nehru Institute of Technology, Sultanpur, U. P. India, MSc.(Maths) from Ruhelkhand University Bareilly, U. P. India Certifications: OCJP By Oracle, RFT Java By IBM Working Experience: Worked for 6 years as a faculty of Mathematics in Engineering Colleges. Currently enjoying the java as a Technical Lead having 9.5 years of hands on experience.

Updated on August 21, 2022

Comments

  • Shailesh Saxena
    Shailesh Saxena over 1 year

    In one application, I implemented mail sending logic using java. I used smtp.gmail.com over 587 port with a valid gmail id and password. In development environment everything is working fine. But in production environment I need to use a different mailing server say smtp.xyz.in over port 25 with a valid email id and password on that domain.

    When I continue with SSL enable with following code:

    I am getting an error

    Could not convert socket to TLS

    SunCertPathBuilderException: Unable To Find Valid Certification Path To Requested Target

    =======================================================

    final ResourceBundle rsbd=ResourceBundle.getBundle("main/ResourceBundle/Dyna");
    
            // -- Attaching to default Session, or we could start a new one                                            
    
                        props.put("mail.smtp.host", smtpServer);
    
                    props.put("mail.smtp.auth", "true");
    
                    props.put("mail.debug", "true");
    
                props.put("mail.smtp.port", port); 
    
                    props.put("mail.smtp.starttls.enable","true");
    
                props.put("mail.smtp.EnableSSL.enable","true");
    
      Session session =Session.getInstance(props, new Authenticator() {protected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(admin_mail, admin_password);}});
    
             // -- Create a new message --
          Message msg = new MimeMessage(session);
    
         // -- Set the FROM and TO fields --
          msg.setFrom(new InternetAddress(from));
    
          msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(email, false));
    
          msg.setSubject(subject);
          msg.setText(emailContent);
    
          // -- Set some other header information --
          msg.setHeader("X-Mailer", "LOTONtechEmail");
          msg.setSentDate(new Date());
    
            // -- Send the message --
            Transport.send(msg);
    

    When I am removing EnableSSL and trying by adding the following code:

    (getting javax.mail.AuthenticationFailedException:535 5.7.3 Authentication unsuccessful)

    ==========================================================================

    props.put("mail.smtp.socketFactory.port","25");
    
      props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    
      props.put("mail.smtp.socketFactory.fallback", "true");
    
    
      MailSSLSocketFactory sf=new MailSSLSocketFactory();
    
      sf.setTrustAllHosts(true);
    
      props.put("mail.smtp.ssl.socketFactory", sf);
    

    By googling enough in last 3 days, I understand that I need to configure for trusted certificate like given here.

    But I want to continue without encryption and without mugging to enable SSL. Is there a way to send emails by java programs through our own domain without enabling SSL. Any help will be appreciated.