更改multipart / XXX内容类型而不更改底层部分

时间:2012-01-31 15:00:59

标签: java javamail content-type multipart mime-message

我有一个包含加密部件的MimeMessage实例。

原始内容类型为“multipart / encrypted; protocol =”application / pgp-encrypted“; boundary =”EncryptedBoundary12312345654654“

在解密每个部分之后,我希望multipart标题改为:

"multipart/mixed; boundary="EncryptedBoundary12312345654654"

边界数显然是动态的,那么我不能只做

mime.setHeader("Content-Type", "multipart/mixed;" );

您对该案例的最佳做法有所了解吗?

2 个答案:

答案 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),这对我们的情况来说更加清晰。