#java #jakarta-mail #lotus-domino #mime #ibm-domino
#java #джакарта-почта #lotus-domino #mime #ibm-domino
Вопрос:
У меня есть программа Java 1.8, запущенная на сервере Domino 10.0.1, которая считывает MIME-сообщения POP3 / IMAP и создает из них почтовый документ Notes MIME.
Все работает нормально, за исключением того, что некоторые (очень немногие) сообщения не преобразуют закодированные заголовки MIME. Затем они отображаются в клиенте Notes в этом уродливом формате.
From: =?utf-8?Q?Test=20Subject?= <anyname@acme.com>
Я установил «UTF-8» во всех возможных местах и отключил преобразование MIME в форматированный текст.
properties.setProperty("mail.mime.charset", "UTF-8");
...
boolean savedConversionFlag = dbGetSession().isConvertMime();
dbGetSession().setConvertMime(false);
Что может быть причиной этого?
Комментарии:
1. Похоже, что значение заголовка включает в себя закодированное слово, как описано в RFC2047 (например,
From: =?US-ASCII?Q?Keith_Moore?= <moore@cs.utk.edu>
). Вы определили, было ли значение таким же в исходном сообщении MIME? Кстати, вот RFC2047: ietf.org/rfc/rfc2047.txt2. Что показывает вывод отладки JavaMail при доступе к подобному сообщению?
3. Какую версию JavaMail вы используете?
4. Это JavaMail, который устанавливается с продуктом IBM Domino 10.0.1:
Manifest-Version: 1.0 Implementation-Version: 1.4 Specification-Title: JavaMail(TM) API Design Specification Specification-Version: 1.3 Implementation-Title: javax.mail Extension-Name: javax.mail Created-By: 1.5.0 (Sun Microsystems Inc.) Implementation-Vendor-Id: com.sun Implementation-Vendor: Sun Microsystems, Inc. Specification-Vendor: Sun Microsystems, Inc. SCCS-ID: @(#)javamail.mf 1.6 05/12/09
Ответ №1:
Я только что провел эксперимент. Я отправил электронное письмо с китайскими иероглифами в теме из своей учетной записи Gmail на мой почтовый ящик Notes. Domino сохранил тему в виде текстового элемента в формате, подобном этому:
Subject: =?UTF-8?B?5oiR6IO95ZCe5LiL546755KD6ICM5LiN5Lyk6Lqr5L2T44CC?=
Когда я просматриваю сообщение в Notes, оно правильно отображает китайские символы.
Основываясь на моем эксперименте и ваших комментариях, я думаю, что вы сохраняете закодированную строку в элементе обычного текста, а не в тексте RFC822. Разница небольшая, но вы можете убедиться в этом, просмотрев свойства документа в Notes. Если вы сохраняете значение в обычном текстовом элементе, Notes не знает, что оно должно его декодировать.
Итак, я думаю, у вас есть два варианта, чтобы заставить это работать в Notes:
-
Сохраните элемент в виде обычного текста, как вы делаете в данный момент, но сначала декодируйте строку. Я предполагаю, что JavaMail может помочь с этапом декодирования.
-
Оставьте значение в кодировке, но сохраните его как текстовый элемент RFC822. Это то, что делает маршрутизатор Domino.
Поскольку я не уверен на 100%, как выполнить # 2 с классами Java Notes, я бы, вероятно, начал с первого варианта.
Комментарии:
1. Спасибо, Дэйв! Вы указали мне на правильное решение. В моей программе MIMEEntry всего тела Domino создается путем чтения потока MIME из сообщения Java Mail API message.writeTo(). Проблема заключалась в том, как я извлек полный адрес отправителя, например, «Джон Смит» <jsmith@acme.com >
mailSenderAddressLong = mailFrom[0].toString()
После изменения кода наmailSenderAddressLong = mailFrom[0].toUnicodeString();
все работает нормально. Большое вам спасибо за вашу помощь!