带边界的 MimeMultipart 消息转储

Posted

技术标签:

【中文标题】带边界的 MimeMultipart 消息转储【英文标题】:MimeMultipart message dump with boundaries 【发布时间】:2019-10-20 04:22:12 【问题描述】:

我正在尝试使用如下代码记录 MimeMultipart 消息

MimeMultipart mimeMultipart = null;
try 
    mimeMultipart = (MimeMultipart) msg.getContent();
 catch (IOException e) 
    e.printStackTrace();
 catch (MessagingException e) 
    e.printStackTrace();

ByteArrayOutputStream outStream = new ByteArrayOutputStream();

for (int i = 0; i < mimeMultipart.getCount(); i++) 
    BodyPart bodyPart = mimeMultipart.getBodyPart(i);
    String contentType = bodyPart.getContentType();
    bodyPart.writeTo(outStream);


outStream.flush();
String content = new String(outStream.toByteArray());
LOGGER.info("Raw message: \r\n" + content);

但这看起来只是 MimeMultipart 消息的内容,而不是原始消息(缺少边界和标题)。

我也试过了

msg.writeTo(outStream);
String content = outStream.toString();

但由于某种原因,它只是转储主消息标题,但没有包含多部分标题的正文部分,看起来像

Date: Fri, 31 May 2019 14:19:36 -0400 (EDT)
From: postmaster@dev.box.local
To: user@dev.box.local
Message-ID: <1293434275.167.1559326776862.JavaMail@devbox>
In-Reply-To: <984954674.27.1559326769277.JavaMail@devbox>
Subject: Re:
MIME-Version: 1.0
Content-Type: multipart/report;
  boundary="----=_Part_166_602016356.1559326776861";
  report-type=delivery-status

我做错了什么?

【问题讨论】:

【参考方案1】:

只需使用msg.writeTo(outStream);

【讨论】:

我以前做过,但由于某种原因,它只是转储主消息标题,但没有包含多部分标题的正文部分。 给我看。您使用的是什么版本的 JavaMail? JavaMail 1.4.3 我已经用原始消息转储更新了 OP 1.4.3 已经快 10 年了,尽管我认为这不是您问题的根源。不过,您可能希望升级到 1.6.3。您能否包括一个重现问题的小程序以及JavaMail debug output?谢谢。 我主要想看看你用来写出消息和调试输出的代码。可能是 Apache James IMAP 服务器没有返回正确的数据。【参考方案2】:

请看看这个https://***.com/a/34689614/578855

似乎 MimeMultiPart 可以具有本身为 MimeMultiPart 的主体部分,因此您必须递归读取内容。

【讨论】:

但我想我应该看到所有部分(标题和相关内容)当我会做msg.writeTo(outStream);

以上是关于带边界的 MimeMultipart 消息转储的主要内容,如果未能解决你的问题,请参考以下文章

为啥我收到错误消息:没有名为“email.MIMEMultipart”的模块?

使用 MimeMultipart、Java 8 发送带有多个嵌入图像的邮件

错误:阅读电子邮件内容时出现 javax.mail.internet.MimeMultipart

圆的拟合(带拉格朗日乘子)

如何在python中转储不带引号的json

如何使用python发送包含正文和附件的邮件