Как обработать шаблон электронного письма TXT с помощью Thymeleaf?

Я пытаюсь отправить plain text электронное письмо из приложения Spring с помощью Thymeleaf.

Это мой почтовый сервис:

@Override
public void sendPasswordToken(Token token) throws ServiceException {
    Assert.notNull(token);

    try {

        Locale locale = Locale.getDefault();

        final Context ctx = new Context(locale);
        ctx.setVariable("url", url(token));

        // Prepare message using a Spring helper
        final MimeMessage mimeMessage = mailSender.createMimeMessage();

        final MimeMessageHelper message = new MimeMessageHelper(
                mimeMessage, false, SpringMailConfig.EMAIL_TEMPLATE_ENCODING
        );

        message.setSubject("Token");
        message.setTo(token.getUser().getUsername());

        final String content = this.textTemplateEngine.process("text/token", ctx);
        message.setText(content, false);

        mailSender.send(mimeMessage);

    } catch (Exception e) {
        throw new ServiceException("Token has not been sent", e);
    }
}

электронное письмо отправляется и доставляется в почтовый ящик.

Это мой шаблон электронного письма plain text:

URL токена: $ {url}

но в доставленном почтовом ящике url переменная не заменяется своим значением. Почему?

Когда я использую html классический синтаксис HTML Thymeleaf, переменная заменяется:

<span th:text="${url}"></span>

Каков правильный синтаксис текстового шаблона электронного письма?


person Artegon    schedule 11.01.2017    source источник
comment
Почему его проголосовали против?   -  person Artegon    schedule 12.01.2017


Ответы (2)


Вы также можете использовать Thymeleaf в текстовом режиме, как в этом примере:

Dear [(${customer.name})],

This is the list of our products:
[# th:each="p : ${products}"]
   - [(${p.name})]. Price: [(${#numbers.formatdecimal(p.price,1,2)})] EUR/kg
[/]
Thanks,
  The Thymeleaf Shop

Это означает, что у вас может быть текстовый файл, в котором есть только это:

Token url: [(${url})]

Взгляните на полную документацию по этим функциям здесь:

https://github.com/thymeleaf/thymeleaf/issues/395

Изменить

Как упоминалось в комментарии, обязательно используйте версию> = 3.0 Thymeleaf:

<properties>
  <thymeleaf.version>3.0.3.RELEASE</thymeleaf.version>
  <thymeleaf-layout-dialect.version>2.1.2</thymeleaf-layout-dialect.version>
</properties>
person yglodt    schedule 12.01.2017
comment
это хорошее дополнение к версии 3, как говорится в проблеме. спасибо за публикацию. - person Rayweb_on; 13.01.2017
comment
Да ты прав. Я использовал пакет зависимостей Thymeleaf starter из Spring, и он добавил Thymeleaf в версии 2.x. Когда я удалил версию 2 и обновился до версии 3, синтаксис заработал, и, как вы упомянули, это рекомендуемый способ. - person Artegon; 13.01.2017

Используйте такой шаблон HTML, и он будет обрабатывать простой текст.

<html xmlns:th="http://www.thymeleaf.org" th:inline="text" th:remove="tag">
Token url: [[${url}]]
</html>

по-другому, все еще используя html, может быть так

<span th:text="Token url:" th:remove="tag"></span><span th:text="${url}" th:remove="tag"></span>

Вы хотите произвести plain text, чтобы тимелист вернул его вам.

person Rayweb_on    schedule 11.01.2017
comment
это правильный способ сделать это. Я имею в виду действительный способ сделать это, я не уверен, официальный это или нет, я знаю, что это работает. - person Rayweb_on; 12.01.2017
comment
Обратите внимание, что при использовании синтаксиса [[]] текст будет экранирован html: thymeleaf.org/doc/tutorials/3.0/ - person eugene82; 07.11.2019