ThymeLeaf en FreeMarker e-mailsjablonen gebruiken met Spring

1. Overzicht

In ons vorige artikel hebben we gezien hoe we Spring kunnen gebruiken om tekst-e-mails te schrijven en te verzenden.

Maar het is ook mogelijk gebruik Spring-sjabloonengines om prachtige HTML-e-mails met dynamische inhoud te schrijven.

In deze tutorial gaan we leren hoe we dit moeten doen met behulp van de meest bekende: Thymeleaf en FreeMarker.

2. Spring HTML-e-mails

Laten we beginnen met de Spring Email-zelfstudie.

Eerst voegen we een methode toe aan het E-mailserviceImpl klasse om e-mails te verzenden met een HTML-body:

private void sendHtmlMessage (String to, String subject, String htmlBody) gooit MessagingException {MimeMessage message = emailSender.createMimeMessage (); MimeMessageHelper helper = nieuwe MimeMessageHelper (bericht, true, "UTF-8"); helper.setTo (naar); helper.setSubject (onderwerp); helper.setText (htmlBody, true); emailSender.send (bericht); }

We gebruiken MimeMessageHelper om het bericht in te vullen. Het belangrijkste onderdeel is de waar waarde doorgegeven aan de setText methode: het specificeert het HTML-inhoudstype.

Laten we nu kijken hoe we dit kunnen bouwen htmlBody met behulp van Thymeleaf- en FreeMarker-sjablonen.

3. Thymeleaf-configuratie

Laten we beginnen met de configuratie. We kunnen dit isoleren in een klasse met de naam E-mailconfiguratie.

Ten eerste moeten we geef een sjabloonoplosser om de map met sjabloonbestanden te lokaliseren.

3.1. Sjablonen als Classpath-bronnen

Sjabloonbestanden kunnen binnen het JAR-bestand worden verzonden, wat de eenvoudigste manier is om de samenhang tussen sjablonen en hun invoergegevens te behouden.

Om sjablonen uit de JAR te vinden, gebruiken we de ClassLoaderTemplateResolver. Onze sjablonen staan ​​in de main / resources / mail-sjablonen directory, dus stellen we de Voorvoegsel attribuut ten opzichte van het bron directory:

@Bean openbare ITemplateResolver thymeleafTemplateResolver () {ClassLoaderTemplateResolver templateResolver = nieuwe ClassLoaderTemplateResolver (); templateResolver.setPrefix ("mail-sjablonen /"); templateResolver.setSuffix (". html"); templateResolver.setTemplateMode ("HTML"); templateResolver.setCharacterEncoding ("UTF-8"); retourneer templateResolver; }

3.2. Sjablonen uit externe directory

In andere gevallen, we willen misschien sjablonen wijzigen zonder opnieuw te hoeven bouwen en implementeren. Om dit te bereiken, kunnen we de sjablonen in plaats daarvan op het bestandssysteem plaatsen.

Het kan handig zijn om dit pad in application.properties zodat we het voor elke implementatie kunnen aanpassen. Deze eigenschap is toegankelijk via de @Waarde annotatie:

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

We geven deze waarde vervolgens door aan a FileTemplateResolver, in plaats van de ClassLoaderTemplateResolver in onze thymeleafTemplateResolver methode:

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

3.3. Configureer de Thymeleaf Engine

De laatste stap is het maken van de fabrieksmethode voor de Thymeleaf-engine. We zullen de motor moeten vertellen welke TemplateResolver we hebben gekozen, die we via een parameter kunnen injecteren in de bonenfabriekmethode:

@Bean openbare SpringTemplateEngine thymeleafTemplateEngine (ITemplateResolver templateResolver) {SpringTemplateEngine templateEngine = nieuwe SpringTemplateEngine (); templateEngine.setTemplateResolver (templateResolver); templateEngine.setTemplateEngineMessageSource (emailMessageSource ()); retourneer templateEngine; }

Hier wordt de resolver die we eerder hebben gemaakt door Spring automatisch geïnjecteerd in de template engine factory-methode.

4. FreeMarker-configuratie

Op dezelfde manier als Thymeleaf, in de E-mailconfiguratie klasse, we zullen de sjabloonoplosser voor FreeMarker-sjablonen (.ftl):

En deze keer de locatie van de sjablonen wordt geconfigureerd in het FreeMarkerConfigurer Boon.

4.1. Sjablonen in het Classpath

Hier hebben we dezelfde opties als voor Thymeleaf. Laten we sjablonen configureren als bronnen voor klassenpad:

