1

Apache James を使用して電子メール メッセージを作成しています。text/html コンテンツを含むメッセージに TextBody を追加します。

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;

文字セット情報を追加していない理由がわかりません。エンコーディングは正しいですが、電子メール クライアントでは、一部のクライアントで手動で選択する必要があります。

何か助けはありますか?

前もって感謝します!

コンラッド

4

1 に答える 1

0

したがって、すべての可能性を数時間試した結果、これは James のバグである可能性があると思います。しかし、私はいくつかの回避策を見つけました。

charset を指定して factory メソッドを使用している場合:

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

文字セットはペンセントです。

于 2011-11-06T12:31:46.867 に答える