Java 在不更改基础部分的情况下更改多部分/XXX内容类型

Java 在不更改基础部分的情况下更改多部分/XXX内容类型,java,jakarta-mail,content-type,multipart,mime-message,Java,Jakarta Mail,Content Type,Multipart,Mime Message,我有一个MimeMessage的实例,它包含加密的部分 原始内容类型为“多部分/加密;协议=“应用程序/pgp加密”;边界=“加密边界123123456544” 解密每个部分后,我希望多部分头更改为: "multipart/mixed; boundary="EncryptedBoundary12312345654654" 边界数显然是动态的,那么我就不能 mime.setHeader("Content-Type", "multipart/mixed;" ); 你对这种情况下的最佳实践有什么想

我有一个MimeMessage的实例,它包含加密的部分

原始内容类型为“多部分/加密;协议=“应用程序/pgp加密”;边界=“加密边界123123456544”

解密每个部分后,我希望多部分头更改为:

"multipart/mixed; boundary="EncryptedBoundary12312345654654"
边界数显然是动态的,那么我就不能

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

你对这种情况下的最佳实践有什么想法吗?

我不明白你说的“希望更改多部分标题”是什么意思。 你是想“就地”解密消息吗?那可能不太管用

您可以使用原始邮件的解密内容创建新邮件。 如果“边界”值保持不变对你来说很重要, 您可能需要将MimeMultipart子类化,并使用ContentType类
构造新的内容类型值。

我回答发布解决方案的代码:

// 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();
//源是加密的mimessage
//MimeMessageWrapper是一个可以复制消息但保持消息ID不变的包装器
布尔值keepMessageId=true;
mimessagewrapper newMime=新的mimessagewrapper(源代码,keepMessageId);
MimMultipart mmp=新的MimMultipart(“混合”);
List parts=MimeMultipartUtils.findpartsbymetitype(mime,“*”);
用于(MimePart零件:零件){
//做一些零件加工
//解密并验证单个部件
//处理结束
ContentType=新的ContentType(part.getContentType());
字符串编码=part.getEncoding();
字符串名称=type.getParameter(“名称”);
setContent(新字符串(decPart.toByteArray()),type.toString());
//将部件添加到全新的MiMemMultiPart
mmp.addBodyPart((BodyPart)部分);
}
//使用新修改的内容(解密的部分)设置原始复制邮件
mime.setContent(mmp);
mime.saveChanges();
事实上,似乎没有其他方法可以改变原始消息,但创建一个副本对我来说已经足够了。重要的一点是创建一个新的MimeMultipart对象,该对象将包含解密的部分,然后作为内容提供给MimeMessage(包装器)。这将“自动”生成新的内容类型值

作为参考,我们确实使用了一个mimessagewrapper,它只是一个包装类,能够保持副本的消息ID不变(或不不变)


另一个重要的问题是,最终在该解决方案中,基础部分已更改,但边界也已调整(不再称为EncryptedXXXX)这对我们的情况来说更干净。

是的,我正在解密一条加密消息,我想更改原始的contentType。我发现我可以用一个新的多部分对象设置MIMessage副本,该对象包含源的解密MimeParts。我不介意“重新生成”边界(事实上,最好不要使用“加密”前缀,因为附件在新对象中被解密一条消息在过去被证明是有问题的。多年来,我对JavaMail进行了许多修复,以使其更好地工作。如果它适用于您的用例,很好,但可能仍有一些情况没有得到很好的处理。无论如何,在这种情况下,您应该创建一个新的MiMemMultipart对象并用解密的内容填充它,而不仅仅是r在原始MimeMultipart对象中替换身体部位。