Používanie šablón e-mailov ThymeLeaf a FreeMarker s jarou

1. Prehľad

V našom predchádzajúcom článku sme videli, ako používať Spring na písanie a odosielanie textových e-mailov.

Ale je to tiež možné používajte jarné šablónové motory na písanie krásnych e-mailov HTML s dynamickým obsahom.

V tomto výučbe sa naučíme, ako to urobiť pomocou najslávnejších z nich: Thymeleaf a FreeMarker.

2. Jarné e-maily HTML

Začnime od jarného e-mailového tutoriálu.

Najskôr pridáme metódu do EmailServiceImpl triedy na odosielanie e-mailov s textom HTML:

private void sendHtmlMessage (String to, String subject, String htmlBody) throws MessagingException {MimeMessage message = emailSender.createMimeMessage (); Pomocník MimeMessageHelper = nový MimeMessageHelper (správa, pravda, „UTF-8“); helper.setTo (do); helper.setSubject (predmet); helper.setText (htmlBody, true); emailSender.send (správa); }

Používame MimeMessageHelper na vyplnenie správy. Dôležitou súčasťou je pravda hodnota odovzdaná do setText metóda: určuje typ obsahu HTML.

Pozrime sa teraz, ako to postaviť htmlBody pomocou šablón Thymeleaf a FreeMarker.

3. Konfigurácia štítovej tyče

Začnime s konfiguráciou. Toto môžeme izolovať v triede s názvom EmailConfiguration.

Najprv by sme mali poskytnúť prekladač šablón na vyhľadanie adresára súborov šablón.

3.1. Šablóny ako zdroje triedy

Súbory šablón je možné dodať v rámci súboru JAR, čo je najjednoduchší spôsob, ako zachovať súdržnosť medzi šablónami a ich vstupnými údajmi.

Na vyhľadanie šablón zo súboru JAR používame ClassLoaderTemplateResolver. Naše šablóny sú v main / resources / mail-templates adresár, tak sme nastavili Predpona atribút vo vzťahu k zdroj adresár:

@Bean public ITemplateResolver thymeleafTemplateResolver () {ClassLoaderTemplateResolver templateResolver = nový ClassLoaderTemplateResolver (); templateResolver.setPrefix ("mail-templates /"); templateResolver.setSuffix (". html"); templateResolver.setTemplateMode ("HTML"); templateResolver.setCharacterEncoding ("UTF-8"); vrátiť templateResolver; }

3.2. Šablóny z externého adresára

V ostatných prípadoch možno budeme chcieť upraviť šablóny bez nutnosti ich opätovného zostavenia a nasadenia. Aby sme to dosiahli, môžeme namiesto toho umiestniť šablóny do súborového systému.

Môže byť užitočné nakonfigurovať túto cestu v application.properties aby sme ho mohli upraviť pre každé nasadenie. K tomuto majetku je možné pristupovať pomocou @Hodnota anotácia:

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

Túto hodnotu potom odovzdáme a FileTemplateResolver, namiesto ClassLoaderTemplateResolver v našom thymeleafTemplateResolver metóda:

FileTemplateResolver templateResolver = nový FileTemplateResolver (); templateResolver.setPrefix (mailTemplatesPath);

3.3. Nakonfigurujte motor Thymeleaf

Posledným krokom je vytvorenie továrenskej metódy pre motor Thymeleaf. Budeme musieť povedať motoru, ktorý TemplateResolver vybrali sme, ktoré môžeme vložiť pomocou parametra do metódy fazuľovej továrne:

@Bean public SpringTemplateEngine thymeleafTemplateEngine (ITemplateResolver templateResolver) {SpringTemplateEngine templateEngine = nový SpringTemplateEngine (); templateEngine.setTemplateResolver (templateResolver); templateEngine.setTemplateEngineMessageSource (emailMessageSource ()); vrátiť templateEngine; }

Tu je resolver, ktorý sme vytvorili skôr, automaticky vložený Springom do výrobnej metódy šablónového motora.

4. Konfigurácia FreeMarker

Rovnakým spôsobom ako Thymeleaf, v EmailConfiguration triedy, nakonfigurujeme prekladač šablón pre šablóny FreeMarker (.ftl):

A tentoraz umiestnenie šablón bude nakonfigurované v FreeMarkerConfigurer fazuľa.

4.1. Šablóny v Classpath

Tu máme rovnaké možnosti ako pre Thymeleaf. Nakonfigurujme šablóny ako prostriedky triedy:

