我正在使用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;
我无法找出为什么它不添加字符集信息。编码是核心,但在电子邮件客户端中,您必须在某个客户端中手动选择它。
任何帮助?
提前致谢!
康拉德
答案 0 :(得分:0)
所以,经过几个小时的尝试所有可能性,我的猜测是,这可能是詹姆斯的一个错误。但我发现了一些解决方法。
虽然使用指定了charset的工厂方法:
TextBody newBody = new StorageBodyFactory().textBody(new ByteArrayInputStream(msgBytes), charset);
BodyPart bp = new BodyPart();
bp.setBody(newBody, bodyPart.getMimeType());
mp.replaceBodyPart(bp, i);
最终消息中缺少charset。
当我手动覆盖标题时:
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);
Charset很快就会出现。