我的回答發表我的解決方案的代碼:
// 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(包裝器)。這將會「自動」生成新的內容類型值。
有關信息,我們確實使用了一個MimeMessageWrapper,它只是一個包裝類,可以使消息ID保持不變(或不)到副本。一個可能的實施是在Apache James項目上。
另外重要的一點,終於在該解決方案中,底層部分被改變,但邊界被改編以及(這是不是說EncryptedXXXX了),這是更清潔了我們的情況。
是的,我解密一個加密的消息,我想改變原來的contentType。我發現我可以用一個新的MultiPart對象來設置一個MimeMessage副本,該對象包含源的解密MimeParts。我不介意邊界被「重新生成」(事實上,即使沒有「加密」前綴也會更好,因爲附件在新對象中被解密。 – 2012-02-01 09:50:51
使用JavaMail類進行編輯(與「create 「)過去有一條消息已經證明存在問題,多年來我爲JavaMail做了許多修復,以使其更好地發揮作用,如果它適用於您的用例,那麼很好,但仍可能存在處理不好的情況無論如何,在這種情況下,您應該創建一個新的MimeMultipart對象並使用解密的內容填充它,而不是僅替換原始MimeMultipart對象中的正文部分。 – 2012-02-01 19:53:04