添加PDF附件后邮件正文丢失的技术问题求助
问题:添加PDF附件后邮件正文丢失
发送无附件邮件时一切正常,但添加PDF附件后,Gmail快速预览能看到正文,打开邮件却看不到内容。
问题代码
Path pdfFilePath = Paths.get(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/" + PdfName + ".pdf"); //File path byte[] pdfByteArray = Files.readAllBytes(pdfFilePath ); Message message = new MimeMessage(session); message.setFrom(new InternetAddress(SenderAddress)); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(RecipientAddress)); message.setSubject(Subject); message.setFileName(PdfName + ".pdf"); //MimeBodyPart attachment = new MimeBodyPart(); //message.setContent(attachment, "application/pdf"); DataSource dataSrc = new ByteArrayDataSource(pdfByteArray, "application/pdf"); message.setDataHandler(new DataHandler(dataSrc)); message.setText(MailBodyText); Transport.send(message);
问题原因
代码直接给MimeMessage设置了PDF的DataHandler,这会将邮件内容类型强制设为application/pdf,导致邮件客户端默认优先解析附件,正文被覆盖或无法正确识别。虽然预览能提取文本内容,但正式打开时客户端会按照附件类型处理,忽略正文部分。
要同时显示正文和附件,必须使用多部分邮件结构(MimeMultipart),将正文和附件作为独立的MimeBodyPart组合到邮件中。
修正后的代码
Path pdfFilePath = Paths.get(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/" + PdfName + ".pdf"); byte[] pdfByteArray = Files.readAllBytes(pdfFilePath); Message message = new MimeMessage(session); message.setFrom(new InternetAddress(SenderAddress)); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(RecipientAddress)); message.setSubject(Subject); // 创建多部分内容容器 MimeMultipart multipart = new MimeMultipart(); // 1. 添加正文部分 MimeBodyPart textPart = new MimeBodyPart(); textPart.setText(MailBodyText); multipart.addBodyPart(textPart); // 2. 添加PDF附件部分 MimeBodyPart attachmentPart = new MimeBodyPart(); DataSource dataSrc = new ByteArrayDataSource(pdfByteArray, "application/pdf"); attachmentPart.setDataHandler(new DataHandler(dataSrc)); attachmentPart.setFileName(PdfName + ".pdf"); multipart.addBodyPart(attachmentPart); // 将多部分内容设置为邮件内容 message.setContent(multipart); Transport.send(message);
说明
MimeMultipart会自动将邮件内容类型设为multipart/mixed,确保客户端能正确识别并同时渲染正文和附件。- 正文与附件作为独立的
MimeBodyPart,避免了内容覆盖的问题,符合邮件标准格式要求。
内容的提问来源于stack exchange,提问作者brojo
相关产品推荐
相关产品推荐

