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.