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.