Соединение с Java и Microsoft Exchange прервано сервером?

Я использую Java Springboot для чтения входящих сообщений учетной записи Microsoft Exchange (я уже могу отправлять электронные письма программно). Когда я пытаюсь прочитать папку «Входящие», я получаю общую ошибку:

javax.mail.MessagingException: Connection dropped by server?

Логин и пароль конечно правильные.

Я использую следующую конфигурацию:

  Properties mailProps = new Properties();
  mailProps.setProperty("mail.transport.protocol","smtp");
  mailProps.setProperty("mail.smtp.auth","true");
  mailProps.setProperty("mail.smtp.starttls.enable","true");
  mailProps.setProperty("mail.debug","false");      
  mailProps.setProperty("mail.smtp.sasl.mechanisms.oauth2.oauthToken", password);
  Session session = Session.getDefaultInstance(mailProps);   
  Store store = session.getStore("imaps");      
  store.connect("outlook.office365.com", 143,  username, password); //username and password are omitted
  Folder emailFolder = store.getFolder("inbox");
  emailFolder.open(Folder.READ_ONLY);

ОБНОВИТЬ: Поскольку я могу получить входящие сообщения от клиента Thunderbird, я настроил код в соответствии с конфигурацией Thunderbird. Теперь у меня есть:

DEBUG: getProvider() returning javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle]
DEBUG IMAPS: mail.imap.fetchsize: 16384
DEBUG IMAPS: mail.imap.ignorebodystructuresize: false
DEBUG IMAPS: mail.imap.statuscachetimeout: 1000
DEBUG IMAPS: mail.imap.appendbuffersize: -1
DEBUG IMAPS: mail.imap.minidletime: 10
DEBUG IMAPS: enable STARTTLS
DEBUG IMAPS: closeFoldersOnStoreFailure
DEBUG IMAPS: trying to connect to host "outlook.office365.com", port 143, isSSL true
javax.mail.MessagingException: Unsupported or unrecognized SSL message
at it.spring.platform.services.communication.mail.MailTest.read(MailTest.java:53)

Для ясности и полноты я добавляю полный код Spring, который я написал, чтобы читать входящие:

import javax.mail.MessagingException;
import javax.mail.Store;

public class JavaMailReader
{
 private Store store;
 private String username;
 private String password;
 private String host;
 private int port;
 private String inbox;

 public JavaMailReader(Store store, String host, int port, String   username, String password, String inbox)
 { 
   this.host=host;
   this.port=port;
   this.store=store;
   this.username=username;
   this.password=password;
   this.inbox=inbox;
   this.port = port;
  }

  public void connect() throws MessagingException
  {
    store.connect(host, port, username, password);       
  }

  public Store getStore()
  {
   return store;
  }   

  public String getInboxFolderName()
  {
    return this.inbox;
  }    
}

  @Bean
public JavaMailReader emailReader(@Value("imaps") String protocol,

                                  
@Value("${mailreceiver.mail.host}")  String host,

                                  @Value("${mailreceiver.mail.port}") Integer port,

                                  @Value("${mailreceiver.mail.password}")  String password,

                                  @Value("${mailreceiver.mail.username}") String username) throws NoSuchProviderException, MessagingException

{

  Properties mailProps = new Properties();      

  mailProps.setProperty("mail.transport.protocol","imaps");

  mailProps.setProperty("mail.imaps.auth","true");      

  mailProps.setProperty("mail.debug","true");       

  mailProps.setProperty("mail.imaps.sasl.mechanisms.oauth2.oauthToken", password);      

  Session session = Session.getDefaultInstance(mailProps);   

  Store store = session.getStore(protocol);      

  return new JavaMailReader (store, host, port, username, password, "inbox");

}

 //testing
  @Test
  public void read() throws NoSuchProviderException, MessagingException

{     

  Message[] messages = mailService.getInbox(); //getInbox("Inbox")

  Message found=null;

  for(Message m: messages)

  {

    if(m.getSubject().equalsIgnoreCase(subject))

    {

        found=m;

        break;

    }

  }

  assertNotNull(found);

  mailService.closeReader();

}

