【问题标题】:Thymeleaf Content-Type is being ignored in HTML Email (not rendered as HTML)Thymeleaf Content-Type 在 HTML 电子邮件中被忽略(未呈现为 HTML)
【发布时间】:2020-04-01 07:30:02
【问题描述】:

我正在开发一个以 Spring Boot 作为后端和一个 Angular 9 前端的 RESTful API。用户注册后,会发送一封验证电子邮件,用户需要点击其中的链接来验证他们的帐户。从功能上讲,一切都已设置好并正常工作。但是,尽管 Content-Type 设置为“text/html”且字符集设置为 UTF-8,但 HTML 永远不会呈现。我正在使用 Thymeleaf 生成 HTML:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta http-equiv="Content-Type" content="text/html charset=UTF-8" />
    </head>
    <body>
    <header>TooManyThoughts</header>
    <section>
        <p th:text="#{registration.mail.greeting(${#messages.msg('mail.greeting.title.' + user.personalData.title.representation, user.personalData.firstName, user.personalData.lastName)})}"></p>
        <p th:text="#{registration.mail.preamble}"></p>
        <p>
            <a th:text="#{registration.mail.link}"
                 th:href="@{http://localhost:8081/auth/register/email/verify/{id}/{key}(id = ${user.id}, key = ${user.emailValidationKey}, send='auth,login', verified='email')}"></a>
        </p>
        <p>
            <span th:text="#{registration.mail.clue01(${user.credentials.username})}"></span>
            <span th:text="#{registration.mail.clue02}"></span>
        </p>
        <p th:text="#{registration.mail.catchphrase}"></p>
        <p th:text="#{registration.mail.goodbye}"></p>
        <p>
            <span th:text="#{registration.mail.signature01}"></span>
            <br>
            <span th:text="#{registration.mail.signature02}"></span>
        </p>
    </section>
    <footer></footer>
</body>

在撰写本文时,使用的所有框架都处于最新版本。目前,我正在将电子邮件发送到我的个人 gmail 帐户。在谷歌上搜索这个问题时,我发现了 gmail 的一些渲染问题,但它们都已经过时了,并且从 2011 年左右开始。我能找到的唯一其他帖子和条目是关于正确设置 Content-Type 和 charset,我认为我已经做到了。

两天以来我有点卡在这里,我认为这应该是一个非常基本的问题,因此非常感谢任何帮助。

【问题讨论】:

  • 乍一看,您的 Thymeleaf 模板看起来不错。您能否向我们展示设置内容类型和字符集的代码 - 即相关的 javax.mail.Message 语句?如果它解决了问题,请不要使用message.setText()。只使用message.setContent()
  • 您好安德鲁,非常感谢您的回复。我要编辑我的问题以添加代码,但我不能在明天早上之前完成。我所知道的是我使用 Spring 的 MimeMessagePreparator 和 MimeMessageHelper 并将字符集传递给后者的构造函数。明天我会看一下,然后我会发布它。再次感谢。
  • 您好 Andrew,感谢您使用 getContent 而不是 getText 的提示,我能够弄清楚(回答)。干杯!

标签: html email thymeleaf


【解决方案1】:

感谢 Andrew 关于使用 setContent() 而不是 setText() 代替 javax.mail.Message 的提示,我意识到我从未在代码中的任何位置实际设置过电子邮件的内容类型。我没有使用javax.mail,而是springframework.mail.javamail,所以我不得不寻找解决方案,我找到了here。工作代码现在如下所示:

public EmailVerificationModel sendMail(final EmailVerificationModel model) {
    final MimeMessagePreparator msgPreparator = mimeMessage -> {
        final MimeMessageHelper msgHelper = new MimeMessageHelper(mimeMessage, "UTF-8");
        msgHelper.setFrom("petesideburner@gmail.com");
        msgHelper.setTo(model.getCredentials().getEmail());
        msgHelper.setSubject(this.mailBuilder.subject(model));
        msgHelper.setText(this.mailBuilder.build(model), true);
    };
    this.mailSender.send(msgPreparator);
    return this.verificationMailSent(model);
}

我所要做的就是将true 作为第二个参数传递给Spring 的MimeMessageHelper.setText() 方法。方法签名的隐藏怪癖。就我个人而言,我更喜欢方法和变量的不同名称,因此为了更好地阅读我的代码,我将其更改为:

public EmailVerificationModel sendHtmlMail(final EmailVerificationModel model) {
    final boolean html = true;
    final MimeMessagePreparator msgPreparator = mimeMessage -> {
        [...]
        msgHelper.setText(this.mailBuilder.build(model), html);
    };
    this.mailSender.send(msgPreparator);
    return this.verificationMailSent(model);
}

【讨论】:

    猜你喜欢
    • 2021-06-03
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多