java mail as pdf files as attachment

时间:2015-08-05 16:01:14

标签: java javamail

我正在尝试发送一封包含PDF作为附件的电子邮件。它包含了该文件,但其大小小于磁盘上的大小,并且在尝试打开它时,它表示该文件已损坏。

MimeBodyPart messageBodyPart = new MimeBodyPart();
        Multipart multipart = new MimeMultipart();
        messageBodyPart = new MimeBodyPart();


        try {
            messageBodyPart.attachFile(new File(filePath+"/"+fileName), "application/pdf", null);

            String message = "file attached. ";            
            messageBodyPart.setContent(message, "text/html");
            multipart.addBodyPart(messageBodyPart);
            mail.setMultiBody(multipart);

2 个答案:

答案 0 :(得分:3)

进行一些研究后,我发现了另一个关于使用pdf附件here发送邮件的主题。

他是通过流来做的,但我认为这就是你需要的。

if (arrayInputStream != null && arrayInputStream instanceof ByteArrayInputStream) {
    // create the second message part with the attachment from a OutputStrean
    MimeBodyPart attachment= new MimeBodyPart();
    ByteArrayDataSource ds = new ByteArrayDataSource(arrayInputStream, "application/pdf"); 
    attachment.setDataHandler(new DataHandler(ds));
    attachment.setFileName("Report.pdf");
    mimeMultipart.addBodyPart(attachment);
}
  

您必须编写自己的javax.activation.DataSource实现来从内存中读取附件数据,而不是使用其中一个包含的实现(从文件,URL等读取)。如果您在字节数组中有PDF报告,则可以实现一个DataSource,它返回包含在ByteArrayOutputStream中的字节数组。   source

答案 1 :(得分:3)

您需要两个 MimeBodyParts,一个用于主邮件正文,另一个用于附加文件:

    Multipart multipart = new MimeMultipart();
    MimeBodyPart messageBodyPart = new MimeBodyPart();
    String message = "file attached. ";
    messageBodyPart.setText(message, "utf-8", "html");
    multipart.addBodyPart(messageBodyPart);

    MimeBodyPart attachmentBodyPart = new MimeBodyPart();
    attachmentBodyPart.attachFile(new File(filePath+"/"+fileName), "application/pdf", null);
    multipart.addBodyPart(attachmentBodyPart);
    mail.setContent(multipart);