gpt4 book ai didi

spring-boot - 在 Thymeleaf 生成的 HTML 文档中包含

转载 作者:行者123 更新时间:2023-12-04 11:35:15 24 4
gpt4 key购买 nike

在我的 Spring Boot 应用程序中,我使用 Thymeleaf 生成 HTML 电子邮件。我想包括一个 <img>在这些电子邮件中。图像存储在 /src/main/resources/static/img/logo.png .
我已经确认可以通过在本地启动应用程序并请求 http://localhost:8080/img/logo.svg 来解析图像。在浏览器中。
要将这张图片包含在 HTML 中,我已经尝试了以下所有内容

  • <img th:src="@{/img/logo.png}" />
  • <img th:src="@{img/logo.png}" />
  • <img th:src="@{~/img/logo.png}" />
  • Base64 编码图像 <img src="data:image/png;base64,iVBORw0KGgoAA..." />

  • 每一个的结果是:
  • 抛出异常:org.thymeleaf.exceptions.TemplateProcessingException:链接基“/img/logo.svg”不能是上下文相关的(/...),除非用于执行引擎的上下文实现了 org.thymeleaf.context.IWebContext 接口(interface)
  • 渲染 <img src="img/logo.png" />在电子邮件中显示为损坏的图像
  • 渲染 <img src="/img/logo.png" />在电子邮件中显示为损坏的图像
  • 该图像在我测试的大多数电子邮件客户端中呈现,但被 GMail 阻止,并且无法通过设置解除阻止。

  • 我想为了在电子邮件中正确呈现图像,我需要提供绝对 URL,但我不确定如何实现。
    部分问题在于,电子邮件之所以没有显示是因为 URL 不正确,还是因为电子邮件客户端阻止了图像,这一点并不明显。
    更新
    我认为这很明显,但显然不是:我不能使用任何将主机名硬编码为 localhost:8080 的解决方案。因为这只是我在本地运行时使用的 URL,我还需要它在其他环境中工作,例如产品

    最佳答案

    先进的
    您引入了一个声明“公共(public)网址”的属性(例如在 application.properties 中):

    public_domain=http://somwhere.com
    像这样使用它:
    <img th:src="@{|${public_domain}/img/logo.svg|}" />
    like here .

    完全动态
    <img th:scr="${#httpServletRequest.scheme}+'://'+${#httpServletRequest.serverName}+':'+${#httpServletRequest.serverPort}+@{img/logo.svg}" />
    super cool !! (这仅适用于存在 http(servlet)请求的情况,这在这里似乎不相关。)

    更深入
    你永远不知道谁在用任何客户端(它信任任何服务器......并从中加载图像)“监视”你的电子邮件!!? ...
    所以 embedding image in html email在 [so] 是一个“相当受欢迎”的问题。
    并应用于 thymeleaf : They have an extra article for that !! (还显示 img 附件 .. 可用于 html 和文本 (不含图像;()!!!;)
    总结一下(一旦配置了邮件和模板):
    模板:
     <img src="sample.png" th:src="|cid:${imageResourceName}|" />

    The img element has a hardcoded src value —nice for prototyping—, which will be substituted at runtime by something like cid:image.jpg matching the attached image filename.


    服务:
    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 ...

    关于spring-boot - 在 Thymeleaf 生成的 HTML 文档中包含 <image>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67919319/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com