Brug af ThymeLeaf og FreeMarker e-mail-skabeloner med foråret

1. Oversigt

I vores tidligere artikel så vi, hvordan vi bruger Spring til at skrive og sende tekst-e-mails.

Men det er også muligt at Brug Spring Template-motorer til at skrive smukke HTML-e-mails med dynamisk indhold.

I denne vejledning lærer vi at gøre det ved hjælp af de mest berømte af dem: Thymeleaf og FreeMarker.

2. Forår HTML-e-mails

Lad os starte med vejledningen om forårets e-mail.

Først tilføjer vi en metode til EmailServiceImpl klasse til at sende e-mails med en HTML-brødtekst:

privat ugyldigt sendHtmlMessage (streng til, strengemne, streng htmlBody) kaster MessagingException {MimeMessage-meddelelse = emailSender.createMimeMessage (); MimeMessageHelper-hjælper = ny MimeMessageHelper (besked, sandt, "UTF-8"); helper.setTo (til); helper.setSubject (emne); helper.setText (htmlBody, sand); emailSender.send (besked); }

Vi bruger MimeMessageHjælp for at udfylde beskeden. Den vigtige del er rigtigt værdi overført til setText metode: den specificerer HTML-indholdstypen.

Lad os nu se, hvordan man bygger dette htmlBody ved hjælp af Thymeleaf og FreeMarker skabeloner.

3. Thymeleaf-konfiguration

Lad os starte med konfigurationen. Vi kan isolere dette i en klasse kaldet E-mailkonfiguration.

Først skal vi give en skabelonopløsning til at finde skabelonfilkataloget.

3.1. Skabeloner som Classpath Resources

Skabelonfiler kan sendes inden for JAR-filen, som er den enkleste måde at opretholde samhørighed mellem skabeloner og deres inputdata på.

For at finde skabeloner fra JAR bruger vi ClassLoaderTemplateResolver. Vores skabeloner findes i hoved / ressourcer / mail-skabeloner katalog, så vi indstiller Præfiks attribut i forhold til ressource vejviser:

@Bean offentlig ITemplateResolver thymeleafTemplateResolver () {ClassLoaderTemplateResolver templateResolver = ny ClassLoaderTemplateResolver (); templateResolver.setPrefix ("mail-skabeloner /"); templateResolver.setSuffix (". html"); templateResolver.setTemplateMode ("HTML"); templateResolver.setCharacterEncoding ("UTF-8"); retur skabelonResolver; }

3.2. Skabeloner fra ekstern telefonbog

I andre tilfælde Vi vil muligvis ændre skabeloner uden at skulle genopbygge og implementere. For at opnå dette kan vi placere skabelonerne på filsystemet i stedet.

Det kan være nyttigt at konfigurere denne sti i application.properties så vi kan ændre det for hver implementering. Denne ejendom kan tilgås ved hjælp af @Værdi kommentar:

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

Vi overfører derefter denne værdi til a FileTemplateResolver, i stedet for ClassLoaderTemplateResolver i vores thymeleafTemplateResolver metode:

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

3.3. Konfigurer Thymeleaf Engine

Det sidste trin er at oprette fabriksmetoden til Thymeleaf-motoren. Vi bliver nødt til at fortælle motoren hvilken SkabelonResolver vi har valgt, som vi kan indsprøjte via en parameter til bønnefabriksmetoden:

@Bean public SpringTemplateEngine thymeleafTemplateEngine (ITemplateResolver templateResolver) {SpringTemplateEngine templateEngine = new SpringTemplateEngine (); templateEngine.setTemplateResolver (templateResolver); templateEngine.setTemplateEngineMessageSource (emailMessageSource ()); returskabelonMotor; }

Her injiceres den resolver, vi oprettede tidligere, automatisk af Spring i skabelonmotorfabriksmetoden.

4. FreeMarker-konfiguration

På samme måde som Thymeleaf i E-mailkonfiguration klasse, konfigurerer vi skabelonopløsning til FreeMarker-skabeloner (.ftl):

Og denne gang, skabelonernes placering konfigureres i FreeMarkerConfigurer bønne.

4.1. Skabeloner i klassestien

Her har vi de samme muligheder som for Thymeleaf. Lad os konfigurere skabeloner som klassestieressourcer:

