שימוש בתבניות אימיילים של ThymeLeaf ו- FreeMarker עם Spring

1. סקירה כללית

במאמר הקודם ראינו כיצד להשתמש באביב כדי לכתוב ולשלוח מיילים לטקסט.

אבל אפשר גם השתמש במנועי תבנית אביב כדי לכתוב מיילים יפים ב- HTML עם תוכן דינמי.

במדריך זה נלמד כיצד לעשות זאת באמצעות המפורסמים שבהם: Thymeleaf ו- FreeMarker.

2. דוא"ל HTML באביב

נתחיל מההדרכה של דוא"ל אביב.

ראשית, נוסיף שיטה ל- EmailServiceImpl כיתה לשליחת אימיילים עם גוף HTML:

חלל פרטי sendHtmlMessage (מחרוזת אל, נושא מחרוזת, מחרוזת htmlBody) זורק את MessagingException {MimeMessage message = emailSender.createMimeMessage (); עוזר MimeMessageHelper = MimeMessageHelper חדש (הודעה, נכון, "UTF-8"); helper.setTo (to); helper.setSubject (נושא); helper.setText (htmlBody, נכון); emailSender.send (הודעה); }

אנחנו משתמשים MimeMessageHelper כדי לאכלס את המסר. החלק החשוב הוא ה נָכוֹן ערך שהועבר ל setText שיטה: הוא מציין את סוג תוכן ה- HTML.

בואו נראה עכשיו איך לבנות את זה htmlBody באמצעות תבניות Thymeleaf ו- FreeMarker.

3. תצורת Thymeleaf

נתחיל בתצורה. אנו יכולים לבודד זאת בשיעור שנקרא תצורת אימייל.

ראשית, עלינו ספק פותר תבניות לאיתור ספריית קבצי התבנית.

3.1. תבניות כמשאבי מסלול

ניתן לשלוח קבצי תבנית בתוך קובץ ה- JAR, שהיא הדרך הפשוטה ביותר לשמור על לכידות בין תבניות ונתוני הקלט שלהן.

כדי לאתר תבניות מה- JAR, אנו משתמשים ב- ClassLoaderTemplateResolver. התבניות שלנו נמצאות ב ראשי / משאבים / תבניות דואר הספריה, אז הגדרנו את קידומת תכונה יחסית ל מַשׁאָב מַדרִיך:

@Bean ITemplateResolver הציבור thymeleafTemplateResolver () {ClassLoaderTemplateResolver templateResolver = חדש ClassLoaderTemplateResolver (); templateResolver.setPrefix ("תבניות דואר /"); templateResolver.setSuffix (". html"); templateResolver.setTemplateMode ("HTML"); templateResolver.setCharacterEncoding ("UTF-8"); תבנית החזרה Resolver; }

3.2. תבניות ממדריך חיצוני

במקרים אחרים, ייתכן שנרצה לשנות תבניות מבלי שנצטרך לבנות מחדש ולפרוס אותן. כדי להשיג זאת, נוכל לשים את התבניות במערכת הקבצים במקום.

יכול להיות שימושי להגדיר נתיב זה ב application.properties כדי שנוכל לשנות אותו לכל פריסה. ניתן לגשת לנכס זה באמצעות @ערך ביאור:

@Value ("$ {spring.mail.templates.path}") מחרוזת פרטית mailTemplatesPath;

לאחר מכן אנו מעבירים ערך זה ל- a FileTemplateResolver, במקום ה ClassLoaderTemplateResolver בשלנו thymeleafTemplateResolver שיטה:

FileTemplateResolver templateResolver = FileTemplateResolver חדש (); templateResolver.setPrefix (mailTemplatesPath);

3.3. הגדר את מנוע ה- Thymeleaf

השלב האחרון הוא ליצור את שיטת המפעל עבור מנוע Thymeleaf. נצטרך לומר למנוע איזה TemplateResolver בחרנו, שנוכל להזריק באמצעות פרמטר לשיטת מפעל השעועית:

@Bean ציבורי SpringTemplateEngine thymeleafTemplateEngine (ITemplateResolver templateResolver) {SpringTemplateEngine templateEngine = new SpringTemplateEngine (); templateEngine.setTemplateResolver (templateResolver); templateEngine.setTemplateEngineMessageSource (emailMessageSource ()); תבנית החזרה מנוע; }

הנה, הרזולבר שיצרנו קודם מוזרק אוטומטית על ידי Spring לשיטת מפעל המנועים.

4. תצורת FreeMarker

באותו אופן כמו Thymeleaf, ב- תצורת אימייל בכיתה, נגדיר את פותר תבניות לתבניות FreeMarker (.ftl):

והפעם, מיקום התבניות יוגדר ב FreeMarkerConfigurer אפונה.

4.1. תבניות בשביל הכיתה

הנה, יש לנו אותן אפשרויות כמו עבור Thymeleaf. בואו להגדיר תבניות כמשאבי מסלול:

@Bean ציבורי FreeMarkerConfigurer freemarkerClassLoaderConfig () {תצורת תצורה = תצורה חדשה (תצורה.VERSION_2_3_27); TemplateLoader templateLoader = ClassTemplateLoader חדש (this.getClass (), "/ תבניות דואר"); configuration.setTemplateLoader (templateLoader); FreeMarkerConfigurer freeMarkerConfigurer = FreeMarkerConfigurer חדש (); freeMarkerConfigurer.setConfiguration (תצורה); החזר freeMarkerConfigurer; }

