使用 Javamail 向现有邮件添加附件 API

Add attachment to existing message using Javamail API

我正在使用 javamail API 连接到 IMAP 服务器,我尝试向现有邮件添加附件。

我找到了以下两个线程,但它并没有完全帮助:

Adding attachment to existing MimeMessage
Add attachments to existing eml file

我正在尝试完成同样的事情,但不知何故我遗漏了一些东西,因为最后附件被添加到邮件中,但电子邮件内容的格式变为纯文本,我看到了所有内容混合在一起作为纯文本,有什么问题吗?

邮件是直接从 IMAP 连接读取的,而不是从 .eml 文件读取的,它可能已经有其他附件 and/or text/html 内容。

代码:

MimeMessage newmsg = new MimeMessage((MimeMessage) message);

newmsg.setSubject(new_subj);
newmsg.setFlag(Flags.Flag.SEEN, false);

MimeBodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.attachFile("test.txt");

Multipart multipart = (Multipart)message.getContent();
multipart.addBodyPart(messageBodyPart);
newmsg.setContent(multipart);

newmsg.saveChanges();

Folder folder_dest = folder.getFolder("test");
folder_dest.appendMessages(new Message[]{newmsg});

您可能想要更改

Multipart multipart = (Multipart)message.getContent();

Multipart multipart = (Multipart)newmsg.getContent();

但我尝试了两种方法,它对我有用。当然,这取决于原始消息是 multipart/mixed 消息。

以下是我对 msgshow.java sample program 所做的更改以对其进行测试:

diff -r 381478f33ec5 demo/src/main/java/msgshow.java
--- a/demo/src/main/java/msgshow.java   Wed Jan 27 17:03:33 2016 -0800
+++ b/demo/src/main/java/msgshow.java   Mon Apr 11 11:39:36 2016 -0700
@@ -221,7 +221,16 @@

                    try {
                        m = folder.getMessage(msgnum);
-                       dumpPart(m);
+                       MimeMessage n = new MimeMessage((MimeMessage)m);
+                       n.setSubject("new subject");
+                       n.setFlag(Flags.Flag.SEEN, false);
+                       MimeBodyPart mbp = new MimeBodyPart();
+                       mbp.attachFile("test.txt");
+                       Multipart mp = (Multipart)n.getContent();
+                       mp.addBodyPart(mbp);
+                       n.setContent(mp);
+                       n.saveChanges();
+                       dumpPart(n);
                    } catch (IndexOutOfBoundsException iex) {
                        System.out.println("Message number out of range");
                    }

你能通过这些更改重现问题吗?