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

Java中如何使用InputStream实现带附件的邮件发送

问题核心原因

你遇到的附件添加失败问题主要由3个错误点导致:

  1. MimeMessageHelper默认未开启multipart模式,本身就不支持添加附件
  2. 在Lambda表达式中才读取InputStream,此时Spring可能已经回收关闭了前端传入的MultipartFile对应的输入流,读取时会触发流已关闭异常
  3. 附件名未带.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:45:03