首页 > 解决方案 > Thymeleaf Content-Type 在 HTML 电子邮件中被忽略(未呈现为 HTML)

问题描述

我正在开发一个以 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 的,我认为我已经做到了。

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

标签: htmlemailthymeleaf

解决方案


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

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);
}

推荐阅读