使用Java Mail MimeMessage分析MIME正文



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

命令我曾经单独获取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解析正文吗。

谢谢。

您只得到.TEXT部分(即该部分的内容),但您需要将.MIME和.TEXT组合起来,然后才能解析它。

您可以在ImapFolder.cs:的GetBodyPart方法中,在我自己的IMAP库中看到我是如何做到这一点的(不过是用C#编写的)

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

实际上,我请求<零件规格>。MIME和<零件规格>。TEXT,然后将它们链接在一个自定义的ChainedStream类中,该类获取流的列表并从中读取,就好像它们是一个单独的、连续的流一样。

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

要获取整个消息内容,请省略id-BODY.PEEK[].部分

最新更新