使用Java Mail MimeMessage解析MIME Body

时间:2014-10-13 20:51:30

标签: javamail mime mime-message

如何使用Java Mail MimeMessage解析mime正文部分,我从我的IMAP服务器单独获取BODY部分。

命令我曾经单独获取BODY部分。

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

这将获取没有标题和附件的原始MIME邮件(但包含内嵌图像)。

当我使用Java Mime Message解析获取的内容时,结果出错了。

例如:如果原始MIME包含内嵌图像part.getInputStream(),则返回带有内嵌图像数据的内容

原始MIME:

------=_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解析正文。

感谢。

2 个答案:

答案 0 :(得分:1)

您只获得.TEXT部分(即部件的内容),但您需要先将.MIME和.TEXT结合起来才能解析它。

你可以在ImapFolder.cs的GetBodyPart方法中看到我在我自己的IMAP库(用C#编写)中的表现:

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

有效地,我请求&lt; part-spec&gt; .MIME和&lt; part-spec&gt; .TEXT,然后将它们链接在一个自定义的ChainedStream类中,该类获取流的列表并从它们读取,就好像它们是单个的一样,顺序,流。

答案 1 :(得分:0)

您是否自己实施IMAP协议支持而不是使用JavaMail内置的IMAP协议支持?如果是这样,您需要花费更多时间阅读IMAP协议规范!

要获取整个邮件内容,请忽略部分ID - BODY.PEEK []。