ThymeLeaf és FreeMarker e-mail sablonok használata tavasszal
1. Áttekintés
Korábbi cikkünkben láttuk, hogyan használhatjuk a Spring-et szöveges e-mailek írására és küldésére.
De az is lehetséges a Spring sablonmotorokkal gyönyörű HTML dinamikus tartalmú e-maileket írhat.
Ebben az oktatóanyagban megtanuljuk, hogyan kell csinálni a leghíresebb közülük: Thymeleaf és FreeMarker.
2. Tavaszi HTML-levelek
Kezdjük a tavaszi e-mail oktatóanyaggal.
Először hozzáadunk egy metódust a EmailServiceImpl osztály HTML-törzsű e-mailek küldéséhez:
private void sendHtmlMessage (String to, String subject, String htmlBody) dobja a MessagingException {MimeMessage message = emailSender.createMimeMessage (); MimeMessageHelper helper = új MimeMessageHelper (üzenet, igaz, "UTF-8"); helper.setTo (to); helper.setSubject (tárgy); helper.setText (htmlBody, true); emailSender.send (üzenet); }
Használjuk MimeMessageHelper hogy feltöltse az üzenetet. Fontos része a igaz érték átadva a setText metódus: megadja a HTML tartalom típusát.
Most nézzük meg, hogyan lehet ezt felépíteni htmlBody Thymeleaf és FreeMarker sablonok használatával.
3. Thymeleaf konfiguráció
Kezdjük a konfigurációval. Ezt el tudjuk különíteni egy úgynevezett osztályban EmailConfiguration.
Először kellene adjon meg egy sablonmegoldót a sablonfájlok könyvtárának megkereséséhez.
3.1. Sablonok Classpath erőforrásokként
A sablonfájlok a JAR fájlba szállíthatók, amely a sablonok és a bemeneti adatok közötti kohézió fenntartásának legegyszerűbb módja.
A sablonok megkereséséhez a JAR-ból a ClassLoaderTemplateResolver. Sablonjaink a main / resources / mail-templates könyvtárat, ezért beállítottuk a Előtag attribútum a forrás Könyvtár:
@Bean public ITemplateResolver thymeleafTemplateResolver () {ClassLoaderTemplateResolver templateResolver = új ClassLoaderTemplateResolver (); templateResolver.setPrefix ("mail-templates /"); templateResolver.setSuffix (". html"); templateResolver.setTemplateMode ("HTML"); templateResolver.setCharacterEncoding ("UTF-8"); return templateResolver; }
3.2. Sablonok a külső könyvtárból
Más esetekben esetleg módosítani szeretnénk a sablonokat anélkül, hogy újjá kellene építeni és telepíteni kellene. Ennek érdekében helyettesíthetjük a sablonokat a fájlrendszeren.
Hasznos lehet konfigurálni ezt az elérési utat itt: alkalmazás.tulajdonságok hogy minden egyes telepítéshez módosítani tudjuk. Ez a tulajdonság a @Érték kommentár:
@Value ("$ {spring.mail.templates.path}") privát karakterlánc mailTemplatesPath;
Ezután ezt az értéket átadjuk a FileTemplateResolver, a ClassLoaderTemplateResolver miénkben thymeleafTemplateResolver módszer:
FileTemplateResolver templateResolver = új FileTemplateResolver (); templateResolver.setPrefix (mailTemplatesPath);
3.3. Konfigurálja a Thymeleaf motort
Az utolsó lépés a Thymeleaf motor gyári módszerének létrehozása. Meg kell mondanunk a motornak, hogy melyik TemplateResolver választottuk, amelyet egy paraméteren keresztül be tudunk injektálni a babgyár módszerébe:
@Bean public SpringTemplateEngine thymeleafTemplateEngine (ITemplateResolver templateResolver) {SpringTemplateEngine templateEngine = új SpringTemplateEngine (); templateEngine.setTemplateResolver (templateResolver); templateEngine.setTemplateEngineMessageSource (emailMessageSource ()); return templateEngine; }
Itt a korábban létrehozott felbontót Spring automatikusan befecskendezi a sablonmotor gyári módszerébe.
4. FreeMarker konfiguráció
Ugyanúgy, mint Thymeleaf, a EmailConfiguration osztályban konfiguráljuk a sablonfeloldó a FreeMarker sablonokhoz (.ftl):
És ezúttal a sablonok helyét a FreeMarkerConfigurer bab.
4.1. Sablonok a Classpath-ban
Itt ugyanazok a lehetőségek állnak rendelkezésünkre, mint a Thymeleaf esetében. Konfiguráljuk a sablonokat classpath erőforrásokként:
@Bean public FreeMarkerConfigurer freemarkerClassLoaderConfig () {Configuration configuration = new Configuration (Configuration.VERSION_2_3_27); TemplateLoader templateLoader = new ClassTemplateLoader (this.getClass (), "/ mail-templates"); configuration.setTemplateLoader (templateLoader); FreeMarkerConfigurer freeMarkerConfigurer = új FreeMarkerConfigurer (); freeMarkerConfigurer.setConfiguration (konfiguráció); visszatérés freeMarkerConfigurer; }
4.2. Sablonok a fájlrendszeren
A fájlrendszer egy másik útvonaláról a sablonok konfigurálásához le kell cserélnünk a TemplateLoader példa:
TemplateLoader templateLoader = új FileTemplateLoader (új File (mailTemplatesPath));
5. Lokalizálás a Thymeleaf és a FreeMarker segítségével
A Thymeleaf segítségével történő fordítások kezelése érdekében megtehetjük adja meg a MessageSource például a motorhoz:
@Bean public ResourceBundleMessageSource emailMessageSource () {ResourceBundleMessageSource messageSource = új ResourceBundleMessageSource (); messageSource.setBasename ("mailMessages"); return messageSource; }
@Bean public SpringTemplateEngine thymeleafTemplateEngine () {... templateEngine.setTemplateEngineMessageSource (emailMessageSource ()); ...}
Ezután létrehoznánk erőforráscsomagokat minden támogatott területi beállításhoz:
src / main / resources / mailMessages_xx_YY.properties
Mint A FreeMarker a sablonok másolásával javasolja a lokalizációt, ott nem kell konfigurálnunk az üzenet forrását.
6. Thymeleaf sablonok tartalma
Ezután vessünk egy pillantást a template-thymeleaf.html fájl:
Mint látható, a Thymeleaf jelölést használtuk, ${…} változókra és #{…} lokalizált húrokhoz.
Mivel a sablonmotor megfelelően van konfigurálva, nagyon egyszerű használni: Csak létrehozunk egy Kontextus objektum, amely sablonváltozókat tartalmaz (mint a Térkép itt).
Aztán átadjuk a folyamat módszer a sablon nevével együtt:
@Autowired private SpringTemplateEngine thymeleafTemplateEngine; @Orride public void sendMessageUsingThymeleafTemplate (String to, String subject, Map templateModel) dobja a MessagingException {Context thymeleafContext = new Context (); thymeleafContext.setVariables (templateModel); Karakterlánc htmlBody = thymeleafTemplateEngine.process ("template-thymeleaf.html", thymeleafContext); sendHtmlMessage (to, subject, htmlBody); }
Most nézzük meg, hogyan lehet ugyanezt csinálni a FreeMarkerrel.
7. FreeMarker sablonok tartalma
Mint látható, a FreeMarker szintaxisa egyszerűbb, de ismét nem kezeli a lokalizált karakterláncokat. Tehát íme az angol változat:
Szia $ {recipientName}
$ {text}
Üdvözlettel,
$ {senderName} a Baeldungnál
Akkor használnunk kell a FreeMarkerConfigurer osztály, hogy megszerezzék a sablonfájlt, végül FreeMarkerTemplateUtils hogy beinjekciózzuk az adatainkat Térkép:
@Autowired privát FreeMarkerConfigurer freemarkerConfigurer; @Orride public void sendMessageUsingFreemarkerTemplate (String to, String subject, Map templateModel) IOException, TemplateException, MessagingException {Template freemarkerTemplate = freemarkerConfigurer.getConfiguration () .getTemplate ("sablon; String htmlBody = FreeMarkerTemplateUtils.processTemplateIntoString (freemarkerTemplate, templateModel); sendHtmlMessage (to, subject, htmlBody); }
A továbblépéshez meglátjuk, hogyan adhatunk hozzá logót az e-mail aláírásunkhoz.
8. Beágyazott képekkel ellátott e-mailek
Mivel nagyon általános a képek HTML-e-mailbe történő beillesztése, megtudjuk, hogyan lehet ezt megtenni egy CID-melléklet segítségével.
Az első változás a sendHtmlMessage módszer. Be kell állítanunk MimeMessageHelper mint többrészes elhaladással igaz a konstruktor második érvére:
MimeMessageHelper helper = új MimeMessageHelper (üzenet, igaz, "UTF-8");
Ezután meg kell szereznünk a képfájlt erőforrásként. Használhatjuk a @Érték kommentár ehhez:
@Value ("classpath: /mail-logo.png") Resource resourceFile;
Figyeljük meg, hogy a mail-logo.png fájl a src / main / resources Könyvtár.
Vissza a sendHtmlMessage módszer hozzá resourceFile inline mellékletként, hogy hivatkozhasson rá CID-vel:
helper.addInline ("attachment.png", resourceFile);
Végül a A képre mind a Thymeleaf, mind a FreeMarker e-mailekből hivatkozni kell CID jelöléssel:
9. Következtetés
Ebben a cikkben azt láttuk, hogyan küldhetünk Thymeleaf és FreeMarker e-maileket, beleértve a gazdag HTML tartalmat is.
Befejezésül: a munka nagy része tavaszhoz kapcsolódik; ebből kifolyólag, az egyik vagy másik használata meglehetősen hasonló egy egyszerű igényhez, például e-mail küldéshez.
Mint mindig, a példák teljes forráskódja megtalálható a GitHub oldalon.