2

暗号化されたパーツを含むMimeMessageのインスタンスがあります。

元のコンテンツタイプは「multipart/encrypted; protocol = "application / pgp-encrypted"; border ="EncryptedBoundary12312345654654"」です。

各パートを復号化した後、マルチパートヘッダーを次のように変更します。

"multipart/mixed; boundary="EncryptedBoundary12312345654654"

境界数は明らかに動的なので、私はただ作ることはできません

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

その場合のベストプラクティスについてのアイデアはありますか?

4

2 に答える 2

2

「マルチパートヘッダーを変更したい」と言ったときの意味がわかりません。メッセージを「インプレース」で復号化しようとしていますか?それはおそらくうまくいかないでしょう。

元のメッセージの復号化された内容を使用して、新しいメッセージを作成できます。「境界」値などが同じままであることが重要な場合は、MimeMultipartをサブクラス化し、ContentTypeクラスを使用して新しいコンテンツタイプ値を作成する必要があります。

于 2012-01-31T18:26:49.950 に答える
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();

実際、元のメッセージを変更する別の方法はないようですが、コピーを作成するだけで十分でした。重要な点は、復号化されたパーツを含み、コンテンツとしてMimeMessage(Wrapper)に渡される新しいMimeMultipartオブジェクトを作成することでした。これにより、新しいコンテンツタイプの値が「自動的に」生成されます。

参考までに、MimeMessageWrapperを使用しました。これは、メッセージIDをコピーに対して変更しない(または変更しない)ことができる単なるラッパークラスです。考えられる実装の1つは、ApacheJamesプロジェクトです。

もう1つの重要な点は、最終的にそのソリューションでは、基礎となる部分が変更されましたが、境界も調整されました(EncryptedXXXXとはもう言われていません)。これは、私たちの場合はさらにクリーンです。

于 2012-03-13T21:39:27.207 に答える