MimePartBody.getDisposition() 为内联部分返回 null
Posted
技术标签:
【中文标题】MimePartBody.getDisposition() 为内联部分返回 null【英文标题】:MimePartBody.getDisposition() returning null for inline parts 【发布时间】:2017-10-05 15:40:22 【问题描述】:所以我正在尝试制作一个dragNdrop 应用程序,它采用.eml 文件并保存各种位。 附件部分没有给我任何问题,但包含的消息正文和图像是。 在我的代码中,我使用的是 javax.mail 库。 使用方法
MimeBodyPart.getDisposition()
当我打印出字符串时,它会正确返回“附件”,但对于内联部分,它会返回“null”并将图像和正文聚集在一起。 在.eml文件(用lotus notes生成)中可以清楚的看到每个部分的Content-Disposition/ID/Type/Transfer-encoding...。
谁能告诉我我错过了什么?
这是处理这个问题的循环:
for (File file: files)
System.out.println(file.getPath());
Properties props = System.getProperties();
props.put("mail.host", "smtp.dummydomain.com");
props.put("mail.transport.protocol", "smtp");
Session mailSession = Session.getDefaultInstance(props, null);
try
InputStream source = new FileInputStream(file.getPath());
MimeMessage message = new MimeMessage(mailSession, source);
Multipart multiPart = (Multipart) message.getContent();
for (int i = 0; i < multiPart.getCount(); i++)
MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(i);
System.out.println(part.getDisposition());
if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition()))
System.out.println("part " + i);
part.saveFile("C:/" + part.getFileName());
catch (MessagingException | IOException e)
e.printStackTrace();
文件对象已正确初始化,因为我取回了路径名并保存了附件。
任何帮助将不胜感激。
以下是一个稍加修改的 en .eml 文件示例。内联图像和附件缩短到只有几行,以便我可以在此处发布:
From: someone@domain.com
X-Notes-Item: Mon, 8 May 2017 10:59:55 +0200;
type=400; name=OriginalModTime
X-Notes-Item: Memo;
name=Form
X-Notes-Item: stdNotesLtr25;
name=Logo
X-Notes-Item: ;
name=dLogo
X-Notes-Item: True;
name=useApplet
X-Notes-Item: 1;
name=DefaultMailSaveOptions
X-Notes-Item: 1;
name=ExpandPersonalGroups
X-Notes-Item: ;
name=tmpImp
X-Notes-Item: ;
name=Sign
X-Notes-Item: Stack Overflow saved my life.;
flags=6; name=$Abstract
X-Notes-Item: Vertraulich;
name=ConfidentialString
X-Notes-Item: ;
name=Classification
Subject: Example email
X-KeepSent: 2C23BC4F:883C3D54-C125811A:0030D552;
type=4; name=$KeepSent
To: NJun@domain.com
X-Notes-Item: ;
flags=45; name=InetCopyTo
X-Notes-Item: 1;
name=$StorageTo
X-Mailer: IBM Notes Release 9.0.1FP7 August 18, 2016
Message-ID: <OF2C23BC4F.883C3D54-ONC125811A.0030D552-C125811A.00316E89@LocalDomain>
Sender: NJun@domain.com
Date: Mon, 8 May 2017 10:59:55 +0200
X-Notes-Item: 0;
name=Encrypt
X-Notes-Item: CN=N Jun/OU=GU/OU=AT/O=domain;
type=501; flags=44; name=$UpdatedBy
X-Notes-Item: 2C23BC4F:883C3D54-C125811A:0030D552;
type=4; name=$Orig
X-Notes-Item: ;
type=501; name=Categories
X-Notes-Item: ;
type=401; name=$Revisions
X-Notes-Item: CN=S-NOTESGU001/OU=AT/O=domain;
type=501; flags=0; name=RouteServers
X-Notes-Item: 08-May-2017 10:59:55 CEDT/08-May-2017 10:59:55 CEDT;
type=401; flags=0; name=RouteTimes
X-Notes-Item: Mon, 8 May 2017 10:59:55 +0200;
type=400; name=DeliveredDate
X-Notes-Item: 2C23BC4F:883C3D54-C125811A:0030D552;
type=4; name=$TUA
X-Notes-Item: 1;
name=$NoteHasNativeMIME
X-Notes-Item: CN=N Jun/OU=GU/OU=AT/O=domain@domain;
name=OriginalTo
X-Notes-Item: CN=N Jun/OU=GU/OU=AT/O=domain;
name=OriginalFrom
X-Notes-Item: CN=someone/O=domain;
name=OriginalPrincipal
X-MIMETrack: Serialize by notes2.exe on N Jun/GU/AT/domain(Release 9.0.1FP7|August
18, 2016) at 08.05.2017 11:40:46
MIME-Version: 1.0
Content-type: multipart/mixed;
Boundary="0__=4EBB0B89DFA353C28f9e8a93df938690918c4EBB0B89DFA353C2"
--0__=4EBB0B89DFA353C28f9e8a93df938690918c4EBB0B89DFA353C2
Content-type: multipart/related;
Boundary="1__=4EBB0B89DFA353C28f9e8a93df938690918c4EBB0B89DFA353C2"
--1__=4EBB0B89DFA353C28f9e8a93df938690918c4EBB0B89DFA353C2
Content-type: text/html; charset=US-ASCII
Content-Disposition: inline
<html><body>
<table id="memoReadTable" border="0" cellspacing="0" cellpadding="0">
<tr valign="top"><td ><img src="/icons/ecblank.gif" border="0" ></td><td ><img src="/icons/ecblank.gif" border="0" ><br>
</td><td ><img src="/icons/ecblank.gif" border="0" ><br>
</td></tr>
<tr valign="top"><td ><img src="/icons/ecblank.gif" border="0" ><br>
</td><td ><img src="/icons/ecblank.gif" border="0" ><br>
</td><td ><img src="/icons/ecblank.gif" border="0" ><br>
</td></tr>
<tr valign="top"><td ><img src="/icons/ecblank.gif" border="0" ><br>
<ul style="padding-left: 4pt"><font size="1" color="#929292" face="sans-serif">An:</font></ul>
</td><td valign="middle"><img src="/icons/ecblank.gif" border="0" ><br>
<font size="1" face="sans-serif">NJun@domain.com</font></td><td ><img src="/icons/ecblank.gif" border="0" ><br>
</td></tr>
</table>
<font size="2" face="sans-serif">Stack Overflow saved my life.</font><br>
<br>
<img src="cid:0__=4EBB0B89DFA353C28f9e8a93df93869091@local" ><br>
<i>(Siehe angehängte Datei: DT between trees.jpg)</i></body></html>
--1__=4EBB0B89DFA353C28f9e8a93df938690918c4EBB0B89DFA353C2
Content-type: image/gif;
name="02629422.gif"
Content-Disposition: inline; filename="02629422.gif"
Content-ID: <0__=4EBB0B89DFA353C28f9e8a93df93869091@local>
Content-transfer-encoding: base64
R0lGODlhBgQaAecAAP///xgQGCAYIPDw8Ojo6CggKDAoMPj48JCQkEA4QGBYYODg4NjY2PD4+Gho
aNDQ0CAQGKCgoBgQIMjIyDgwOMDAwKioqLi4uBgQKCAYKLCwsOjw+Pj46FBIUOj4+BgQMCgQGCgY
...........Shortened............
QAgMLxngkLgwYcIFO1OWQHbZObbs2bQpHligJsKPEhEuMJhaO7jw4cSLGz8+2EkYLTIC9QACaUoW
FRACGDFAgQ9S5Ny7e/8OPrz48eTLkz8wYADwh+nTrzcPP778+fTr27+PP7/+/fz7+/8PYIACDkhg
gQYeiGCCCi4SyGCDDj4IYYQSTkhhhRZeOFJAADs=
--1__=4EBB0B89DFA353C28f9e8a93df938690918c4EBB0B89DFA353C2--
--0__=4EBB0B89DFA353C28f9e8a93df938690918c4EBB0B89DFA353C2
Content-type: image/jpeg;
name="DT between trees.jpg"
Content-Disposition: attachment; filename="DT between trees.jpg"
Content-ID: <C3__=4EBB0B89DFA353C28f9e8a93df93869091@local>
Content-transfer-encoding: base64
/9j/4V/+RXhpZgAASUkqAAgAAAAMAA4BAgAgAAAA8BUAAA8BAgAYAAAAEBYAABABAgARAAAAKBYA
ABIBAwABAAAAAQAAABoBBQABAAAApBAAABsBBQABAAAArBAAACgBAwABAAAAAgAAADEBAgAgAAAA
.................Shortened...............................................
M0+RCg4q1qzknLUqyTbFOT0rK87zXOPWk11Mmf/V6rB29earngtnmvwGL1P02EtTOuJGY4FRAFQM
810dDrU1YXzATjNaFqFHJqXsS5XNaFl2jnipJmDIdtYqN2YSZ//W3pgd1Y13aPK5Jr8Op6I/SpS6
C29kUIxWtaQBW9TUVJ3MXM3rYKAPpUz4IxXI1qZt3ZCVXn1qtMUweBWdtTRH/9k=
--0__=4EBB0B89DFA353C28f9e8a93df938690918c4EBB0B89DFA353C2--
【问题讨论】:
我需要更多详细信息。您可以发布一个 example.eml 文件来显示问题吗?另外,请注意,并非所有可能的消息都是带有附件的简单多部分消息;还有许多其他可能出现的消息结构。除非您知道您正在处理的所有消息都将准确且仅使用这种格式,否则您的程序也需要处理其他情况。请参阅JavaMail msgshow.java sample program。 你好比尔。感谢你的回复。在编辑是一个例子。通常 .eml 文件应该都是相同的,因为它们将由同一个程序 (Lotus Notes) 生成。 【参考方案1】:您的示例 .eml 文件显示了嵌套在外部 multipart/mixed 内的 multipart/related。 msgshow.java sample program 表明该消息具有这种结构:
This is the message envelope
---------------------------
FROM: someone@domain.com
REPLY TO: someone@domain.com
TO: NJun@domain.com
SUBJECT: Example email
SendDate: Mon May 08 01:59:55 PDT 2017
FLAGS:
X-Mailer: IBM Notes Release 9.0.1FP7 August 18, 2016
CONTENT-TYPE: multipart/mixed;
boundary="0__=4EBB0B89DFA353C28f9e8a93df938690918c4EBB0B89DFA353C2"
This is a Multipart
---------------------------
CONTENT-TYPE: multipart/related;
boundary="1__=4EBB0B89DFA353C28f9e8a93df938690918c4EBB0B89DFA353C2"
This is a Multipart
---------------------------
CONTENT-TYPE: text/html; charset=US-ASCII
---------------------------
CONTENT-TYPE: image/gif; name=02629422.gif
FILENAME: 02629422.gif
---------------------------
CONTENT-TYPE: image/jpeg; name="DT between trees.jpg"
FILENAME: DT between trees.jpg
---------------------------
您的示例代码仅处理外部多部分/混合。外部的 multipart/mixed 还包括一个图像/jpeg 附件,您的代码应该可以找到该附件。内部的 multipart/related 包括一个 image/gif 内联组件,您的代码永远不会看到它。
我看不出您的代码在处理图像/jpeg 部分时应为 null 的任何原因。您是否使用 IMAP 访问邮件? JavaMail debug output 显示什么?
【讨论】:
哦,哇。这很有帮助。我将看一下 JavaMail 调试(我没有将其设置为 true)并让您知道我发现了什么。不过我没有使用 IMAP。 如果您只是从文件中读取消息,请查看 msgshow.java 程序。 我终于可以再次处理代码了。我无法得到消息秀。 java来工作。我不知道如何输入 :eml 文件。我尝试了别的东西。由于 Multipart 对象中的 Bodypart 之一是 Multipart,因此我想将 BodyPart 转换为 Multipart。这样我就可以遍历多部分/相关的 BodyParts。它当然行不通。在 msgshow.java 中,它似乎可以工作。我已将 JavaMail 调试设置为 true,但它没有给出任何错误。我在 multipart/related 上做了很多研究,但似乎没有人有全面的回应。以上是关于MimePartBody.getDisposition() 为内联部分返回 null的主要内容,如果未能解决你的问题,请参考以下文章