如何使用Java Mail Sender发送字节数组邮件附件并解决不可读问题?
解决Java Mail Sender发送byte[]附件无法正常读取的问题
我之前在项目里也碰到过一模一样的坑!你收到的附件呈现为字节形式,主要是两个小细节没处理好,咱们一步步把代码改对:
修正后的完整代码
public void sendMailWithAttachments(EmailContent emailContent, byte[] attachment) { try { MimeMessage mimeMessage = emailSender.createMimeMessage(); // 第二个参数true开启多部分邮件支持,指定UTF-8编码避免文件名/内容乱码 MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); // 基础邮件信息配置 mimeMessageHelper.setTo(emailContent.getTo()); mimeMessageHelper.setFrom(emailContent.getFrom()); mimeMessageHelper.setCc(emailContent.getCc()); mimeMessageHelper.setSubject(emailContent.getSubject()); // 核心修复:用ByteArrayResource包装byte[],同时指定带后缀的文件名和正确ContentType InputStreamSource attachmentSource = new ByteArrayResource(attachment); // 第一个参数是带后缀的文件名,第三个参数明确文件类型,让客户端能正确解析 mimeMessageHelper.addAttachment("testattachment.pdf", attachmentSource, "application/pdf"); emailSender.send(mimeMessage); emailContent.setStatus(true); } catch (Exception e) { e.printStackTrace(); // 你之前拼写错误了,这里要注意大小写 emailContent.setStatus(false); // 建议异常时把状态设为失败 } }
关键修复点说明
- 文件名必须带后缀:原来的
"testattachment"没有后缀,邮件客户端无法识别文件类型,就会直接把字节内容裸展示出来。加上.pdf后,客户端会自动按照PDF格式解析附件。 - 明确指定ContentType:添加附件时传入
application/pdf类型,让邮件服务器和客户端都能准确识别附件格式,不会当成未知字节流处理。 - 简化API使用:
ByteArrayResource已经足够处理byte[]附件,不需要额外嵌套ByteArrayDataSource,代码更简洁易维护。 - 修复拼写错误:把
e.printstacktrace改成e.printStackTrace(),不然编译都会报错。
额外提醒
如果你的byte[]不是PDF文件,记得对应修改后缀和ContentType:比如图片用image/png,Excel用application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,要和实际文件类型匹配。
内容的提问来源于stack exchange,提问作者yacky
相关产品推荐
相关产品推荐

