Javax.mail.MessagingException: невозможно отправить команду на SMTP-хост; SSLHandshakeException: нет подходящего протокола

У нас есть устаревшее веб-приложение, созданное на Java 1.7, mail1.4.jar и развернутое в Tomcat 7. При отправке письма с вложением в SMPT (сейчас все перемещается в облако Microsoft) мы получаем ошибку ниже.

javax.mail.MessagingException: невозможно отправить команду на SMTP-хост; вложенное исключение: javax.net.ssl.SSLHandshakeException: нет подходящего протокола (протокол отключен или наборы шифров не подходят) по адресу com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1420) по адресу com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1408) по адресу com.sun.mail.smtp.SMTPTransport.ehlo(SMTPTransport.java:847) по адресу com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:384) в javax.mail.Service.connect(Service.java:297)

Получение всех сведений из файла свойств и установка объекта свойств, например, SMPT.HOST: office365, SMPT.PORT: 587, SMPT.AUTH=true и т. д. Детали ПФБ.

Фрагмент кода:

  final String username = ConfReader.getPropertyValue("mail.username");
  final String passwd = ConfReader.getPropertyValue("mail.password");
  from = ConfReader.getPropertyValue("mail.from");
  String port = ConfReader.getPropertyValue("mail.port"); 
  
  Properties props = new Properties();
  props.put("mail.smtp.host", ConfReader.getPropertyValue("mail.smtp.host"));
  props.put("mail.smtp.auth", "true");
  props.put("mail.smtp.port", port);
  props.put("mail.smtp.starttls.enable", "true");
  props.put("mail.debug", "true");

  Session session = Session.getInstance(props, new Authenticator() {
      @Override
      protected PasswordAuthentication getPasswordAuthentication() {
          LogWriter.logErrorMessage("username :: "
                  + username + "passwd ::"+passwd);
          return new PasswordAuthentication(username, passwd);
      }
  });
  
    Message message = new MimeMessage(session);
  try
  {
    
     message.setFrom(new InternetAddress(from));

     final InternetAddress[] toAddress =
        InternetAddress.parse(toEmails);

     final InternetAddress[] ccAddress =
        InternetAddress.parse(ccEmails);
     
     message.setRecipients(Message.RecipientType.TO, toAddress);
     message.setRecipients(Message.RecipientType.CC, ccAddress);
     message.setSubject(subject);
    
     /*
      * Multipart to create the mail content.
      */
     final Multipart multipart = new MimeMultipart();
     /*
      * html body part to set in multipart
      */
    
     final MimeBodyPart htmlBodyPart = new MimeBodyPart();
     htmlBodyPart.setContent(htmlBody, "text/html");
     multipart.addBodyPart(htmlBodyPart);

     /*
      * source to read attachment content
      */
     DataSource source =
        new ByteArrayDataSource(bytes, "application/excel");
     /*
      * MimeBodyPart to hold the attachment content.
      */
     MimeBodyPart attachmentBodyPart = new MimeBodyPart();
     DataHandler handler = new DataHandler(source);
     attachmentBodyPart.setHeader("Content-Disposition",
        "attachment;filename = " + attachmentName);
     attachmentBodyPart.setDataHandler(handler);
     attachmentBodyPart.setFileName(attachmentName);
     multipart.addBodyPart(attachmentBodyPart);

     message.setContent(multipart);
     /*
      * following line to send email, if it fails, corresponding catch
      * block executes, which is logged to let know user if any error
      */
    
     Transport.send(message);
    
  }
  catch (AddressException e)
  {
     /*
      * email sending failed, logging the information
      */
    
     LogWriter
        .logErrorMessage("Address Exception : " + e.getMessage());
    
  }
  catch (MessagingException e)
  {
     /*
      * email sending failed, logging the information
      */
    
     LogWriter.logErrorMessage("Messaging Exception : "
        + e.getMessage());
    
 
  }

Мы попробовали варианты ниже

  1. Мы обновили Mail.14.7.jar

  2. добавлены ниже свойства в коде props.put("mail.smtp.starttls.enable", "true"); props.put("mail.debug", "истина");

  3. удалено свойство безопасности «jdk.tls.disabledAlgorithms» в папке jre файла java.security, установленной на развернутом сервере.

  4. Изменил порт: 25 и сделал "mail.smtp.starttls.enable" = true.

  5. добавлены ниже свойства в коде props.put("mail.smtp.ssl.protocols", "TLSv1.2"); props.put("mail.smtps.ssl.protocols", "TLSv1.2");

Но тем не менее мы сталкиваемся с той же проблемой.

Не могли бы вы помочь нам предложить любое другое решение, которое решит эту проблему.

Заранее спасибо.

🤔 А знаете ли вы, что...
Java поддерживает аннотации для добавления метаинформации в код.


186
1

Ответ:

Решено

У меня была аналогичная проблема в прошлом. Как уже говорили другие, это может тонко зависеть от самых разных вещей.

Изменения, которые я внес в то время и которые сработали для меня, заключались в том, чтобы установить для свойства mail.smtps.ssl.protocols значение TLSv1.2 (как вы уже сделали), но мне также пришлось изменить версию библиотеки javax.mail:
старая версия javax.mail:mail:1.4
новая версия: com.sun.mail:javax.mail:1.6.2

[Да, теоретически это неоптимально, поскольку теперь вы используете конкретную версию реализации вместо общего API. Но с прагматической точки зрения в таких обстоятельствах, как мои и ваши, это может быть необходимо.]

Я знаю, что javax.mail API устарел и заменен более новой библиотекой, но вам почти наверняка потребуются другие изменения исходного кода при переходе на замену jakarta.mail библиотеки.