Рубрики
Без рубрики

Использование шаблонов сообщений о том, что с помощью Шаблонов сообщений ThymeLeaf и FreeMarker emails с помощью Spring

Быстрое и практичное руководство по использованию шаблонов писем ThymeLeaf и FreeMarker с Spring.

Автор оригинала: Benjamin Caure.

1. Обзор

В нашей предыдущей статье, мы видели, как использовать Весна писать и отправлять текстовые письма.

Но это также можно использовать Весенние шаблонные двигатели писать красивые HTML-письма с динамическим содержанием .

В этом учебнике, мы собираемся, чтобы узнать, как это сделать, используя самый известный из них: Тимьян и ФриМаркер .

2. Весна HTML Письма

Давайте начнем с весенней электронной почты учебник .

Во-первых, мы добавим метод в EmailServiceImpl класс для отправки электронных писем с html тела:

private void sendHtmlMessage(String to, String subject, String htmlBody) throws MessagingException {
    MimeMessage message = emailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
    helper.setTo(to);
    helper.setSubject(subject);
    helper.setText(htmlBody, true);
    emailSender.send(message);
}

Мы используем MimeMessageHelper заполнить сообщение . Важной частью является истинное значение, передаваемое setText метод: он определяет тип содержимого HTML.

Давайте посмотрим, как построить этот htmlБоди с помощью шаблонов Thymeleaf и FreeMarker.

3. Конфигурация тимьяна

Начнем с конфигурации. Мы можем изолировать это в классе под названием Электронная почтаКонфигурация .

Во-первых, мы предоставить разрешение шаблона для поиска каталога файлов шаблона .

3.1. Шаблоны как ресурсы класса

Файлы шаблонов могут быть отправлены в файле JAR , что является самым простым способом поддержания согласованности между шаблонами и их входных данных.

Чтобы найти шаблоны из JAR, мы используем ClassLoaderTemplateResolver . Наши шаблоны находятся в основные/ресурсы/почтовые шаблоны каталог, поэтому мы Префикс атрибут по отношению к ресурсное каталог:

@Bean
public ITemplateResolver thymeleafTemplateResolver() {
    ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
    templateResolver.setPrefix("mail-templates/");
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode("HTML");
    templateResolver.setCharacterEncoding("UTF-8");
    return templateResolver;
}

3.2. Шаблоны из внешнего каталога

В других случаях мы можем изменить шаблоны без необходимости перестраивать и развертывать . Для достижения этой цели мы можем поместить шаблоны в файловую систему.

Возможно, было бы полезно настроить этот путь в application.properts так что мы можем изменить его для каждого развертывания. Доступ к этому свойству можно получить с помощью @Value аннотация:

@Value("${spring.mail.templates.path}")
private String mailTemplatesPath;

Затем мы переа проходим это значение FileTemplateРесольвер , вместо ClassLoaderTemplateResolver в нашем тимьянлефТемплатРесольвер метод:

FileTemplateResolver templateResolver = new FileTemplateResolver();
templateResolver.setPrefix(mailTemplatesPath);

3.3. Настройте двигатель Thymeleaf

Заключительным шагом является создание заводского метода для двигателя Thymeleaf. Нам нужно сказать двигателю, какой ШаблонРесолвер мы выбрали, который мы можем ввести через параметр метода фабрики фасоли:

@Bean
public SpringTemplateEngine thymeleafTemplateEngine(ITemplateResolver templateResolver) {
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(templateResolver);
    templateEngine.setTemplateEngineMessageSource(emailMessageSource());
    return templateEngine;
}

Здесь разрешаемый, который мы создали ранее, автоматически вводится Spring в метод фабрики шаблонных двигателей.

4. Конфигурация FreeMarker

Так же, как Thymeleaf, в Электронная почтаКонфигурация класс, мы настройим разрешение шаблонов для шаблонов FreeMarker (.ftl ) :
И на этот раз, расположение шаблонов будет настроено в FreeMarkerConfigurer бобовые
.

4.1. Шаблоны в Класспате

Здесь у нас есть те же варианты, что и для Thymeleaf. Давайте настраивать шаблоны в качестве ресурсов classpath:

@Bean 
public FreeMarkerConfigurer freemarkerClassLoaderConfig() {
    Configuration configuration = new Configuration(Configuration.VERSION_2_3_27);
    TemplateLoader templateLoader = new ClassTemplateLoader(this.getClass(), "/mail-templates");
    configuration.setTemplateLoader(templateLoader);
    FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
    freeMarkerConfigurer.setConfiguration(configuration);
    return freeMarkerConfigurer; 
}

