【问题标题】:Parse MIME Body using Java Mail MimeMessage使用 Java Mail MimeMessage 解析 MIME 正文
【发布时间】:2014-12-08 12:44:05
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: jakarta-mail mime mime-message


    【解决方案1】:

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

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

    【讨论】:

    • 是的,我在不使用 JavaMail API 的情况下实现 IMAP。我正在使用带有 sectionId 的 BODY.PEEK 来获取没有附件的邮件。因为查看邮件不需要附件。所以我排除了它以获得更好的性能。
    • 您是否想用 IMAP 做一些您不知道如何用 JavaMail 做的事情?如果您包含部分 id,您只会收到部分消息,而不是整个消息,因此您不能使用 MimeMessage 类来解析它。您可能想查看 JavaMail IMAP 提供程序的源代码,以了解它如何处理这些情况。
    【解决方案2】:

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

    您可以在 ImapFolder.cs 的 GetBodyPart 方法中看到我如何在自己的 IMAP 库(不过是用 C# 编写)中执行此操作:

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

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

    【讨论】:

    • 我在我的获取命令A001 UID FETCH 1 (UID FLAGS BODY.PEEK[1.MIME] BODY.PEEK[1]) 中包含了 MIME 部分。现在它的解析正确。谢谢。
    猜你喜欢
    • 2019-03-02
    • 2019-08-17
    • 1970-01-01
    • 2018-06-25
    • 2012-02-24
    • 2012-06-19
    • 1970-01-01
    • 2019-10-21
    • 2018-09-23
    相关资源
    最近更新 更多