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.