ОБНОВЛЕНИЕ 2: Как и было предложено, я изменил порт на 993 и удалил starttls:

  Properties mailProps = new Properties(); 
  mailProps.setProperty("mail.transport.protocol","imaps");
  mailProps.setProperty("mail.imaps.auth","true");      
  mailProps.setProperty("mail.debug","true"); 
  maililProps.
  setProperty("mail.imaps.sasl.mechanisms.oauth2.oauthToken",  password);
  Session session = Session.getDefaultInstance(mailProps);  
  Store store = session.getStore(protocol);     
  return new JavaMailReader (store, host, port, username, password, "inbox");

Теперь у меня есть ошибка:

DEBUG IMAPS: trying to connect to host "outlook.office365.com", port 993, isSSL true
* OK The Microsoft Exchange IMAP4 service is ready. [ a string here omitted for security reason==]
A0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS ID UNSELECT CHILDREN IDLE NAMESPACE LITERAL+
A0 OK CAPABILITY completed.
DEBUG IMAPS: AUTH: PLAIN
DEBUG IMAPS: AUTH: XOAUTH2
DEBUG IMAPS: protocolConnect login, host=outlook.office365.com, 
user= the user-email-here, password=<non-null>
DEBUG IMAPS: AUTHENTICATE PLAIN command trace suppressed
DEBUG IMAPS: AUTHENTICATE PLAIN command result: A1 NO AUTHENTICATE failed.
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 3.159 s 
javax.mail.AuthenticationFailedException: AUTHENTICATE failed.

Первое, что нужно проверить — заменить smtp на smtps в строке 2.

Sam 23.11.2022 21:46

замена smtp на smtps дает тот же результат

Discipulos 25.11.2022 14:34

Какую версию Java вы используете?

Olivier 26.11.2022 09:15

Почта Javax 1.6.2, jdk-18.0.1.1

Discipulos 26.11.2022 13:22

Во-первых, последней версией JavaMail является Jakarta Mail 2.1 от 15 февраля 2022 года. Может быть идея перейти на эту версию.

tquadrat 26.11.2022 18:58

Проблема в том, что мне нужно использовать SpringBoot 2.*, и я полагаю, что для Джакарты требуется Spring Boot 3.

Discipulos 27.11.2022 10:22
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Как включить TLS в gRPC-клиенте и сервере : 2
Как включить TLS в gRPC-клиенте и сервере : 2
Здравствуйте! 🙏🏻 Надеюсь, у вас все хорошо и добро пожаловать в мой блог.
Сортировка hashmap по значениям
Сортировка hashmap по значениям
На Leetcode я решал задачу с хэшмапой и подумал, что мне нужно отсортировать хэшмапу по значениям.
Принципы SOLID - лучшие практики
Принципы SOLID - лучшие практики
SOLID - это аббревиатура, обозначающая пять ключевых принципов проектирования: принцип единой ответственности, принцип "открыто-закрыто", принцип...
gRPC на Android с использованием TLS
gRPC на Android с использованием TLS
gRPC - это относительно новая концепция взаимодействия между клиентом и сервером, но не более.
0
6
130
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваши настройки могут работать для SMTP, но вы хотите читать электронную почту, и для этого вам нужно использовать IMAP или POP3 (или Microsoft Graph, но он использует совершенно другой API).

Таким образом, вы должны предоставить другую конфигурацию:

Properties mailProps = new Properties();
mailProps.setProperty("mail.transport.protocol","imaps");
mailProps.setProperty("mail.imaps.auth","true");
mailProps.setProperty("mail.imaps.starttls.enable","true");
mailProps.setProperty("mail.debug","false");      
mailProps.setProperty("mail.imaps.sasl.mechanisms.oauth2.oauthToken", password);
Session session = Session.getDefaultInstance(mailProps);   
Store store = session.getStore("imaps");      
store.connect("outlook.office365.com", 143,  username, password); //username and password are omitted
Folder emailFolder = store.getFolder("inbox");
emailFolder.open(Folder.READ_ONLY);

