Bruke ThymeLeaf og FreeMarker e-postmaler med våren

1. Oversikt

I vår forrige artikkel så vi hvordan vi kan bruke Spring til å skrive og sende tekst-e-post.

Men det er også mulig å bruk vårmalmotorer til å skrive vakre HTML-e-postmeldinger med dynamisk innhold.

I denne opplæringen skal vi lære å gjøre det ved hjelp av de mest kjente av dem: Thymeleaf og FreeMarker.

2. Vårens HTML-e-post

La oss starte fra vår e-postopplæring.

Først legger vi til en metode for EmailServiceImpl klasse for å sende e-post med en HTML-kropp:

privat tomrom sendHtmlMessage (streng til, strengemne, streng htmlBody) kaster MessagingException {MimeMessage melding = emailSender.createMimeMessage (); MimeMessageHelper helper = ny MimeMessageHelper (melding, sann, "UTF-8"); helper.setTo (til); helper.setSubject (subject); helper.setText (htmlBody, true); emailSender.send (melding); }

Vi bruker MimeMessageHelper for å fylle ut meldingen. Den viktige delen er ekte verdien overført til setText metode: den spesifiserer HTML-innholdstypen.

La oss nå se hvordan vi kan bygge dette htmlBody ved hjelp av maler fra Thymeleaf og FreeMarker.

3. Thymeleaf-konfigurasjon

La oss starte med konfigurasjonen. Vi kan isolere dette i en klasse som heter E-postkonfigurasjon.

Først skal vi gi en maloppløsning for å finne malfilkatalogen.

3.1. Maler som Classpath Resources

Malfiler kan sendes i JAR-filen, som er den enkleste måten å opprettholde sammenheng mellom malene og deres inndata.

For å finne maler fra JAR bruker vi ClassLoaderTemplateResolver. Malene våre er i hoved / ressurser / mail-maler katalog, så vi setter Prefiks attributt i forhold til ressurs katalog:

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

3.2. Maler fra ekstern katalog

I andre tilfeller Det kan være lurt å endre maler uten å måtte bygge om og distribuere. For å oppnå dette kan vi sette malene på filsystemet i stedet.

Det kan være nyttig å konfigurere denne banen i application.properties slik at vi kan endre den for hver distribusjon. Denne eiendommen er tilgjengelig via @Verdi kommentar:

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

Vi overfører deretter denne verdien til a FileTemplateResolver, i stedet for ClassLoaderTemplateResolver i vår thymeleafTemplateResolver metode:

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

3.3. Konfigurer Thymeleaf Engine

Det siste trinnet er å lage fabrikkmetoden for Thymeleaf-motoren. Vi må fortelle motoren hvilken MalResolver vi har valgt, som vi kan injisere via en parameter til bønnefabrikkens metode:

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

Her injiseres løseren vi opprettet tidligere automatisk av Spring i malmotorfabrikkmetoden.

4. FreeMarker-konfigurasjon

På samme måte som Thymeleaf, i E-postkonfigurasjon klasse, konfigurerer vi maloppløseren for FreeMarker-maler (.ftl):

Og denne gangen, malenes plassering vil bli konfigurert i FreeMarkerConfigurer bønne.

4.1. Maler i Classpath

Her har vi de samme alternativene som for Thymeleaf. La oss konfigurere maler som classpath-ressurser:

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

4.2. Maler på filsystemet

For å konfigurere maler fra en annen bane i filsystemet, må vi erstatte TemplateLoader forekomst:

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

5. Lokalisering med Thymeleaf og FreeMarker

For å håndtere oversettelser med Thymeleaf, kan vi spesifiser en MessageSource eksempel til motoren:

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

Deretter oppretter vi ressurspakker for hvert sted vi støtter:

src / main / resources / mailMessages_xx_YY.properties

Som FreeMarker foreslår lokalisering ved å duplisere malene, vi trenger ikke å konfigurere meldingskilden der.

6. Innhold på malerbladene

La oss ta en titt på mal-thymeleaf.html fil:

Som vi kan se, har vi brukt Thymeleaf-notasjon, det vil si ${…} for variabler og #{…} for lokaliserte strenger.

Ettersom malmotoren er riktig konfigurert, er det veldig enkelt å bruke den: Vi lager bare en Kontekst objekt som inneholder malvariabler (bestått som en Kart her).

Så sender vi det til prosess metode sammen med malnavnet:

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

La oss nå se hvordan du gjør det samme med FreeMarker.

7. Innhold for FreeMarker-maler

Som man kan se, er FreeMarkers syntaks enklere, men igjen klarer den ikke lokaliserte strenger. Så her er den engelske versjonen:

Hei $ {mottakernavn}

$ {text}

Hilsen,

$ {senderName} i Baeldung

Så bør vi bruke FreeMarkerConfigurer klasse for å få malfilen, og til slutt, FreeMarkerTemplateUtils å injisere data fra vår Kart:

@Autowired private 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 å gå videre, ser vi hvordan du legger til en logo i e-signaturen vår.

8. E-post med innebygde bilder

Siden det er veldig vanlig å inkludere bilder i en HTML-e-post, ser vi hvordan du gjør dette ved hjelp av et CID-vedlegg.

Den første endringen gjelder sendHtmlMessage metode. Vi må stille MimeMessageHelper som flerdelt ved å passere ekte til konstruktørens andre argument:

MimeMessageHelper helper = ny MimeMessageHelper (melding, sann, "UTF-8");

Deretter må vi få bildefilen som en ressurs. Vi kan bruke @Verdi kommentar for dette:

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

Legg merke til at mail-logo.png filen er i src / main / resources katalog.

Tilbake til sendHtmlMessage metode, vil vi legge til resourceFile som et innebygd vedlegg, for å kunne referere til det med CID:

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

Til slutt, bildet må refereres fra både Thymeleaf og FreeMarker e-post ved bruk av CID-notasjon:

9. Konklusjon

I denne artikkelen har vi sett hvordan du sender e-post fra Thymeleaf og FreeMarker, inkludert rikt HTML-innhold.

Avslutningsvis er det meste av arbeidet knyttet til våren; derfor, bruken av den ene eller den andre er ganske lik for et enkelt behov som å sende e-post.

Som alltid kan hele kildekoden til eksemplene finnes på GitHub.


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