JavaMail и Oauth2: исключение «Не удается отправить команду на SMTP-хост» / «SSLHandshakeException: нет соответствующего протокола»

Я получаю следующее исключение при попытке отправить почту с помощью JavaMail с OAuth2:

javax.mail.MessagingException: Can't send command to SMTP host (javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate))

Я уже проверил десятки сообщений stackOverFlow, и ни одно из решений не работает.

Это моя конфигурация javamail (закомментированы некоторые другие конфигурации, которые я пробовал):

...
String oauth2_access_token = <procedure to aquire a token>;

Properties props = new Properties();
props.put("mail.host",config.getString("MAILSERVER"));
props.put("mail.smtp.port", config.getString("MAILPORT"));

props.put("mail.smtp.auth", "true");
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.starttls.required", "true");
props.put("mail.smtp.ssl.protocols", "TLSv1.1 TLSv1.2 TLSv1.3");
//props.put("mail.smtp.ssl.trust", "*");


props.put("mail.smtp.auth.mechanisms", "XOAUTH2");
//props.put("mail.smtp.auth.xoauth2.disable", false);
//props.put("mail.smtp.sasl.enable", "true");
//props.put("mail.smtp.auth.login.disable","true");
//props.put("mail.smtp.auth.plain.disable","true");

props.put("mail.debug", "true");
props.put("mail.debug.auth", "true");

// Connect
javax.mail.Session mailSession = javax.mail.Session.getInstance(props);
mailSession.setDebug(true);

SMTPTransport transport = (SMTPTransport) mailSession.getTransport("smtp");
transport.connect(config.getString("MAILSERVER"), 

Integer.parseInt(config.getString("MAILPORT")), config.getString("MAILUSER"), oauth2_access_token);

Вот некоторые результаты:

[apache-tomcat-9.0.54]: DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "smtp.office365.com", port 587, isSSL false
[apache-tomcat-9.0.54]: 220 SOMEANONYMIZEDSERVERPREFIX.outlook.office365.com Microsoft ESMTP MAIL Service ready at Wed, 16 Mar 2022 10:16:37 +0000
DEBUG SMTP: connected to host "smtp.office365.com", port: 587

[apache-tomcat-9.0.54]: EHLO MY_COMPUTER_NAME
[apache-tomcat-9.0.54]: 250-SOMEANONYMIZEDSERVERPREFIX.outlook.office365.com Hello [MY_IP_ADRESS]
250-SIZE 157286400
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250 SMTPUTF8

STARTTLS
[apache-tomcat-9.0.54]: 220 2.0.0 SMTP server ready
[apache-tomcat-9.0.54]: EHLO MY_COMPUTER_NAME
[apache-tomcat-9.0.54]: ERROR 2022-03-16 11:16:39,407 [..MyProgramException..] - javax.mail.MessagingException: Can't send command to SMTP host (javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate))

Я думаю, что это связано с выдачей команды AUTH, потому что она не указана в выводе. Соединение через TLS установлено успешно, поэтому я думаю, что исключение SSLHandshake может вводить в заблуждение. Так что дает?

Может ли это быть связано с токеном? Область действия, которую я должен был использовать для приобретения токена, — «.default». "Mail.Send" не работал.

Я использую новейшую версию JavaMail 1.6.2 и AdoptOpenJdk 11.0.12.

Я также дважды проверил конфигурацию java.security. Алгоритмы TLS 1v2 и 1v3 не отключены.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я сам нашел решение. Может кому пригодится:

Насколько мне известно, приведенный выше код не был ложным. Фактическая причина заключалась в том, что я не должен был использовать получение токена с учетными данными клиента, а только с именем пользователя/паролем и идентификатором клиента.

Я не уверен, поддерживает ли это JavaMail, потому что в документации я ничего не нашел об этом. Редкие примеры этого обычно связаны с учетными данными клиента.

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

Что мне также нужно было сделать, так это использовать API Microsoft Graph не только для получения токена через «поставщика пароля/имени пользователя» (этот тип) вместо «поставщика учетных данных клиента» (связь), но и для фактического запуска команды отправки почты через API Microsoft Graph (связь).

В моем случае поставщика учетных данных клиента было недостаточно, потому что администратор не указал разрешения на отправку писем.

Таким образом, я больше не использовал JavaMail для этого и нуждался в другом провайдере получения токенов.

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