Java Mail - 附件未显示在电子邮件客户端中?

时间:2012-11-30 13:24:23

标签: java email javamail

好的,所以我不得不改变他发送给我们使用Java Mail的应用程序发送电子邮件的另一个开发人员的旧代码。这已经很好地工作了很长时间,但现在我们也需要发送pdf附件。

所以基本上在下面,假设有一个对象" mail"它有文本和html消息的getter,以及现在从文件系统加载pdf文件名并附加到邮件的getter。

我已经更改了下面标记的代码,因此如果要附加pdf,请从文件系统加载并附加。我曾尝试使用与之前代码相同的结构,但我怀疑它并非全部都需要?

            Multipart mp = new MimeMultipart("alternative");

            // Create a "text" Multipart message
            BodyPart textPart = new MimeBodyPart();
            textPart.setContent(mail.getText(), "text/plain");
            mp.addBodyPart(textPart);

            // Create a "HTML" Multipart message
            Multipart htmlContent = new MimeMultipart("related");
            BodyPart htmlPage = new MimeBodyPart();

            htmlPage.setContent(mail.getHtml(), "text/html; charset=UTF-8");
            htmlContent.addBodyPart(htmlPage);
            BodyPart htmlPart = new MimeBodyPart();
            htmlPart.setContent(htmlContent);
            mp.addBodyPart(htmlPart);

            // NEW CODE STARTS HERE
            if(StringUtils.isNotBlank(mail.getPdfAttachmentFileName())) {
                Multipart pdfContent = new MimeMultipart("mixed"); //<---- this appears to be an issue???
                BodyPart pdfPage = new MimeBodyPart();

                File file = new File(uploadDir + "/" + mail.getPdfAttachmentFileName());
                DataSource dataSource = new ByteArrayDataSource(new FileInputStream(file), "application/pdf");

                pdfPage.setDataHandler(new DataHandler(dataSource));
                pdfPage.setFileName(mail.getPdfAttachmentFileName());
                pdfContent.addBodyPart(pdfPage);


                BodyPart pdfPart = new MimeBodyPart();
                pdfPart.setContent(pdfContent);
                mp.addBodyPart(pdfPart);
            }
            // NEW CODE ENDS HERE

            mimeMessage.setContent(mp);

无论如何,上述作品,有点像。没有错误或异常,并且消息被发送。但是附件并不会出现,具体取决于您收到邮件的电子邮件客户端。

使用上面的代码,Outlook会将消息视为可读,并且附件可见且可下载。太棒了。但是在GMail中,信息仍然可读,回形针似乎表明有附件,但没有下载附件?

如果你切换`Multipart pdfContent = new MimeMultipart(&#34; mixed&#34;);&#39;成为&#34;相关&#34;而不是&#34;混合&#34;恰恰相反。 GMail完美地接收它,但Outlook只获取消息和回形针,没有实际的附件。

显然,我们需要向客户发送电子邮件,而不知道他们用来打开它们的电子邮件客户端!显然我是Java Mail的新手,所以只是简单地复制了建议的代码,但这并不能很好地解决我们现有的代码!

任何想法如何改变上述内容使其完全邮件客户端独立?

1 个答案:

答案 0 :(得分:1)

好的事实证明,Spring有一个帮助程序类来隐藏所有这些乱七八糟的东西。

我已经将以上所有代码重构为以下代码并且效果很好;

            MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            message.setTo(mail.getTo());
            message.setFrom(mail.getFrom());
            message.setSubject(mail.getSubject());
            message.setText(mail.getText(), mail.getHtml());

            if(StringUtils.isNotBlank(mail.getPdfAttachmentFileName())) {
                File file = new File(uploadDir + "/" + mail.getPdfAttachmentFileName());
                DataSource dataSource = new ByteArrayDataSource(new FileInputStream(file), "application/pdf");
                message.addAttachment(mail.getPdfAttachmentFileName(), dataSource);
            }