@Bean offentlig FreeMarkerConfigurer freemarkerClassLoaderConfig () {Configuration configuration = new Configuration (Configuration.VERSION_2_3_27); TemplateLoader templateLoader = ny ClassTemplateLoader (this.getClass (), "/ mail-skabeloner"); configuration.setTemplateLoader (templateLoader); FreeMarkerConfigurer freeMarkerConfigurer = ny FreeMarkerConfigurer (); freeMarkerConfigurer.setConfiguration (konfiguration); returner freeMarkerConfigurer; }

4.2. Skabeloner på filsystemet

For at konfigurere skabeloner fra en anden sti i filsystemet skal vi erstatte TemplateLoader eksempel:

TemplateLoader templateLoader = ny FileTemplateLoader (ny fil (mailTemplatesPath));

5. Lokalisering med Thymeleaf og FreeMarker

For at administrere oversættelser med Thymeleaf kan vi angiv en MessageSource instans til motoren:

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

Derefter opretter vi ressourcegrupper til hvert land, vi understøtter:

src / main / resources / mailMessages_xx_YY.properties

Som FreeMarker foreslår lokalisering ved at duplikere skabelonerne, vi behøver ikke at konfigurere meddelelseskilden der.

6. Thymeleaf skabeloner indhold

Lad os derefter se på skabelon-thymeleaf.html fil:

Som det kan ses, har vi brugt Thymeleaf-notation, det vil sige ${…} for variabler og #{…} til lokaliserede strenge.

Da skabelonmotoren er korrekt konfigureret, er det meget simpelt at bruge den: Vi opretter bare en Sammenhæng objekt, der indeholder skabelonvariabler (bestået som en Kort her).

Derefter sender vi det til behandle metode sammen med skabelonnavnet:

@Autowired privat SpringTemplateEngine thymeleafTemplateEngine; @Override public void sendMessageUsingThymeleafTemplate (String to, String subject, Map templateModel) throw MessagingException {Context thymeleafContext = new Context (); thymeleafContext.setVariables (templateModel); Streng htmlBody = thymeleafTemplateEngine.process ("skabelon-thymeleaf.html", thymeleafContext); sendHtmlMessage (til, emne, htmlBody); }

Lad os nu se, hvordan man gør det samme med FreeMarker.

7. FreeMarker-skabelonindhold

Som det kan ses, er FreeMarkers syntaks mere enkel, men igen administrerer den ikke lokaliserede strenge. Så her er den engelske version:

Hej $ {recipientName}

$ {tekst}

Hilsen,

$ {senderName} i Baeldung

Derefter skal vi bruge FreeMarkerConfigurer klasse for at hente skabelonfilen, og endelig, FreeMarkerTemplateUtils at indsprøjte data fra vores Kort:

@Autowired privat FreeMarkerConfigurer freemarkerConfigurer; @Override public void sendMessageUsingFreemarkerTemplate (String to, String subject, Map templateModel) kaster IOException, TemplateException, MessagingException {Template freemarkerTemplate = freemarkerConfigurer.getConfiguration () .getTemplate ("template-freemarker.ftl") String htmlBody = FreeMarkerTemplateUtils.processTemplateIntoString (freemarkerTemplate, templateModel); sendHtmlMessage (til, emne, htmlBody); }

For at gå videre ser vi, hvordan vi tilføjer et logo til vores e-mail-signatur.

8. E-mails med integrerede billeder

Da det er meget almindeligt at medtage billeder i en HTML-mail, ser vi, hvordan man gør dette ved hjælp af en CID-vedhæftet fil.

Den første ændring vedrører sendHtmlMessage metode. Vi er nødt til at sætte MimeMessageHjælp som flerdelt ved at passere rigtigt til konstruktørens andet argument:

MimeMessageHelper helper = ny MimeMessageHelper (besked, sandt, "UTF-8");

Derefter skal vi hente billedfilen som en ressource. Vi kan bruge @Værdi kommentar til dette:

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

Bemærk, at mail-logo.png filen er i src / main / ressourcer vejviser.

Tilbage til sendHtmlMessage metode, vil vi tilføje resourceFile som en integreret vedhæftet fil, for at kunne henvise til det med CID:

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

Endelig blev billedet skal henvises fra både Thymeleaf og FreeMarker e-mails ved hjælp af CID-notation:

9. Konklusion

I denne artikel har vi set hvordan man sender Thymeleaf og FreeMarker e-mails, inklusive rigt HTML-indhold.

Afslutningsvis er det meste af arbejdet relateret til foråret; derfor, brugen af ​​den ene eller den anden er ret ens for et simpelt behov såsom at sende e-mails.

Som altid kan den fulde kildekode for eksemplerne findes på GitHub.


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