2012-11-30 177 views
1

好的,我不得不改变他发送的另一个开发者的一些旧代码,用它从我们的应用程序用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的新手,所以只需复制建议的代码,但这与我们现有的代码不兼容!

任何想法如何改变上面,使其完全电子邮件客户端独立?

回答

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); 
      } 
+0

雅,你的消息的原始结构都搞砸了。您需要的是包含两部分的新外部多部分/混合部分 - 原始多部分/替代部分以及新的pdf附件部分。 –

相关问题