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

Quarkus测试模式下Qute模板与Mailer内嵌图片找不到文件问题求助

Quarkus测试时邮件内联图片找不到问题解决

问题描述

图片存放于META-INF/resources/images/apoio_logo.png路径,Quarkus服务运行时可正常加载图片并发送邮件,但执行mvn test时抛出java.nio.file.NoSuchFileException,提示找不到/home/fabio/Documents/REMSoft/apoio-notificacao/images/apoio_cotacoes.png文件。

相关代码

public Uni<Void> enviarNotificacaoMQ(Email email) {
        String body = engine.getTemplate(email.getTemplate()).data("email", email).render();
        Log.info("***** preparando para enviar e-mail AWS *****");
        Mail mail = prepararEmail(email, body);
        Uni<Void> enviado = reactiveMailer.send(mail);
        Log.info("***** email enviado com sucesso *****");
        return enviado;
    }

    private Mail prepararEmail(Email email, String body) {
        Mail mail = new Mail();
        List<String> to = new ArrayList<>();
        List<String> cc = new ArrayList<>();
        to.add(email.getEmail());
        cc.add(email.getEmailCC());
        mail.setTo(to);
        Optional.of(cc).ifPresent(mail::setBcc);
        Optional.of(email.getEmailsCCO()).ifPresent(mail::setBcc);
        mail.setSubject(email.getAssunto());
        mail.setHtml(body);
        mail.addInlineAttachment("apoio_cotacoes.png",
                new File("images/apoio_cotacoes.png"),
                "image/png", "<apoio_logo>");
        return mail;
    }

邮件模板

<div style="text-align: center">
    <img src="cid:apoio_logo">
</div>

解决办法

问题核心:运行服务时Quarkus会自动映射META-INF/resources下的资源,相对路径可正常解析;但测试时当前工作目录为项目根目录,资源实际编译后存放在target/classes/META-INF/resources/images/下,直接用File读取相对路径会定位失败。

推荐以下两种解决方案:

  • 使用类加载器读取资源流(推荐)
    替换原代码中new File()的方式,通过类加载器获取资源输入流,适配所有环境:

    // 获取资源输入流
    InputStream imageStream = getClass().getClassLoader().getResourceAsStream("images/apoio_cotacoes.png");
    // 调用重载方法添加内联附件
    mail.addInlineAttachment("apoio_cotacoes.png",
            imageStream,
            "image/png", "<apoio_logo>");
    

    注:邮件客户端会自动关闭输入流,无需手动处理。

  • 指定编译后资源路径(不推荐)
    若坚持使用File类,可直接指定测试环境下的资源路径,但该方式耦合本地环境,通用性差:

    String imagePath = "target/classes/META-INF/resources/images/apoio_cotacoes.png";
    mail.addInlineAttachment("apoio_cotacoes.png",
            new File(imagePath),
            "image/png", "<apoio_logo>");
    

内容的提问来源于stack exchange,提问作者Fábio Gonçalves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:12:35