4.2. Шаблоны в файловой системе

Чтобы настроить шаблоны с другого пути в файловой системе, нам нужно заменить TemplateLoader пример:

TemplateLoader templateLoader = new FileTemplateLoader(new File(mailTemplatesPath));

5. Локализация с Thymeleaf и FreeMarker

Для того, чтобы управлять переводами с Thymeleaf, мы можем указать СообщениеИсточник экземпляр к двигателю :

@Bean
public ResourceBundleMessageSource emailMessageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("mailMessages");
    return messageSource;
}
@Bean
public SpringTemplateEngine thymeleafTemplateEngine() {
   ...
   templateEngine.setTemplateEngineMessageSource(emailMessageSource());
   ...
}

Затем мы создадим пакеты ресурсов для каждого места, который мы поддерживаем:

src/main/resources/mailMessages_xx_YY.properties

Как FreeMarker предлагает локализацию по дублирование шаблонов , мы не должны настроить источник сообщения там.

6. Содержание шаблонов Тимьянафа

Далее давайте посмотрим на шаблон-тимьян.html файл:




  
    
  
  
    


Как видно, мы использовали нотацию Thymeleaf, то есть ${…} для переменных и #{…} для локализованных строк .

Поскольку движок шаблона правильно настроен, его очень просто использовать: мы просто создадим Контекст объект, содержащий переменные шаблона (прошел как Карта здесь).

Затем мы перейдем его в процесс метод вместе с именем шаблона:

@Autowired
private SpringTemplateEngine thymeleafTemplateEngine;

@Override
public void sendMessageUsingThymeleafTemplate(
    String to, String subject, Map templateModel)
        throws MessagingException {
                
    Context thymeleafContext = new Context();
    thymeleafContext.setVariables(templateModel);
    String htmlBody = thymeleafTemplateEngine.process("template-thymeleaf.html", thymeleafContext);
    
    sendHtmlMessage(to, subject, htmlBody);
}

Теперь давайте посмотрим, как сделать то же самое с FreeMarker.

7. Контент шаблонов FreeMarker

Как видно, синтаксис FreeMarker проще, но опять же он не управляет локализованными строками. Итак, вот английская версия:




    
      
    
    
      

Hi ${recipientName}

${text}

Regards,

${senderName} at Baeldung

Тогда мы должны использовать FreeMarkerConfigurer класс, чтобы получить файл шаблона, и, наконец, FreeMarkerTemplateUtils вводить данные из нашей Карта :

@Autowired
private FreeMarkerConfigurer freemarkerConfigurer;

@Override
public void sendMessageUsingFreemarkerTemplate(
    String to, String subject, Map templateModel)
        throws IOException, TemplateException, MessagingException {
        
    Template freemarkerTemplate = freemarkerConfigurer.getConfiguration()
      .getTemplate("template-freemarker.ftl");
    String htmlBody = FreeMarkerTemplateUtils.processTemplateIntoString(freemarkerTemplate, templateModel);

    sendHtmlMessage(to, subject, htmlBody);
}

Чтобы пойти дальше, мы увидим, как добавить логотип к нашей электронной почте подписи.

8. Электронные письма со встроенными изображениями

Так как это очень часто, чтобы включить изображения в HTML электронной почте, мы увидим, как это сделать с помощью CiD вложения .

Первое изменение касается отправитьhtmlMessage метод. Мы должны установить MimeMessageHelper как многопрофие проходя истинное на второй аргумент конструктора:

MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");

Затем мы должны получить файл изображения в качестве ресурса. Мы можем использовать @Value аннотация для этого:

@Value("classpath:/mail-logo.png")
Resource resourceFile;

Обратите внимание, что почтовый логотип.png файл находится в src/main/resources каталог.

Назад в отправитьhtmlMessage метод, мы добавить ресурсФиле в качестве велений , чтобы иметь возможность ссылаться на него с CID:

helper.addInline("attachment.png", resourceFile);

Наконец, изображение должно быть ссылкой как с Thymeleaf и FreeMarker писем с использованием CID нотации :

9. Заключение

В этой статье мы видели, как отправлять письма Thymeleaf и FreeMarker, включая богатый HTML-контент.

В заключение, большая часть работы связана с весной; поэтому использование одного или другого очень похоже на простую потребность, такую как отправка электронных писем .

Как всегда, полный исходный код примеров можно найти более на GitHub .