Логика рассылки Java: не удалось преобразовать сокет в TLS

В одном приложении я реализовал логику отправки почты с использованием Java. я использовал smtp.gmail.com над 587 port с действительным идентификатором Gmail и паролем. В среде разработки все работает нормально. Но в производственной среде мне нужно использовать другой почтовый сервер, скажем smtp.xyz.in над port 25 с действительным адресом электронной почты и паролем в этом домене.

Когда я продолжу с SSL, включите следующий код:

Я получаю ошибку

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

Когда я удаляю EnableSSL и пытаюсь добавить следующий код:

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

Достаточно погуглив за последние 3 дня, я понимаю, что мне нужно настроить доверенный сертификат, как здесь.

Но я хочу продолжить без шифрования и без ограбления, чтобы включить SSL. Есть ли способ отправки писем с помощью java-программ через наш собственный домен без включения SSL. Любая помощь будет оценена.

6 ответов

Решение

Требуется ли SSL/TLS или нет, контролируется вашим почтовым сервером. Если это требуется, вы должны использовать это.

Вы можете установить свойство mail.smtp.ssl.trust, чтобы игнорировать проблему с сертификатом, или вы можете исправить ее, как описано в FAQ по JavaMail.

Эй, отключите свой антивирус, он работает на меня.

Я отключаю только SMTP исходящий в антивирусе

Если вы используете

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

Удалите этот фрагмент, чтобы избежать настройки SSL с SMTP-сервера.

Я обнаружил, что мы также должны установить правильную версию TLS, иначе мы можем получить ту же ошибку. Приведенные ниже настройки свойств помогли решить проблему.

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

Как правило, все, что вам нужно указать, - это хост, порт SMTP-сервера и требует ли ваш SMTP-сервер аутентификации при отправке электронных писем или нет, а также необходимо ли обеспечить связь с SMTP-сервером по протоколу SSL/TLS. Вы должны правильно указать соответствующие свойства и это все.

Но указанные выше параметры определяются SMTP-сервером. Сервер решает, должен ли он принимать только защищенные соединения; и должен ли он использовать SSL или более безопасный TLS, и это будет либо один из них, либо оба. Кроме того, некоторые SMTP-серверы нуждаются в проверке подлинности отправителей при отправке электронных писем, а некоторые - нет. Итак, вам нужно проверить документацию SMTP-сервера, который вы будете использовать для правильной настройки параметров. См. Здесь рабочий пример использования Gmail для отправки электронных писем.

Эта ошибка может возникнуть, если вы используете старую библиотеку JavaMail (mail.jar или javax.mail.jar). Загрузите новейшую версию отсюда: https://javaee.github.io/javamail/

Другие вопросы по тегам