Я разработал почтовый клиент на работе, используя 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.
У меня есть два вопроса:
- Можно ли проверить, поддерживает ли сервер IMAP поиск по кодировке UTF-8 (например, через возможности)?
- Как я могу запретить JavaMail извлекать все электронные письма, если первое невозможно (исключение не выдается)?