我正在尝试发送一封包含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);
答案 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);