好的,所以我不得不改变他发送给我们使用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的新手,所以只是简单地复制了建议的代码,但这并不能很好地解决我们现有的代码!
任何想法如何改变上述内容使其完全邮件客户端独立?
答案 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);
}