2012-01-31 6 views
2

암호화 된 파트가 포함 된 MimeMessage 인스턴스가 있습니다.기본 파트를 변경하지 않고 multipart/XXX 콘텐츠 형식을 변경합니다.

원래 콘텐츠 형식은 "다중/암호화, 프로토콜 ="입니다 응용 프로그램/PGP 암호화 "; 경계 ="EncryptedBoundary12312345654654 "

각 부품의 암호 해독 후, 나는 다중 헤더로 변경하려면 :

"multipart/mixed; boundary="EncryptedBoundary12312345654654" 

경계 번호는 분명히 동적 후, 난 그냥

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

하면 해당 CA의 모범 사례에 대한 아이디어가 있습니까 할 수 없습니다 그렇지?

답변

1

나는 내 솔루션의 코드를 게시 할 대답합니다. 중요한 점은 암호 해독 된 부분을 포함하고 MimeMessage (Wrapper)의 내용으로 제공되는 새로운 MimeMultipart 객체를 만드는 것입니다. 그러면 새 콘텐츠 형식 값이 "자동"으로 생성됩니다.

우리는 MimeMessageWrapper를 사용했습니다. MimeMessageWrapper는 메시지 ID를 사본에 변경하지 않고 보관할 수있게하는 래퍼 클래스입니다. 하나의 가능한 구현은 Apache James 프로젝트에 있습니다.

또 다른 중요한 점은 마침내 해당 솔루션에서 기본 부품이 변경되었지만 경계가 변경된 것입니다 (더 이상 EncryptedXXXX라고 말하지 않음). 이는 우리의 경우에도 더 깨끗합니다.

2

"멀티 파트 헤더를 변경하고 싶습니다."라고 말하면 무슨 뜻인지 이해할 수 없습니다. 메시지를 "제자리에"해독하려고합니까? 그것은 아마 잘 작동하지 않을 것입니다.

원본 메시지의 암호 해독 된 내용을 사용하여 새 메시지를 만들 수 있습니다. "경계"값이 동일하게 유지되는 것이 중요하다면 을 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(); 

:

+0

예, 암호화 된 메시지의 암호를 해독하고 원본 contentType을 변경하려고했습니다. 소스의 해독 된 MimePart를 포함하는 새로운 MultiPart 객체로 MimeMessage 복사본을 설정할 수 있음을 발견했습니다. 경계를 "재생성"할 필요는 없습니다. 사실 새로운 객체에서 첨부 파일을 해독 할 때 "암호화 된"접두사를 사용하지 않는 것이 좋습니다. –

+2

JavaMail 클래스를 사용하여 편집 ("create ") 과거에는 메시지가 문제가있는 것으로 판명되었습니다. JavaMail에 대한 여러 가지 수정 작업을 통해이 작업을 더 잘 수행 할 수있었습니다. 사용 사례에 따라 작동하지만 잘 처리되지 않는 경우가있을 수 있습니다 어쨌든이 경우 원래 MimeMultipart 객체의 본문 부분을 바꾸는 대신 새로운 MimeMultipart 객체를 만들어 해독 된 내용으로 채워야합니다. –