JavaMail SEARCH возвращает BADCHARSET - PullRequest
0 голосов
/ 11 января 2019

Я разработал почтовый клиент на работе, используя JavaMail. Некоторые клиенты сообщают о значительных задержках при поиске предметов с неанглийскими символами (например, «Kühlgut»).

Оказалось, что некоторые почтовые провайдеры (в данном случае Office 365) не поддерживают поиск по кодировке UTF-8 (что приводит к исключению BadCommandException). Поэтому JavaMail извлекает и выполняет поиск локально (как запасной вариант).

Такое поведение вызвало огромные задержки.

Код:

String searchTerm = "Kühlgut";
SearchTerm[] searchTerms = new SearchTerm[3];
searchTerms[0] = new FromStringTerm(searchTerm);
searchTerms[1] = new SubjectTerm(searchTerm);
searchTerms[2] = new BodyTerm(searchTerm);

OrTerm orTerm = new OrTerm(searchTerms);
folder.search(orTerm);

Отладочный вывод JavaMail команды поиска:

C18 SEARCH CHARSET UTF-8 OR OR FROM {8+}
Kühlgut SUBJECT {8+}
Kühlgut BODY {8+}
Kühlgut ALL
C18 NO [BADCHARSET (US-ASCII)] The specified charset is not supported.
C19 SEARCH CHARSET Cp1252 OR OR FROM {7+}
Kühlgut SUBJECT {7+}
Kühlgut BODY {7+}
Kühlgut ALL
C19 NO [BADCHARSET (US-ASCII)] The specified charset is not supported.

B20 FETCH 1 (ENVELOPE INTERNALDATE RFC822.SIZE)
* 1 FETCH (ENVELOPE ....)
B20 OK FETCH completed.
B21 FETCH 1 (BODYSTRUCTURE)
* 1 FETCH (BODYSTRUCTURE ...
B21 OK FETCH completed.

У меня есть два вопроса:

  1. Можно ли проверить, поддерживает ли сервер IMAP поиск по кодировке UTF-8 (например, через возможности)?
  2. Как я могу запретить JavaMail извлекать все электронные письма, если первое невозможно (исключение не выдается)?

1 Ответ

0 голосов
/ 11 января 2019

Не думаю, что есть способ сделать # 1, но для # 2 попробуйте установить для свойства mail.imap.throwsearchexception значение true.

И отправьте сообщение об ошибке в Microsoft, поскольку Office 365 действительно должен поддерживать поиск с использованием utf-8.

...