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.