Java中如何使用InputStream实现带附件的邮件发送
问题核心原因
你遇到的附件添加失败问题主要由3个错误点导致:
MimeMessageHelper默认未开启multipart模式,本身就不支持添加附件- 在Lambda表达式中才读取
InputStream,此时Spring可能已经回收关闭了前端传入的MultipartFile对应的输入流,读取时会触发流已关闭异常 - 附件名未带
.pdf后缀,会导致邮件客户端无法正确识别PDF文件格式
修复方案
按以下步骤修改代码即可解决问题:
- 提前读取输入流为字节数组,避免Lambda延迟执行时流已被回收
- 初始化
MimeMessageHelper时开启multipart支持,指定编码避免文件名/内容乱码 - 附件名添加
.pdf后缀,适配邮件客户端的文件识别规则
修改后的业务实现代码如下:
@Override public boolean enviarCorreoAdjunto(String targetPath, InputStream inputStream) throws Exception { System.out.println("PROBANDO INGRESO COREO"); // 提前读取字节数组,避免Lambda执行时流已关闭 byte[] fileBytes = IOUtils.toByteArray(inputStream); final MimeMessagePreparator messagePreparator = mimeMessage -> { // 第二个参数true开启multipart模式,支持添加附件,指定UTF-8避免乱码 final MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); messageHelper.setFrom("automatizacion@gmail.com"); messageHelper.setTo("hportillap@gmail.com"); messageHelper.setSubject("REPORTE DE PLAN DE CUMPLIMIENTO"); messageHelper.setText("PRUEBA", true); // 附件名加.pdf后缀,方便客户端识别格式 messageHelper.addAttachment("reporte_cumplimiento.pdf", new ByteArrayResource(fileBytes)); }; try { javaMailSender.send(messagePreparator); } catch (final MailException e) { e.printStackTrace(); // 出错时返回false,不要统一返回true return false; } return true; }
额外优化提示
Controller层中定义的String result变量没有赋值就存入了ResponseMetadata,建议根据实际业务逻辑补充赋值,避免接口返回空数据。
内容的提问来源于stack exchange,提问作者Henrry José Portilla Paredes
相关产品推荐
相关产品推荐

