Тип содержимого Thymeleaf игнорируется в HTML электронной почте (не отображается как HTML) - PullRequest
0 голосов
/ 01 апреля 2020

Я разрабатываю RESTful API с Spring Boot в качестве бэкэнда и Angular 9 веб-интерфейса. После регистрации пользователя отправляется электронное письмо с подтверждением, в котором пользователю необходимо нажать на ссылку, чтобы подтвердить свою учетную запись. Функционально все настроено и работает. Однако HTML никогда не отображается, несмотря на то, что Content-Type установлен на text / html и charset на UTF-8. Я использую 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, что, по моему мнению, я сделал.

Я застрял здесь два дня с тем, что я считаю очень простой c вопрос, поэтому любая помощь высоко ценится.

1 Ответ

0 голосов
/ 03 апреля 2020

Благодаря подсказке Эндрю об использовании setContent() вместо setText() для javax.mail.Message я понял, что никогда не устанавливал тип содержимого своей электронной почты где-либо в коде. Я не использую javax.mail, но 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...