Я получаю следующее исключение при попытке отправить почту с помощью 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 не отключены.
Я сам нашел решение. Может кому пригодится:
Насколько мне известно, приведенный выше код не был ложным. Фактическая причина заключалась в том, что я не должен был использовать получение токена с учетными данными клиента, а только с именем пользователя/паролем и идентификатором клиента.
Я не уверен, поддерживает ли это JavaMail, потому что в документации я ничего не нашел об этом. Редкие примеры этого обычно связаны с учетными данными клиента.
Как вы можете видеть выше, команда AUTH не была запущена, потому что у меня не было разрешения сделать это, очевидно.
Что мне также нужно было сделать, так это использовать API Microsoft Graph не только для получения токена через «поставщика пароля/имени пользователя» (этот тип) вместо «поставщика учетных данных клиента» (связь), но и для фактического запуска команды отправки почты через API Microsoft Graph (связь).
В моем случае поставщика учетных данных клиента было недостаточно, потому что администратор не указал разрешения на отправку писем.
Таким образом, я больше не использовал JavaMail для этого и нуждался в другом провайдере получения токенов.