Apache James - в сообщении отсутствует информация о кодировке
Я создаю сообщение электронной почты, используя Apache James. Я добавляю TextBody к сообщению с содержимым text/html:
for (int i = 0, bodyPartsSize = bodyParts.size(); i < bodyPartsSize; i++) {
BodyPart bodyPart = (BodyPart) bodyParts.get(i);
if ("text/html".equalsIgnoreCase(bodyPart.getMimeType()) {
TextBody originalBody = (TextBody) bodyPart.getBody();
byte[] bytes = IOUtils.toByteArray(originalBody.getInputStream());
byte[] msgBytes = convert(bytes);
String charset = bodyPart.getCharset();
TextBody newBody = new StorageBodyFactory().textBody(new ByteArrayInputStream(msgBytes), charset);
BodyPart bp = new BodyPart();
bp.setBody(newBody, bodyPart.getMimeType());
mp.replaceBodyPart(bp, i);
}
}
к сожалению, при отправке сообщения информация о кодировке отсутствует в выводе:
Исходное сообщение имеет:
--Apple-Mail-7-654436364
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
charset=iso-8859-2
конвертирована:
--Apple-Mail-7-654436364
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
Я не могу выяснить, почему он не добавляет информацию о кодировке. Кодирование является основным, но в почтовом клиенте вы должны выбрать его вручную в каком-то клиенте.
Любая помощь?
Заранее спасибо!
Konrad
1 ответ
Решение
Итак, после нескольких часов попыток всех возможностей, я думаю, что это может быть ошибкой в Джеймсе. Но я нашел обходной путь.
Хотя используется фабричный метод с указанным набором символов:
TextBody newBody = new StorageBodyFactory().textBody(new ByteArrayInputStream(msgBytes), charset);
BodyPart bp = new BodyPart();
bp.setBody(newBody, bodyPart.getMimeType());
mp.replaceBodyPart(bp, i);
кодировка отсутствует в последнем сообщении.
Когда я перезаписываю заголовок вручную:
TextBody newBody = new StorageBodyFactory().textBody(new ByteArrayInputStream(msgBytes), charset);
BodyPart bp = new BodyPart();
bp.setBody(newBody, bodyPart.getMimeType());
bp.getHeader().setField(ContentTypeFieldImpl.PARSER.parse(new RawField(FieldName.CONTENT_TYPE, "text/html; charset=" + charset), new DecodeMonitor()));
mp.replaceBodyPart(bp, i);
Чарсет отсутствует.