Apache James — отсутствует информация о кодировке в сообщении

#apache #email #jakarta-mail #james

#apache #Адрес электронной почты #джакарта-почта #джеймс

Вопрос:

Я создаю сообщение электронной почты с помощью Apache James. Я добавляю текстовое тело в сообщение с текстовым / 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. Вы не устанавливаете кодировку в новом теле на кодировку BodyPart.

2. Привет, кодировка отправлена заводскому методу: new StorageBodyFactory().textBody (new ByteArrayInputStream (msgBytes), charset); И нет установщика для кодировки. Я обновил код с отсутствующей строкой назначения строки кодировки.

3. очень интересно, я не знал, что вы можете создавать подобные сообщения.

Ответ №1:

Итак, после нескольких часов попыток всех возможностей, я предполагаю, что это может быть ошибка в James. Но я нашел какой-то обходной путь.

Хотя используется заводской метод с указанной кодировкой:

 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);
  

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