Я заменил все вхождения «smtp» на «imaps», чтобы настроить протокол IMAPS (в противном случае вы бы предоставили настройки для протокола SMTP, а именно для отправки электронных писем…

Если вы хотите сделать и то, и другое за один раз, у вас должны быть обе настройки (одна с «imaps», другая с «smtp»), а когда вы хотите использовать POP3, вместо этого вы используете «pop3» (или «imap "если это не IMAPS, а IMAP).

У меня нет под рукой учетной записи Exchange, поэтому я не могу проверить точные настройки, но могу сказать, что настройки по умолчанию, которые вы использовали, точно не будут работать (вы не предоставили никаких конкретных настроек для IMAP(S), поэтому было по умолчанию…).

Далее вы должны иметь в виду, что Office365 — зверь! Вы можете повеселиться с ним, особенно при доступе к нему, чтобы получить из него свою почту. Пока вы перемещаете ту или иную почту один раз в голубую луну, все в порядке. Но когда вы начинаете с оптовых объемов, становится противно, если вы не заплатили за это особо. Хотя это влияет в основном на отправку, вы также можете получать забавные сообщения об ошибках при чтении электронных писем.

Опять же, предоставленные мной настройки покажут только то, как должны выглядеть имена свойств конфигурации, я не гарантирую, что они будут работать с заданными значениями! Возможно, вам даже придется указать дополнительные параметры конфигурации.

И «STARTTLS» не имеет смысла для протоколов *S, так как они с самого начала работают на TLS. Тем не менее, вы можете установить его; вы также можете установить «mail.imaps.clothilde» как «Она милая»… это просто будет проигнорировано.

Я попробовал вашу конфигурацию, включив и отключив outh2, та же ошибка.

Discipulos 27.11.2022 10:25

Как уже было сказано, я только что обнаружил, что имена для значений конфигурации уже были неправильными. И что я не могу проверить это сам, потому что у меня нет учетной записи Office365, которую я мог бы использовать. Установите для mail.debug значение true, запишите результат и вставьте его в свой вопрос.

tquadrat 27.11.2022 16:13

Спасибо за ваше время. Я добавил информацию об отладке (обновить раздел вопроса)

Discipulos 29.11.2022 08:58
Ответ принят как подходящий

Судя по вашим настройкам, вы пытаетесь подключиться к серверу IMAP O365 через порт 143 (порт IMAP по умолчанию) с использованием протокола SSL:

trying to connect to host "outlook.office365.com", port 143, isSSL true

Это не может работать, потому что сервер ответит текстом баннера в виде открытого текста по умолчанию (например, * OK The Microsoft Exchange IMAP4 service is ready), в то время как ваш клиент ожидает рукопожатия SSL, отсюда и ошибка Unsupported or unrecognized SSL message.

Вы должны использовать порт протокола IMAPS по умолчанию, который 993 (также задокументирован здесь). Тогда соединение будет соединением IMAPS (TLS), и ваши настройки должны работать.

Кроме того, STARTTLS не имеет значения в этом сценарии.

Спасибо. Я изменил порт на 992 и удалил starttls. Нет, у меня ошибка: DEBUG IMAPS: AUTHENTICATE PLAIN результат команды: A1 NO AUTHENTICATE failed javax.mail.AuthenticationFailedException: AUTHENTICATE failed (см. Обновление 2)

Discipulos 29.11.2022 17:09

Теперь, когда первоначальная проблема с подключением решена, вам нужно решить проблему аутентификации, которая в основном связана с правильными учетными данными. Насколько я знаю, вы не можете просто использовать пару имени пользователя и пароля для IMAP; вам нужно получить правильный токен аутентификации, как описано здесь . Этот ответ тоже связан.

Tasos P. 30.11.2022 11:38

Есть ли способ прочитать входящие без токена? (так же, как я делаю с исходящими)

Discipulos 30.11.2022 13:41

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