Сегодня коллега столкнулся с проблемой. При использовании JAVA MAIL для получения электронных писем, если получатель представляет собой список и список получателей разделен точками с запятой, в JAVA MAIL возникнет исключение, которое невозможно будет нормально проанализировать. посмотрите, я написал простую демку, очень простую, например:
Скопируйте код кода следующим образом:
@Тест
общественный недействительный testReceiveMail () {
пытаться {
Строка хоста = «pop3.163.com»;
Свойства pops = новые свойства();
pops.put("mail.pop3.host", хост);
pops.put("mail.pop.auth", "истина");
Сеанс session = Session.getDefaultInstance(pops, null);
Магазин store = session.getStore("pop3");
//Подключаемся к почтовому серверу
store.connect(хост, "chb_go", "3870359346");
//Получить входящие
Входящие папки = store.getDefaultFolder().getFolder("INBOX");
//Только чтение достаточно
входящие.open(Folder.READ_ONLY);
//Получаем все списки рассылки
Сообщение [] msg = inbox.getMessages();
Профиль FetchProfile = новый FetchProfile();
Profile.add(FetchProfile.Item.ENVELOPE);
inbox.fetch(сообщение, профиль);
for (int i = 0; i < msg.length; i++) {
System.out.println("========================================= = ====");
System.out.println("Тема: "+msg[i].getSubject());
InternetAddress[] toAddress = (InternetAddress[]) msg[i].getRecipients(Message.RecipientType.TO);
for(адрес InternetAddress:toAddress){
System.out.println(adress.getAddress());
}
}
//Закрываем открытый ресурс
если (входящие!= ноль)
входящие.закрыть (истина);
если (сохранить!= ноль)
магазин.закрыть();
} catch (NoSuchProviderException e) {
е.printStackTrace();
} catch (MessagingException e) {
е.printStackTrace();
} catch (Исключение е) {
е.printStackTrace();
}
}
Это очень просто. Вы можете нормально получать электронные письма и нормально отображать список получателей, но при подключении к внутреннему почтовому серверу получатели представляют собой электронные письма с точками с запятой в качестве разделителей, получатели не могут отображаться нормально;
После поиска в спецификациях я обнаружил, что FRC 822 требует разделения получателей запятыми. Кажется, разделение точкой с запятой не является стандартным разделителем, а именно:
Скопируйте код кода следующим образом:
пункт назначения = "Кому" ":" 1#адрес ;
/ "Resent-To" ":" 1#адрес
/ "cc" ":" 1#адрес вторичный;
/ "Resent-cc" ":" 1#адрес
/ "bcc" ":" #address ;
/ "Resent-bcc" ":" #address
Синтаксис # представляет список, а содержимое между списками разделяется запятыми, например:
Скопируйте код кода следующим образом:
2.7. #ПРАВИЛО: СПИСКИ
Конструкция «#» определяется, как и «*», следующим образом:
<l>#<m>элемент
указание минимум элементов <l> и максимум <m>, каждый из которых разделен одной или несколькими запятыми (","). Это упрощает использование обычного вида списков, например '(element *("," element). ))' может отображаться как "1#element". Везде, где используется эта конструкция, допускаются нулевые элементы, но они не влияют на количество присутствующих элементов. То есть "(element),,(element)" разрешено. , но считается только как два элемента. Следовательно, где. требуется хотя бы один элемент, должен присутствовать хотя бы один ненулевой элемент. Значения по умолчанию — 0 и бесконечность, чтобы «#(элемент)» допускал любое число, включая ноль. «1#элемент» требует хотя бы одного; ; и «1#2element» допускает один или два.
JAVA MAIL работает строго в соответствии со спецификациями RFC 822 и не обрабатывает точки с запятой. Большинство почтовых серверов строго следуют спецификации RFC 822, например Lotus Notes и gmail (получатель gmail не может вводить точку с запятой, и она даже будет автоматически заменена запятой, впрочем, вы также обнаружите это при отправке); Электронные письма часто разделяются точкой с запятой. Это связано с тем, что некоторые инструменты электронной почты Microsoft, такие как Outlook, Outlook. Express или его MAPI используют точку с запятой в качестве разделителя, а поскольку Outlook широко используется пользователями, многие люди даже думают, что разделение точкой с запятой является нормой, и сильно презирают Microsoft! Слишком много нарушений! !
Если вам не повезло и вы столкнулись с пользователями, которые привыкли использовать точки с запятой в качестве разделителей, а их почтовые серверы не заменяют автоматически точки с запятой на запятые, то совместимость можно сделать только через программы. Вы можете рассмотреть возможность пересмотра исходного кода JAVA MAIL Revise.
Исходный код метода синтаксического анализа класса InternetAddress здесь не показан. Вам нужно только изменить обработку точек с запятой, чтобы она была такой же, как и запятые (но точки с запятой также определены в FRC 822. Такие изменения могут вызвать скрытые опасности, поэтому. пожалуйста, будьте осторожны) .