Я пытаюсь использовать 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) решило проблему порта в порте отладки, но возникает та же ошибка аутентификации клиента.
Привет @Lothar. Свойство уже установлено, в том числе с «mail.smtp.auth» как «true».
Вы также установили mail.smtp.port
на 587
, в то время как журнал отладки показывает, что соединение произошло с портом 25
.
@ Лотар, это еще одна странная вещь, как упоминалось в моем посте. Кажется, он пытается использовать экземпляр по умолчанию вместо нового экземпляра, как указано в методе Session.getInstance.
@Lothar, проблема с портом была в том, что порт должен быть строкой. однако даже с портом 587 возникает та же ошибка
Просто чтобы быть на «полной» стороне, установите свойства mail.transport.protocol
на smtp
и свойство mail.smtp.socketFactory.class
на javax.net.ssl.SSLSocketFactory
. О, и на будущее ;-) используйте setProperty
вместо put
.
@Lothar Я переключился на setProperty :) добавление свойства socketFactory вызывает следующее исключение: отправка не удалась; вложенное исключение: класс javax.mail.MessagingException: не удалось подключиться к узлу SMTP: smtp.office365.com, порт: 587
JavaMail 1.3 — 17 лет! Где вы его нашли? Переключиться на текущий выпуск и потом исправить все эти распространенные ошибки JavaMail.
Я обновил все библиотеки проекта до последней версии, включая JavaMail, и теперь он работает как часы. Спасибо!
Office365 не разрешает проверку подлинности при подключении, не защищенном TLS. Вы должны переключиться на TLS при использовании простого соединения. Вы можете сделать это, установив для свойства сеанса
mail.smtp.starttls.enable
значениеtrue