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;

Я не могу понять, почему он не добавляет информацию о кодировке. Кодировка правильная, но в почтовом клиенте вы должны выбрать ее вручную в каком-то клиенте.

Любая помощь?

Заранее спасибо!

Конрад


person Konrad    schedule 04.11.2011    source источник
comment
Вы не устанавливаете кодировку в newBody для кодировки bodyPart.   -  person DwB    schedule 04.11.2011
comment
Привет, в фабричный метод отправлена ​​кодировка: new StorageBodyFactory().textBody(new ByteArrayInputStream(msgBytes), charset); И нет сеттера для кодировки. Я обновил код с отсутствующей строкой назначения строки кодировки.   -  person Konrad    schedule 06.11.2011
comment
очень интересно, я не знал, что вы можете создавать такие сообщения.   -  person Thufir    schedule 23.08.2012


Ответы (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);

Кодировка присутствует.

person Konrad    schedule 06.11.2011