Spring boot 包括<;img>;在生成的HTML文档中

Spring boot 包括<;img>;在生成的HTML文档中,spring-boot,thymeleaf,Spring Boot,Thymeleaf,在我的Spring Boot应用程序中,我正在使用Thymeleaf生成HTML电子邮件。我想包括一个 我已经确认,可以通过在本地启动应用程序并请求http://localhost:8080/img/logo.svg在浏览器中 为了在HTML中包含此图像,我尝试了以下所有方法 Base64编码图像 其中每一项的结果是: 引发异常:org.thymeleaf.exceptions.TemplateProcessingException:Link base“/img/logo.svg”不能是上

在我的Spring Boot应用程序中,我正在使用Thymeleaf生成HTML电子邮件。我想包括一个

我已经确认,可以通过在本地启动应用程序并请求
http://localhost:8080/img/logo.svg
在浏览器中

为了在HTML中包含此图像,我尝试了以下所有方法

  • Base64编码图像
  • 其中每一项的结果是:

  • 引发异常:org.thymeleaf.exceptions.TemplateProcessingException:Link base“/img/logo.svg”不能是上下文相关(/…),除非用于执行引擎的上下文实现org.thymeleaf.context.IWebContext接口
  • 呈现电子邮件中显示为损坏图像的
  • 呈现电子邮件中显示为损坏图像的
  • 我测试过的大多数电子邮件客户端都会呈现该图像,但它被GMail阻止,无法通过设置解除阻止
  • 我想,为了在电子邮件中正确呈现图像,我需要提供一个绝对URL,但我不确定如何实现这一点

    问题的一部分在于,不清楚是因为URL不正确,还是因为电子邮件客户端阻止了图像而没有显示电子邮件。

    最简单的方法是 (硬代码绝对URL) 要像这样使用它:

    <img th:src="@{|${public_domain}/img/logo.svg|}" />
    

    问题是“查看的表单”您的html…;)1.(我的最爱):…当您想从(公共)服务器上提供图像时:,(硬代码!)@xerx593如果您有答案,请将其发布为答案,好吗?电子邮件中的URL必须在目标客户端(即打开电子邮件的设备)上可访问。此外,许多邮件网络客户端通过自己的服务器代理外部URL。他们可能会禁止像“localhost”这样的主机。还请注意,许多邮件客户端不支持SVG图像:@Felix正如我在问题中所述,我已经验证了可以通过
    http://localhost:8080/img/logo.svg
    。当服务器在本地或非本地主机上运行时,也会出现同样的问题。请注意,OP在HTTPRequest上下文中不使用Thymeleaf。他将Thymeleaf用作生成HTML电子邮件的模板引擎,“完全动态”将仅在这种(http请求)情况下工作!仍然令人困惑:OP使用
    http://localhost:8080
    (可能使用spring boot..来提供图像),但仍然“缺少IWebContext”,我喜欢您的编辑。对于未来的读者,请注意,该示例将实际图像数据嵌入到电子邮件中,因此一旦用户打开电子邮件,就不会向Web服务器发出任何请求。因此,这种方式不可能提供动态图像
    public_domain=http://somwhere.com
    
    <img th:src="@{|${public_domain}/img/logo.svg|}" />
    
    <img th:scr="${#httpServletRequest.scheme}+'://'+${#httpServletRequest.serverName}+':'+${#httpServletRequest.serverPort}+@{img/logo.svg}" />
    
     <img src="sample.png" th:src="|cid:${imageResourceName}|" />
    
    String imageResourceName = ...
    byte[] imageBytes = ...
    String imageContentType = ...
    
    // Prepare the evaluation context
    final Context ctx = new Context(locale);
    ...
    ctx.setVariable("imageResourceName", imageResourceName); // so that we can reference it from HTML
    
    // Prepare message using a Spring helper
    final MimeMessage mimeMessage = this.mailSender.createMimeMessage();
    final MimeMessageHelper message = ...
    message.set...
    
    // Create the HTML body using Thymeleaf
    final String htmlContent = ...
    
    // Add the inline image, referenced from the HTML code as "cid:${imageResourceName}" !!!
    final InputStreamSource imageSource = new ByteArrayResource(imageBytes);
    message.addInline(imageResourceName, imageSource, imageContentType);
    
    // Send mail ...