@Bean public FreeMarkerConfigurer freemarkerClassLoaderConfig () {Configuratieconfiguratie = nieuwe configuratie (Configuration.VERSION_2_3_27); TemplateLoader templateLoader = nieuwe ClassTemplateLoader (this.getClass (), "/ mail-templates"); configuration.setTemplateLoader (templateLoader); FreeMarkerConfigurer freeMarkerConfigurer = nieuwe FreeMarkerConfigurer (); freeMarkerConfigurer.setConfiguration (configuratie); retourneer freeMarkerConfigurer; }

4.2. Sjablonen op het bestandssysteem

Om sjablonen van een ander pad in het bestandssysteem te configureren, moeten we de TemplateLoader voorbeeld:

TemplateLoader templateLoader = nieuwe FileTemplateLoader (nieuw bestand (mailTemplatesPath));

5. Lokalisatie met Thymeleaf en FreeMarker

Om vertalingen met Thymeleaf te beheren, kunnen we specificeer een MessageSource instantie naar de motor:

@Bean openbare ResourceBundleMessageSource emailMessageSource () {ResourceBundleMessageSource messageSource = nieuwe ResourceBundleMessageSource (); messageSource.setBasename ("mailMessages"); terug messageSource; }
@Bean openbare SpringTemplateEngine thymeleafTemplateEngine () {... templateEngine.setTemplateEngineMessageSource (emailMessageSource ()); ...}

Vervolgens maken we resourcebundels voor elke landinstelling die we ondersteunen:

src / main / resources / mailMessages_xx_YY.properties

Net zo FreeMarker stelt lokalisatie voor door de sjablonen te dupliceren, hoeven we de berichtbron daar niet te configureren.

6. Thymeleaf-sjablonen Inhoud

Laten we vervolgens eens kijken naar het sjabloon-thymeleaf.html het dossier:

Zoals te zien is, hebben we Thymeleaf-notatie gebruikt, dat wil zeggen, ${…} voor variabelen en #{…} voor gelokaliseerde snaren.

Omdat de sjabloonengine correct is geconfigureerd, is het heel eenvoudig om deze te gebruiken: we maken gewoon een Context object dat sjabloonvariabelen bevat (doorgegeven als een Kaart hier).

Vervolgens geven we het door aan de werkwijze methode samen met de sjabloonnaam:

@Autowired privé SpringTemplateEngine thymeleafTemplateEngine; @Override public void sendMessageUsingThymeleafTemplate (String to, String subject, Map templateModel) gooit MessagingException {Context thymeleafContext = new Context (); thymeleafContext.setVariables (templateModel); String htmlBody = thymeleafTemplateEngine.process ("template-thymeleaf.html", thymeleafContext); sendHtmlMessage (naar, onderwerp, htmlBody); }

Laten we nu eens kijken hoe we hetzelfde kunnen doen met FreeMarker.

7. Inhoud van FreeMarker-sjablonen

Zoals te zien is, is de syntaxis van FreeMarker eenvoudiger, maar nogmaals, het beheert geen gelokaliseerde strings. Dus hier is de Engelse versie:

Hallo $ {recipientName}

$ {tekst}

Vriendelijke groeten,

$ {senderName} bij Baeldung

Dan moeten we de FreeMarkerConfigurer class om het sjabloonbestand te krijgen, en tot slot, FreeMarkerTemplateUtils om gegevens van onze Kaart:

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

Om verder te gaan, zullen we zien hoe we een logo kunnen toevoegen aan onze e-mailhandtekening.

8. E-mails met ingesloten afbeeldingen

Omdat het heel gebruikelijk is om afbeeldingen op te nemen in een HTML-e-mail, zullen we zien hoe u dit kunt doen met behulp van een CID-bijlage.

De eerste wijziging betreft de sendHtmlMessage methode. We moeten gaan MimeMessageHelper als meerdelig door te passeren waar naar het tweede argument van de constructor:

MimeMessageHelper helper = nieuwe MimeMessageHelper (bericht, waar, "UTF-8");

Vervolgens moeten we het afbeeldingsbestand als bron ophalen. We kunnen de @Waarde annotatie hiervoor:

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

Merk op dat de mail-logo.png bestand is in de src / main / resources directory.

Terug naar de sendHtmlMessage methode, zullen we toevoegen resourceFile als een inline-bijlage, om ernaar te kunnen verwijzen met CID:

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

eindelijk, de naar afbeelding moet worden verwezen vanuit zowel Thymeleaf- als FreeMarker-e-mails met behulp van CID-notatie:

9. Conclusie

In dit artikel hebben we gezien hoe u Thymeleaf- en FreeMarker-e-mails kunt verzenden, inclusief rijke HTML-inhoud.

Tot slot: het meeste werk heeft betrekking op de lente; daarom het gebruik van de een of de ander is vrij gelijkaardig voor een eenvoudige behoefte, zoals het verzenden van e-mails.

Zoals altijd is de volledige broncode van de voorbeelden te vinden op GitHub.