@Bean public FreeMarkerConfigurer freemarkerClassLoaderConfig () {konfiguračná konfigurácia = nová konfigurácia (Configuration.VERSION_2_3_27); TemplateLoader templateLoader = nový ClassTemplateLoader (this.getClass (), "/ mail-templates"); configuration.setTemplateLoader (templateLoader); FreeMarkerConfigurer freeMarkerConfigurer = nový FreeMarkerConfigurer (); freeMarkerConfigurer.setConfiguration (konfigurácia); vrátiť freeMarkerConfigurer; }

4.2. Šablóny v systéme súborov

Ak chcete konfigurovať šablóny z inej cesty v súborovom systéme, budeme musieť vymeniť TemplateLoader inštancia:

TemplateLoader templateLoader = nový FileTemplateLoader (nový súbor (mailTemplatesPath));

5. Lokalizácia pomocou Thymeleaf a FreeMarker

Aby sme mohli spravovať preklady s Thymeleaf, môžeme uveďte a MessageSource napríklad k motoru:

@Bean public ResourceBundleMessageSource emailMessageSource () {ResourceBundleMessageSource messageSource = nový ResourceBundleMessageSource (); messageSource.setBasename ("mailMessages"); návrat messageSource; }
@Bean public SpringTemplateEngine thymeleafTemplateEngine () {... templateEngine.setTemplateEngineMessageSource (emailMessageSource ()); ...}

Potom by sme vytvorili zväzky zdrojov pre každé podporované miestne nastavenie:

src / main / resources / mailMessages_xx_YY.properties

Ako FreeMarker navrhuje lokalizáciu duplikovaním šablón, nemusíme tam konfigurovať zdroj správ.

6. Obsah šablón Thymeleaf

Ďalej sa pozrime na template-thymeleaf.html spis:

Ako je vidieť, použili sme Thymeleaf notáciu, to znamená, ${…} pre premenné a #{…} pre lokalizované reťazce.

Pretože je šablónový modul správne nakonfigurovaný, jeho použitie je veľmi jednoduché: Vytvoríme iba a Kontext objekt, ktorý obsahuje premenné šablóny (prešiel ako Mapa tu).

Potom to odovzdáme procesu metóda spolu s názvom šablóny:

@Autowired private SpringTemplateEngine thymeleafTemplateEngine; @Override public void sendMessageUsingThymeleafTemplate (String to, String subject, Map templateModel) hodí MessagingException {Context thymeleafContext = new Context (); thymeleafContext.setVariables (templateModel); Reťazec htmlBody = thymeleafTemplateEngine.process ("template-thymeleaf.html", thymeleafContext); sendHtmlMessage (do, predmet, htmlBody); }

Teraz sa pozrime, ako urobiť to isté s FreeMarkerom.

7. Obsah šablón FreeMarker

Ako je vidieť, syntax FreeMarkeru je jednoduchšia, ale opäť nespravuje lokalizované reťazce. Takže, tu je anglická verzia:

Ahoj $ {recipientName}

$ {text}

S pozdravom,

$ {senderName} v Baeldungu

Potom by sme mali použiť FreeMarkerConfigurer triedy, aby ste dostali súbor so šablónou, a nakoniec FreeMarkerTemplateUtils vložiť údaje z nášho Mapa:

@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"); Reťazec htmlBody = FreeMarkerTemplateUtils.processTemplateIntoString (freemarkerTemplate, templateModel); sendHtmlMessage (do, predmet, htmlBody); }

Ak pôjdeme ďalej, uvidíme, ako pridať logo k nášmu podpisu e-mailu.

8. E-maily s vloženými obrázkami

Pretože je veľmi bežné zahrnúť obrázky do e-mailu vo formáte HTML, uvidíme, ako to urobiť pomocou prílohy CID.

Prvá zmena sa týka sendHtmlMessage metóda. Musíme nastaviť MimeMessageHelper ako viacdielne prechodom pravda na druhý argument konštruktora:

Pomocník MimeMessageHelper = nový MimeMessageHelper (správa, pravda, „UTF-8“);

Potom musíme získať obrazový súbor ako zdroj. Môžeme použiť @Hodnota anotácia pre toto:

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

Všimnite si, že mail-logo.png súbor je v src / main / resources adresár.

Späť na sendHtmlMessage metóda, urobíme pridať resourceFile ako vložená príloha, aby bolo možné odkázať ho na CID:

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

Nakoniec na obrázok sa musí odkazovať z e-mailov Thymeleaf aj FreeMarker pomocou notácie CID:

9. Záver

V tomto článku sme videli, ako posielať e-maily Thymeleaf a FreeMarker vrátane bohatého obsahu HTML.

Záverom je, že väčšina práce sa týka jari; preto použitie jedného alebo druhého je dosť podobné pre jednoduchú potrebu, ako je posielanie e-mailov.

Celý zdrojový kód príkladov nájdete ako vždy na serveri GitHub.


$config[zx-auto] not found$config[zx-overlay] not found