2014-10-13 7 views
0

자바 메일 MimeMessage를 사용하여 MIME 본문 부분을 구문 분석하는 방법, IMOD 서버에서 BODY 부분 만 가져옵니다.자바 메일 MimeMessage를 사용하여 MIME 본문을 파싱하십시오.

명령 BODY 부분 만 가져 오는 데 사용되었습니다.

A001 UID FETCH 1 (UID FLAGS BODY.PEEK[1]) 

이렇게하면 머리글과 첨부 파일은 없지만 인라인 이미지가 포함 된 원시 MIME 메시지를 가져옵니다.

자바 MIME 메시지를 사용하여 가져온 콘텐츠를 구문 분석 할 때 잘못된 결과가 표시됩니다.

예를 들어

: 원시 MIME는 인라인 이미지를 인라인 이미지 데이터

원시 MIME와 part.getInputStream() 반환 내용이 포함 된 경우 :

------=_Part_385483_1716430164.1405422119116 
Content-Type: text/plain; charset="UTF-8" 
Content-Transfer-Encoding: 7bit 
Test mail 

------=_Part_385483_1716430164.1405422119116 
    Content-Type: multipart/related; 
    boundary="----=_Part_385484_590068567.1405422119140" 

------=_Part_385484_590068567.1405422119140 
Content-Type: text/html; charset="UTF-8" 
Content-Transfer-Encoding: 7bit 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta content="text/html;charset=UTF-8" http-equiv="Content-Type"></head><body ><div style='font-size:10pt;font-family:Verdana,Arial,Helvetica,sans-serif;'>Test mail<br><img src="cid:inline_img" style="height: 1200px; width: 1600px;"></body></html> 
------=_Part_385484_590068567.1405422119140 
Content-Type: image/jpeg; name=1405422097638.jpeg 
Content-Transfer-Encoding: base64 
Content-Disposition: inline; filename=1405422097638.jpeg 
Content-ID: <inline_img> 

/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAPAAA/+4ADkFkb2JlAGTAAAAAAf/b 
AIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoKDBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxsc 
Hx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f 
Hx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgEsAZAAwERAAIRAQMRAf/EAMUAAQADAQEBAQEBAAAAAAAA 
..... 
------=_Part_385484_590068567.1405422119140-- 
------=_Part_385483_1716430164.1405422119116-- 

결과 :

Test mail 

------=_Part_385483_1716430164.1405422119116 
    Content-Type: multipart/related; 
    boundary="----=_Part_385484_590068567.1405422119140" 

------=_Part_385484_590068567.1405422119140 
Content-Type: text/html; charset="UTF-8" 
Content-Transfer-Encoding: 7bit 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta content="text/html;charset=UTF-8" http-equiv="Content-Type"></head><body ><div style='font-size:10pt;font-family:Verdana,Arial,Helvetica,sans-serif;'>Test mail<br><img src="cid:inline_img" style="height: 1200px; width: 1600px;"></body></html> 
------=_Part_385484_590068567.1405422119140 
Content-Type: image/jpeg; name=1405422097638.jpeg 
Content-Transfer-Encoding: base64 
Content-Disposition: inline; filename=1405422097638.jpeg 
Content-ID: <inline_img> 

/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAPAAA/+4ADkFkb2JlAGTAAAAAAf/b 
AIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoKDBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxsc 
Hx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f 
Hx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgEsAZAAwERAAIRAQMRAf/EAMUAAQADAQEBAQEBAAAAAAAA 
..... 
------=_Part_385484_590068567.1405422119140-- 
------=_Part_385483_1716430164.1405422119116-- 

어느 한 방법을 제안 할 수 Java MimeMessage를 사용하여 본문을 파싱합니다.

감사합니다.

답변

1

.TEXT 부분 (즉 부품의 콘텐츠) 만 가져오고 있지만 .MIME과 .TEXT를 결합해야 구문 분석 할 수 있습니다.

나는 (비록, C#으로 작성) 내 자신의 IMAP 라이브러리에서이 작업을 수행하는 방법 당신은 ImapFolder.cs의 GetBodyPart 방법으로 볼 수 있습니다

https://github.com/jstedfast/MailKit/blob/master/MailKit/Net/Imap/ImapFolder.cs#L3729

효과적으로 내가 < 파트 사양 >를 요청합니다. MIME 및 < part-spec > .TEXT를 만든 다음 일련의 스트림을 가져 와서 하나의 순차 스트림 인 것처럼 사용자 지정 ChainedStream 클래스에서 함께 연결합니다.

+0

나는 fetch 명령'A001 UID FETCH 1 (UID FLAGS BODY.PEEK [1.MIME] BODY.PEEK [1])'에 MIME 부분을 포함시켰다. 이제 파싱이 제대로되었습니다. 감사. – john

0

JavaMail에 내장 된 IMAP 프로토콜 지원을 사용하는 대신 IMAP 프로토콜을 직접 구현합니까? 그렇다면 IMAP 프로토콜 스펙을 읽는 데 더 많은 시간을 할애해야합니다!

전체 메시지 내용을 얻으려면 id-BODY.PEEK [] 섹션을 생략하십시오.

+0

예, JavaMail API를 사용하지 않고 IMAP을 구현하고 있습니다. sectionId와 함께 BODY.PEEK를 사용하고 있는데 첨부 파일없이 메일을 가져 오는 것입니다. 첨부 파일은 메일을 보는 데 필요하지 않습니다. 그래서 나는 그것을 더 나은 수행을 위해 배제하고 있습니다. – john

+0

IMAP에서 JavaMail을 사용하는 방법을 알 수없는 무언가가 있습니까? 섹션 ID를 포함하면 전체 메시지가 아닌 메시지의 일부만을 얻게되므로 MimeMessage 클래스를 사용하여 구문 분석 할 수 없습니다. JavaMail IMAP 공급자의 소스 코드에서이 사례를 처리하는 방법을 살펴볼 수 있습니다. –