java - MimePartBody.getDisposition() 对于内联部分返回 null

标签 java jakarta-mail mime

所以我正在尝试制作一个拖放应用程序,它采用 .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" width="100%" border="0" cellspacing="0" cellpadding="0">
<tr valign="top"><td width="0%"><img width="1" height="1" src="/icons/ecblank.gif" border="0" alt=""></td><td width="100%"><img width="1" height="1" src="/icons/ecblank.gif" border="0" alt=""><br>
</td><td width="1%"><img width="53" height="1" src="/icons/ecblank.gif" border="0" alt=""><br>
</td></tr>

<tr valign="top"><td width="1%"><img width="90" height="1" src="/icons/ecblank.gif" border="0" alt=""><br>
</td><td width="100%"><img width="1" height="1" src="/icons/ecblank.gif" border="0" alt=""><br>
</td><td width="1%"><img width="53" height="1" src="/icons/ecblank.gif" border="0" alt=""><br>
</td></tr>

<tr valign="top"><td width="1%"><img width="102" height="1" src="/icons/ecblank.gif" border="0" alt=""><br>

<ul style="padding-left: 4pt"><font size="1" color="#929292" face="sans-serif">An:</font></ul>
</td><td width="100%" valign="middle"><img width="1" height="1" src="/icons/ecblank.gif" border="0" alt=""><br>
<font size="1" face="sans-serif">NJun@domain.com</font></td><td width="1%"><img width="53" height="1" src="/icons/ecblank.gif" border="0" alt=""><br>
</td></tr>
</table>
<font size="2" face="sans-serif">Stack Overflow saved my life.</font><br>
<br>
<img src="cid:0__=4EBB0B89DFA353C28f9e8a93df93869091@local" width="1030" height="282"><br>
<i>(Siehe angeh&#228;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--

最佳答案

您的示例 .eml 文件显示了嵌套在外部 multipart/mixed 内的 multipart/lated。 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
  ---------------------------

您的示例代码仅处理外部多部分/混合。外部多部分/混合还包括图像/jpeg 附件,您的代码应该找到该附件。内部 multipart/lated 包含一个 image/gif 内联组件,您的代码永远不会看到该组件。

我看不出您的代码对于图像/jpeg 部分的处置应为 null 的任何原因。您是否使用 IMAP 来访问邮件? JavaMail debug output 是什么意思?显示?

关于java - MimePartBody.getDisposition() 对于内联部分返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43834042/

相关文章:

tomcat - 如何使用无效的 ssl 证书通过 exchange 2007 SMTP 中继从 tomcat web 应用程序发送电子邮件?

Python:检查上传的文件是否为jpg

java - POSTGRES 函数执行几次后需要很长时间

Java 在填满堆空间之前崩溃

java - 跟踪电子邮件是否被客户阅读

JavaMail、IMAP、大量文件夹的性能

go - 如何检查文件是否为有效图像?

http-headers - 哪种MIME类型适合.exe文件?

java - 使用 lambda 进行代码重构 - Java 8

java - Spring Kafka - 在运行时订阅新主题