4.2. תבניות במערכת הקבצים

כדי להגדיר תבניות מנתיב אחר במערכת הקבצים, נצטרך להחליף את TemplateLoader למשל:

TemplateLoader templateLoader = FileTemplateLoader חדש (קובץ חדש (mailTemplatesPath));

5. לוקליזציה עם Thymeleaf ו- FreeMarker

על מנת לנהל תרגומים באמצעות Thymeleaf, אנו יכולים ציין a MessageSource מופע למנוע:

@Bean ציבור ResourceBundleMessageSource emailMessageSource () {ResourceBundleMessageSource messageSource = חדש ResourceBundleMessageSource (); messageSource.setBasename ("mailMessages"); return messageSource; }
@Bean ציבורי SpringTemplateEngine thymeleafTemplateEngine () {... templateEngine.setTemplateEngineMessageSource (emailMessageSource ()); ...}

לאחר מכן, אנו יוצרים חבילות משאבים לכל אזור שאנו תומכים בו:

src / main / resources / mailMessages_xx_YY.properties

כפי ש FreeMarker מציע לוקליזציה על ידי שכפול התבניות, אנחנו לא צריכים להגדיר שם את מקור ההודעה.

6. תוכן תבניות של טימילף

לאחר מכן, בואו נסתכל על ה- תבנית- thymeleaf.html קוֹבֶץ:

כפי שניתן לראות, השתמשנו בסימון Thymeleaf, כלומר, ${…} עבור משתנים ו #{…} עבור מיתרים מקומיים.

מאחר שמנוע התבנית מוגדר כראוי, פשוט מאוד להשתמש בו: פשוט ניצור הֶקשֵׁר אובייקט המכיל משתני תבנית (עבר כ מַפָּה פה).

ואז נעביר את זה ל תהליך שיטה יחד עם שם התבנית:

@ אוטומטית פרטית SpringTemplateEngine thymeleafTemplateEngine; @Override public void sendMessageUsingThymeleafTemplate (String to, String subject, Map templateModel) זורק MessagingException {Context thymeleafContext = Context new (); thymeleafContext.setVariables (templateModel); מחרוזת htmlBody = thymeleafTemplateEngine.process ("תבנית- thymeleaf.html", thymeleafContext); sendHtmlMessage (אל, נושא, htmlBody); }

עכשיו, בואו נראה איך לעשות את אותו הדבר עם FreeMarker.

7. תוכן תבניות FreeMarker

כפי שניתן לראות, התחביר של FreeMarker פשוט יותר, אך שוב הוא אינו מנהל מחרוזות מקומיות. אז הנה הגרסה האנגלית:

שלום $ {recipientName}

$ {text}

בברכה,

$ {senderName} בביילדונג

לאחר מכן, עלינו להשתמש ב- FreeMarkerConfigurer בכיתה כדי לקבל את קובץ התבנית, ולבסוף, FreeMarkerTemplateUtils להזריק נתונים מאתנו מַפָּה:

@Autowired פרטי FreeMarkerConfigurer freemarkerConfigurer; @Override public void sendMessageUsingFreemarkerTemplate (String to, String subject, Map templateModel) זורק IOException, TemplateException, MessagingException {Template freemarkerTemplate = freemarkerConfigurer.getConfiguration () .getTemplate ("template-freemarker.ftl"); מחרוזת htmlBody = FreeMarkerTemplateUtils.processTemplateIntoString (freemarkerTemplate, templateModel); sendHtmlMessage (אל, נושא, htmlBody); }

להמשך הדרך, נראה כיצד להוסיף לוגו לחתימת הדוא"ל שלנו.

8. אימיילים עם תמונות משובצות

מכיוון שמקובל מאוד לכלול תמונות במייל HTML, נראה כיצד לעשות זאת באמצעות קובץ מצורף של CID.

השינוי הראשון נוגע ל sendHtmlMessage שיטה. עלינו לקבוע MimeMessageHelper כרב חלקים על ידי מעבר נָכוֹן לטענה השנייה של הקונסטרוקטור:

עוזר MimeMessageHelper = MimeMessageHelper חדש (הודעה, נכון, "UTF-8");

לאחר מכן, עלינו לקבל את קובץ התמונה כמשאב. אנחנו יכולים להשתמש ב- @ערך ביאור לכך:

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

שימו לב שה- mail-logo.png הקובץ נמצא ב- src / main / resources מַדרִיך.

בחזרה ל sendHtmlMessage שיטה, אנחנו לְהוֹסִיף resourceFile כקובץ מצורף מוטבע, כדי להיות מסוגל להתייחס אליו באמצעות CID:

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

סוף - סוף, ה יש להפנות לתמונה הן מדוא"ל של Thymeleaf והן מ- FreeMarker באמצעות סימון CID:

9. מסקנה

במאמר זה ראינו כיצד לשלוח הודעות דוא"ל של Thymeleaf ו- FreeMarker, כולל תוכן HTML עשיר.

לסיום, רוב העבודה קשורה לאביב; לָכֵן, השימוש בזה או אחר דומה למדי לצורך פשוט כמו למשל שליחת מיילים.

כמו תמיד, ניתן למצוא את קוד המקור המלא של הדוגמאות ב- GitHub.


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