当前位置: 首页 > 知识库问答 >
问题:

使用Java Mail MimeMessage解析MIME正文

符功
2023-03-14

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

命令我过去常常独自去取身体的一部分。

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

这将获取不带头和附件的原始MIME消息(但包含内联图像)。

当我解析提取的内容使用JavaMime消息,我得到错误的结果。

例如:如果原始MIME包含内联图像部分。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--

任何人都可以建议如何使用MimeMessage解析Java体。

谢谢

共有2个答案

萧伟兆
2023-03-14

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

要获取完整的消息内容,请省略id-BODY部分。偷看[]。

黄扬
2023-03-14

你得到的正是你想要的。文本部分(即该部分的内容),但需要将。默剧和电影。在你能够解析它之前先发短信。

您可以在ImapFolder的GetBodyPart方法中看到我如何在自己的IMAP库(虽然是用C#编写的)中实现这一点。反恐精英:

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

实际上我要求

 类似资料:
  • 我有一个perl脚本,使用MIME::E邮件来解析从stdin收到的电子邮件,但它不适用于没有部件的电子邮件。我没有能力在电子邮件发送前修改它们。 我希望能够识别电子邮件的重要部分,不管它是超文本标记语言还是文本,并将其存储在缓冲区中以便以后处理。这些电子邮件中的许多来自自动生成的邮件列表。 有时,它们似乎只有一个“内容类型”:没有边界的标题。 其他时候,它们有多个文本/普通部分,其中一个是电子邮

  • 向你问好,彼得

  • 问题内容: 我正在从REST服务接收XML文档,该文档将使用SAX进行解析。请参见以下示例,它是从XSD生成的。 设置解析器不是问题。我的主要问题是在实际的处理,方法等,我不知道如何提取我需要的项目,并将其作为他们有些“嵌套”。 例 所述可发生一次或两次,并且可以包含任意数量的其-in了转向有关于一个连接的信息的元素。基本上,我需要与他们的所有连接的列表,和。我必须为每个元素创建一个类吗? 就我所

  • 我试图在正则表达式中组合if-else,基本上,如果字符串中存在一些模式,则捕获一个模式,如果不存在,则捕获另一个模式。 字符串是:'https://www.searchpage.com/searchcompany.aspx?companyId=41490234 因此,如果在字符串中检测到“?”,则正则表达式应捕获“?”标记之后的所有内容;如果没有,那就从头抓起。 我使用了:

  • 问题内容: 我正在寻找一种解析日志文件的解决方案。看起来像: 可以区分以下元素: 但我仍然不知道该怎么做。简单行不通。 我知道正则表达式具有一般规则,但最合适的是Java。 谢谢 问题答案: 我想出了一种根据可能的/期望的值从与各个字段匹配的块中构建正则表达式的方法。 当然,可以用rex代替rexa或rexi。

  • 问题内容: 我一直在这里和总体上搜索所有子解析器示例的分配,但似乎无法弄清楚这看似简单的事情。 我有两种var类型,其中一种具有约束,所以认为使用subparser是必经之路。例如-t允许“ A”或“ B”。如果用户通过“ A”,则进一步要求他们还指定它是“ a1”还是“ a2”。如果他们只是通过“ B”,那么什么也没有。 我可以这样做,让argparse返回给我什么类型的“ A”,或者只是“ B