Korištenje predložaka e-pošte ThymeLeaf i FreeMarker s Springom

1. Pregled

U našem prethodnom članku vidjeli smo kako koristiti Spring za pisanje i slanje tekstnih e-mailova.

Ali moguće je i koristite proljetne motore predložaka za pisanje lijepih HTML e-poruka s dinamičnim sadržajem.

U ovom uputstvu naučit ćemo kako to učiniti pomoću najpoznatijih od njih: Majčina dušica i FreeMarker.

2. Proljetni HTML e-mailovi

Krenimo od tutorijala za proljetnu e-poštu.

Prvo ćemo dodati metodu u EmailServiceImpl klase za slanje e-pošte s HTML tijelom:

private void sendHtmlMessage (String to, String subject, String htmlBody) baca MessagingException {MimeMessage message = emailSender.createMimeMessage (); MimeMessageHelper pomagač = novi MimeMessageHelper (poruka, istina, "UTF-8"); pomagač.setTo (do); helper.setSubject (subject); helper.setText (htmlBody, true); emailSender.send (poruka); }

Koristimo MimeMessageHelper za popunjavanje poruke. Važan dio je pravi vrijednost prenesena na setText metoda: određuje vrstu HTML sadržaja.

Pogledajmo sada kako to izgraditi htmlTjelo koristeći predloške Thymeleaf i FreeMarker.

3. Konfiguracija majčine dušice

Krenimo s konfiguracijom. To možemo izolirati u klasi koja se zove Konfiguracija e-pošte.

Prvo, trebali bismo pružite rješivač predloška za pronalaženje direktorija datoteka predložaka.

3.1. Predlošci kao resursi Classpath-a

Datoteke predložaka mogu se poslati unutar JAR datoteke, što je najjednostavniji način za održavanje kohezije između predložaka i njihovih ulaznih podataka.

Da bismo pronašli predloške iz JAR-a, koristimo ClassLoaderTemplateResolver. Naši su predlošci u glavni / resursi / mail-predlošci direktorij, pa smo postavili Prefiks atribut u odnosu na resurs imenik:

@Bean public ITemplateResolver thymeleafTemplateResolver () {ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver (); templateResolver.setPrefix ("predlošci pošte /"); templateResolver.setSuffix (". html"); templateResolver.setTemplateMode ("HTML"); templateResolver.setCharacterEncoding ("UTF-8"); vrati predložakResolver; }

3.2. Predlošci iz vanjskog direktorija

U ostalim slučajevima, možda ćemo htjeti izmijeniti predloške bez potrebe za ponovnom gradnjom i postavljanjem. Da bismo to postigli, predloške možemo umjesto toga staviti na datotečni sustav.

Moglo bi biti korisno konfigurirati ovaj put u primjena.svojstva tako da ga možemo mijenjati za svako raspoređivanje. Ovom svojstvu se može pristupiti pomoću @Vrijednost napomena:

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

Zatim ovu vrijednost prosljeđujemo u a FileTemplateResolver, umjesto ClassLoaderTemplateResolver u našem majčina dušicaTemplateResolver metoda:

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

3.3. Konfigurirajte Thymeleaf Engine

Posljednji korak je stvaranje tvorničke metode za motor Thymeleaf. Morat ćemo reći motoru koji TemplateResolver koji smo mogli ubrizgati putem parametra u metodu tvornice zrna:

@Bean public SpringTemplateEngine thymeleafTemplateEngine (ITemplateResolver templateResolver) {SpringTemplateEngine templateEngine = novi SpringTemplateEngine (); templateEngine.setTemplateResolver (templateResolver); templateEngine.setTemplateEngineMessageSource (emailMessageSource ()); vratiti predložakEngine; }

Ovdje se proljeće automatski ubrizgava razrješivač koji smo stvorili u tvorničku metodu mehanizma predloška.

4. Konfiguracija FreeMarker

Na isti način kao majčina dušica, u Konfiguracija e-pošte klase, konfigurirat ćemo rješivač predloška za FreeMarker predloške (.ftl):

I ovaj put, mjesto predložaka bit će konfigurirano u FreeMarkerConfigurer grah.

4.1. Predlošci u razredu

Ovdje imamo iste mogućnosti kao i za majčinu dušicu. Konfigurirajmo predloške kao resurse putnih staza:

