0

如何使用 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 解析正文。

谢谢。

4

2 回答 2

1

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

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

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

实际上,我请求 <part-spec>.MIME 和 <part-spec>.TEXT,然后将它们链接到一个自定义的 ChainedStream 类中,该类接受一个流列表并从它们中读取,就好像它们是一个单一的、顺序的流一样。

于 2014-10-13T21:11:57.437 回答
0

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

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

于 2014-10-13T22:04:12.627 回答