Изменение типа содержимого multipart / XXX без изменения базовых частей - PullRequest
2 голосов
/ 31 января 2012

У меня есть экземпляр MimeMessage, который содержит зашифрованные части.

Исходный тип контента "multipart / encrypted; protocol =" application / pgp-encrypted "; border =" EncryptedBoundary12312345654654 "

После расшифровки каждой части я хочу изменить составной заголовок следующим образом:

"multipart/mixed; boundary="EncryptedBoundary12312345654654"

Номер границы, очевидно, является динамическим, тогда я не могу просто сделать

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

У вас естьИдея о лучшей практике для этого случая?

Ответы [ 2 ]

2 голосов
/ 31 января 2012

Я не понимаю, что вы имеете в виду, когда говорите, что «хотите изменить составной заголовок». Вы пытаетесь расшифровать сообщение "на месте"? Это, вероятно, не будет работать хорошо.

Вы можете создать новое сообщение, используя расшифрованное содержимое исходного сообщения. Если для вас важно, чтобы такие вещи, как значение «границы», оставались неизменными, вам, вероятно, потребуется создать подкласс MimeMultipart и использовать класс ContentType для создать новое значение типа контента.

1 голос
/ 14 марта 2012

Я отвечаю, чтобы опубликовать код моего решения:

// 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, который является просто классом-оберткой, который позволяет сохранять идентификатор сообщения неизменным (или нет) для копий.Одна из возможных реализаций - проект Apache James .

Еще один важный момент: наконец, в этом решении базовые части были изменены, но граница также была адаптирована (больше не называется EncryptedXXXX), что даже чище для нашего случая.

...