title: Unable to send an email using SMTP (Getting javax.mail.MessagingException: Could not convert socket to TLS;)
body: <p>I have written the following code for sending email using javamail API through SMTP as TLS as SSL is not supported but I ended up with the following exception. Please see my code below. I have used debugging mode and below the code you can find the exception as well.</p>
  
  <pre><code>import java.util.Properties;
  import javax.mail.Message;
  import javax.mail.MessagingException;
  import javax.mail.PasswordAuthentication;
  import javax.mail.Session;
  import javax.mail.Transport;
  import javax.mail.internet.InternetAddress;
  import javax.mail.internet.MimeMessage;
  
  public class SendMailTLS {
  
      public static void main(String[] args) {
  
          final String username = "---------@mydomain.com";
          final String password = "***********";
  
          Properties props = new Properties();
          props.put("mail.smtp.auth", "true");
          props.put("mail.smtp.starttls.enable", "true");
          props.put("mail.smtp.host", "mail.mydomain.com");
          props.put("mail.smtp.debug", "true");
          props.put("mail.smtp.port", "587");
  
          Session session = Session.getInstance(props,
            new javax.mail.Authenticator() {
              protected PasswordAuthentication getPasswordAuthentication() {
                  return new PasswordAuthentication(username, password);
              }
            });
          session.setDebug(true);
  
          try {
  
              Message message = new MimeMessage(session);
              message.setFrom(new 
                    InternetAddress("---------@mydomain.com"));
              message.setRecipients(Message.RecipientType.TO,
              InternetAddress.parse("---------@mydomain.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);
          }
      }
  }
  </code></pre>
  
  <p>Exception trace</p>
  
  <pre><code>DEBUG: setDebug: JavaMail version 1.4.5
  DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
  DEBUG SMTP: useEhlo true, useAuth true
  DEBUG SMTP: useEhlo true, useAuth true
  DEBUG SMTP: trying to connect to host "mail.mydomain.com", port 587, isSSL false
  220-cpanel35.per.syra.net.au ESMTP Exim 4.80 #2 Fri, 05 Oct 2012 17:28:56 +0800 
  220-We do not authorize the use of this system to transport unsolicited, 
  220 and/or bulk e-mail.
  DEBUG SMTP: connected to host "mail.mydomain.com", port: 587
  
  EHLO xxxxxx.xxxxx.com
  250-cpanel35.per.syra.net.au Hello xxxx.xxxxx.com [xx.xx.xx.xxx]i
  250-SIZE 52428800
  250-8BITMIME
  250-PIPELINING
  250-AUTH PLAIN LOGIN
  250-STARTTLS
  250 HELP
  DEBUG SMTP: Found extension "SIZE", arg "52428800"
  DEBUG SMTP: Found extension "8BITMIME", arg ""
  DEBUG SMTP: Found extension "PIPELINING", arg ""
  DEBUG SMTP: Found extension "AUTH", arg "PLAIN LOGIN"
  DEBUG SMTP: Found extension "STARTTLS", arg ""
  DEBUG SMTP: Found extension "HELP", arg ""
  STARTTLS
  220 TLS go ahead
  Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Could not convert socket to TLS;
    nested exception is:
      javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
      at SendMailTLS.main(SendMailTLS.java:52)
  Caused by: javax.mail.MessagingException: Could not convert socket to TLS;
    nested exception is:
      javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
      at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1918)
      at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:652)
      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 SendMailTLS.main(SendMailTLS.java:47)
  Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair
      at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
      at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1868)
      at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1826)
      at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1809)
      at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1328)
      at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1305)
      at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:548)
      at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:485)
      at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1913)
      ... 7 more
  Caused by: java.lang.RuntimeException: Could not generate DH keypair
      at sun.security.ssl.DHCrypt.&lt;init&gt;(DHCrypt.java:123)
      at sun.security.ssl.ClientHandshaker.serverKeyExchange(ClientHandshaker.java:618)
      at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:202)
      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:998)
      at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1294)
      at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1321)
      ... 11 more
  Caused by: java.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive)
      at com.sun.crypto.provider.DHKeyPairGenerator.initialize(DHKeyPairGenerator.java:120)
      at java.security.KeyPairGenerator$Delegate.initialize(KeyPairGenerator.java:658)
      at sun.security.ssl.DHCrypt.&lt;init&gt;(DHCrypt.java:117)
      ... 18 more
  </code></pre>
  
  <p>Can anyone help me debug this? Thanks in advance!</p>