1

好的,所以我不得不更改另一个开发人员发送的一些旧代码,这些代码用于从我们的应用程序使用 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 的新手,所以只是简单地复制了建议的代码,但这与我们现有的代码并不一致!

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

4

1 回答 1

2

好的,原来 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);
            }
于 2012-11-30T16:49:21.653 回答