好的,我不得不改变他发送的另一个开发者的一些旧代码,用它从我们的应用程序用Java Mail发送电子邮件。这很长时间以来运行良好,但现在我们也需要发送PDF附件。Java邮件 - 电子邮件客户端中未显示附件?
所以基本上在下面,假设有一个对象“邮件”,其中有文本和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的新手,所以只需复制建议的代码,但这与我们现有的代码不兼容!
任何想法如何改变上面,使其完全电子邮件客户端独立?
雅,你的消息的原始结构都搞砸了。您需要的是包含两部分的新外部多部分/混合部分 - 原始多部分/替代部分以及新的pdf附件部分。 –