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

Posted

技术标签:

【中文标题】Java Mail - 电子邮件客户端中未显示附件?【英文标题】:Java Mail - Attachments not showing in email clients? 【发布时间】:2012-11-18 17:30:29 【问题描述】:

好的,所以我不得不更改其他开发人员发送的一些旧代码,这些代码是为了从我们的应用程序使用 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("mixed");'要“相关”而不是“混合”,则完全相反。 GMail 完美接收,但 Outlook 只收到邮件和回形针,没有实际附件。

显然,我们需要在不知道他们用来打开邮件的电子邮件客户端的情况下向我们的客户发送电子邮件!显然,我是 Java Mail 的新手,所以只是简单地复制了建议的代码,但这与我们现有的代码不太吻合!

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

【问题讨论】:

【参考方案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);
            

【讨论】:

是的,你的消息的原始结构都搞砸了。您需要的是一个新的外部多部分/混合部分,其中包含两个部分 - 原始多部分/替代部分和新的 pdf 附件部分。

以上是关于Java Mail - 电子邮件客户端中未显示附件?的主要内容,如果未能解决你的问题,请参考以下文章

java发送邮件失败!

Java Mail 发送带有附件的邮件

java发带图片正文和附件的邮件mail

Java mail发送邮件附件出现.eml文件夹

java Mail 发送外部邮件失败,求解,

java Mail 发送外部邮件失败,求解,