我有一个包含加密部件的MimeMessage实例。
原始内容类型为“multipart / encrypted; protocol =”application / pgp-encrypted“; boundary =”EncryptedBoundary12312345654654“
在解密每个部分之后,我希望multipart标题改为:
"multipart/mixed; boundary="EncryptedBoundary12312345654654"
边界数显然是动态的,那么我不能只做
mime.setHeader("Content-Type", "multipart/mixed;" );
您对该案例的最佳做法有所了解吗?
答案 0 :(得分:2)
当你说“希望改变多部分标题”时,我不明白你的意思。 您是否尝试解密“就地”消息?这可能不会很好。
您可以使用原始邮件的解密内容创建新邮件。 如果你对“边界”值这样的东西保持不变很重要, 你可能需要继承MimeMultipart并使用ContentType类 构造一个新的内容类型值。
答案 1 :(得分:1)
我回答发布我的解决方案的代码:
// source is the encrypted MimeMessage
// MimeMessageWrapper is a wrapper which can copy a messgae but keep the message ID unchanged
boolean keepMessageId = true;
MimeMessageWrapper newMime = new MimeMessageWrapper(source, keepMessageId);
MimeMultipart mmp = new MimeMultipart("mixed");
List<MimePart> parts = MimeMultipartUtils.findPartsByMimeType(mime, "*");
for (MimePart part : parts) {
// Do some part processing
// Decrypt Adn verify individual parts
// End of processing
ContentType type = new ContentType(part.getContentType());
String encoding = part.getEncoding();
String name = type.getParameter("name");
part.setContent(new String(decPart.toByteArray()), type.toString());
// Add the part to the brand new MimeMultipart
mmp.addBodyPart((BodyPart) part);
}
// Set the original copy Message with the new modified content (decrypted parts)
mime.setContent(mmp);
mime.saveChanges();
事实上,似乎没有其他方法可以改变原始邮件,但创建副本对我来说已经足够了。重要的一点是创建一个新的MimeMultipart对象,它将包含解密的部分,然后作为内容提供给MimeMessage(Wrapper)。这将“自动”生成新的内容类型值。
有关信息,我们确实使用了MimeMessageWrapper,它只是一个包装类,可以使消息ID保持不变(或不保持)。一个可能的实现是Apache James项目。
另一个重要的一点,最终在该解决方案中,底层部分已经改变,但边界也被改编(它不再是EncryptedXXXX),这对我们的情况来说更加清晰。