JavaMail - Клиент не прошел проверку подлинности для отправки анонимной почты во время MAIL FROM

Я пытаюсь использовать JavaMail для отправки электронных писем через действующую учетную запись office365. Однако я получаю такое же исключение '530 5.7.57 SMTP; Клиент не прошел проверку подлинности для отправки анонимной почты во время MAIL FROM'. Следуя простому коду, который я использую для тестирования:

Properties props = new Properties();
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", "smtp.office365.com");
props.put("mail.smtp.port", "587");
props.put("mail.debug", "true");

Session session = Session.getInstance(props, new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(USER_NAME, USER_PASS);
    }
});

try {
    final Message message = new MimeMessage(session);
    message.setRecipient(Message.RecipientType.TO, new InternetAddress(USER_NAME));
    message.setFrom(new InternetAddress(USER_NAME));
    message.setSubject(subject);
    message.setText(messageContent);
    message.setSentDate(new Date());
    Transport.send(message);
    System.out.println("Send OK");
} catch (final MessagingException ex) {
    System.out.println(ex.getMessage());
}

После вывода отладки:

DEBUG: JavaMail version 1.3
DEBUG: java.io.FileNotFoundException: C:\Program Files\Java\jre1.8.0_171\lib\javamail.providers (The system cannot find the file specified)
DEBUG: !anyLoaded
DEBUG: not loading resource: /META-INF/javamail.providers
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]}
DEBUG: Providers Listed By Protocol: {imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: !anyLoaded
DEBUG: not loading resource: /META-INF/javamail.address.map
DEBUG: java.io.FileNotFoundException: C:\Program Files\Java\jre1.8.0_171\lib\javamail.address.map (The system cannot find the file specified)
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: SMTPTransport trying to connect to host "smtp.office365.com", port 587

DEBUG SMTP RCVD: 220 xxxxx.outlook.office365.com Microsoft ESMTP MAIL Service ready at Thu, 6 Jun 2019 07:53:32 +0000

DEBUG: SMTPTransport connected to host "smtp.office365.com", port: 587

DEBUG SMTP SENT: EHLO L3343005201
DEBUG SMTP RCVD: 250-xxxxx.outlook.office365.com Hello [92.242.173.14]
250-SIZE 157286400
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250 SMTPUTF8

DEBUG SMTP Found extension "SIZE", arg "157286400"
DEBUG SMTP Found extension "PIPELINING", arg ""
DEBUG SMTP Found extension "DSN", arg ""
DEBUG SMTP Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP Found extension "STARTTLS", arg ""
DEBUG SMTP Found extension "8BITMIME", arg ""
DEBUG SMTP Found extension "BINARYMIME", arg ""
DEBUG SMTP Found extension "CHUNKING", arg ""
DEBUG SMTP Found extension "SMTPUTF8", arg ""
DEBUG SMTP: use8bit false
DEBUG SMTP SENT: MAIL FROM:<sender@domain>
DEBUG SMTP RCVD: 530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM [xxxxx.yyyyy.outlook.com]

DEBUG SMTP SENT: QUIT
Sending failed;
  nested exception is:
    class javax.mail.MessagingException: 530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM [xxxxx.yyyyy]

Из логов кажется, что аутентификация не работает, и порт подключения идет на 25, а не на 587, как указано в свойствах.

Я попытался добавить и другие свойства, например

props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.user", USER_NAME);
props.put("mail.smtp.password", USER_PASS);
props.put("mail.smtp.from", USER_NAME);

в любой комбинации, но безрезультатно. Я также пытался использовать обновленную версию библиотеки JavaMail, но исключение такое же. Я пропустил какие-либо настройки в учетной записи почты? Или из кода?

заранее спасибо

Отредактировано: изменение порта с 587 (int) на «587» (string) решило проблему порта в порте отладки, но возникает та же ошибка аутентификации клиента.

Office365 не разрешает проверку подлинности при подключении, не защищенном TLS. Вы должны переключиться на TLS при использовании простого соединения. Вы можете сделать это, установив для свойства сеанса mail.smtp.starttls.enable значение true

Lothar 06.06.2019 10:23

Привет @Lothar. Свойство уже установлено, в том числе с «mail.smtp.auth» как «true».

Simone Ceccolini 06.06.2019 10:27

Вы также установили mail.smtp.port на 587, в то время как журнал отладки показывает, что соединение произошло с портом 25.

Lothar 06.06.2019 10:30

@ Лотар, это еще одна странная вещь, как упоминалось в моем посте. Кажется, он пытается использовать экземпляр по умолчанию вместо нового экземпляра, как указано в методе Session.getInstance.

Simone Ceccolini 06.06.2019 10:31

@Lothar, проблема с портом была в том, что порт должен быть строкой. однако даже с портом 587 возникает та же ошибка

Simone Ceccolini 06.06.2019 11:00

Просто чтобы быть на «полной» стороне, установите свойства mail.transport.protocol на smtp и свойство mail.smtp.socketFactory.class на javax.net.ssl.SSLSocketFactory. О, и на будущее ;-) используйте setProperty вместо put.

Lothar 06.06.2019 11:10

@Lothar Я переключился на setProperty :) добавление свойства socketFactory вызывает следующее исключение: отправка не удалась; вложенное исключение: класс javax.mail.MessagingException: не удалось подключиться к узлу SMTP: smtp.office365.com, порт: 587

Simone Ceccolini 06.06.2019 11:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
1 988
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

JavaMail 1.3 — 17 лет! Где вы его нашли? Переключиться на текущий выпуск и потом исправить все эти распространенные ошибки JavaMail.

Я обновил все библиотеки проекта до последней версии, включая JavaMail, и теперь он работает как часы. Спасибо!

Simone Ceccolini 07.06.2019 09:39

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