You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:07:18