@Bean public FreeMarkerConfigurer freemarkerClassLoaderConfig () {Konfiguracija konfiguracije = nova konfiguracija (Configuration.VERSION_2_3_27); TemplateLoader templateLoader = novi ClassTemplateLoader (this.getClass (), "/ mail-templates"); configuration.setTemplateLoader (templateLoader); FreeMarkerConfigurer freeMarkerConfigurer = novi FreeMarkerConfigurer (); freeMarkerConfigurer.setConfiguration (konfiguracija); vratiti freeMarkerConfigurer; }

4.2. Predlošci na datotečnom sustavu

Da bismo konfigurirali predloške s drugog puta u datotečnom sustavu, morat ćemo zamijeniti TemplateLoader primjer:

TemplateLoader templateLoader = novi FileTemplateLoader (nova datoteka (mailTemplatesPath));

5. Lokalizacija s Thymeleaf i FreeMarker

Da bismo mogli upravljati prijevodima s Thymeleafom, možemo navedite a MessageSource primjer motora:

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

Zatim bismo kreirali snopove resursa za svaku lokalitetu koju podržavamo:

src / main / resources / mailMessages_xx_YY.properties

Kao FreeMarker predlaže lokalizaciju dupliciranjem predložaka, tamo ne moramo konfigurirati izvor poruke.

6. Sadržaj predložaka majčine dušice

Dalje, pogledajmo predložak-majčina dušica.html datoteka:

Kao što se može vidjeti, koristili smo oznaku majčine dušice, tj. ${…} za varijable i #{…} za lokalizirane nizove.

Kako je mehanizam predloška ispravno konfiguriran, vrlo ga je jednostavno koristiti: samo ćemo stvoriti Kontekst objekt koji sadrži varijable predloška (prošlo kao Karta ovdje).

Zatim ćemo ga proslijediti postupak metoda zajedno s nazivom predloška:

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

Sada, da vidimo kako napraviti istu stvar s FreeMarker-om.

7. Sadržaj FreeMarker predložaka

Kao što se može vidjeti, FreeMarker-ova sintaksa je jednostavnija, ali opet ne upravlja lokaliziranim nizovima. Dakle, evo engleske verzije:

Pozdrav, $ {primateljName}

$ {text}

Pozdrav,

$ {senderName} na Baeldungu

Tada bismo trebali koristiti FreeMarkerConfigurer klase da biste dobili datoteku predloška, ​​i na kraju, FreeMarkerTemplateUtils ubrizgati podatke iz našeg Karta:

@Autowired private FreeMarkerConfigurer freemarkerConfigurer; @Override public void sendMessageUsingFreemarkerTemplate (String to, String subject, Map templateModel) baca IOException, TemplateException, MessagingException {Template freemarkerTemplate = freemarkerConfigurer.getConfiguration (). String htmlBody = FreeMarkerTemplateUtils.processTemplateIntoString (freemarkerTemplate, templateModel); sendHtmlMessage (to, subject, htmlBody); }

Da idemo dalje, vidjet ćemo kako dodati logotip našem potpisu e-pošte.

8. E-adrese s ugrađenim slikama

Budući da je vrlo često uključivati ​​slike u HTML e-poštu, vidjet ćemo kako to učiniti pomoću privitka CID-a.

Prva promjena odnosi se na sendHtmlMessage metoda. Moramo postaviti MimeMessageHelper kao višedijelni mimoilaženjem pravi na drugi argument konstruktora:

MimeMessageHelper pomagač = novi MimeMessageHelper (poruka, istina, "UTF-8");

Zatim, slikovnu datoteku moramo dobiti kao resurs. Možemo koristiti @Vrijednost napomena za ovo:

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

Primijetite da mail-logo.png datoteka je u src / glavni / resursi imenik.

Povratak na sendHtmlMessage metodom, mi ćemo dodati resourceFile kao ugrađeni prilog, da biste ga mogli referencirati s CID-om:

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

Napokon, na sliku se mora pozivati ​​iz e-pošte Thymeleaf i FreeMarker koristeći CID notaciju:

9. Zaključak

U ovom smo članku vidjeli kako slati e-poštu Thymeleaf i FreeMarker, uključujući bogati HTML sadržaj.

Da zaključim, najveći dio posla povezan je s proljećem; stoga, upotreba jednog ili drugog prilično je slična za jednostavne potrebe, poput slanja e-pošte.

Kao i uvijek, puni izvorni kod primjera može se naći na GitHubu.


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