Автор оригинала: 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, MaptemplateModel) 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, MaptemplateModel) 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 .