ส่ง email ด้วย Spring Email + Thymeleaf
หลากหลาย Application Service จะต้องมีการส่งอีเมล์ (Email) โดยระบบอัตโนมัตเพื่อแจ้งให้ User ทราบเกี่ยวกับบางสิ่งบางอย่าง ดังนั้น Developer ก็จะต้องสร้างระบบที่ส่งอีเมล์ได้ และมีรูปแบบที่หลากความหลากหลาย ซึ่ง Spring framework ก็ได้มีเครื่องมือให้ Developer ได้ใช้งาน นั้นคือ Spring Email ที่เพิ่มเติมจาก Java Mail จะทำให้เราสร้างระบบที่ส่งอีเมล์ได้ และผนวกเข้ากับพลังของ Template Engine อย่าง Thymeleaf ที่ Spring Developer คุ้นเคยก็ทำให้เราสร้างระบบที่ส่งอีเมล์ได้ที่สมบูรณ์ยิ่งขึ้น
ในบทความนี้จึงจะมาลองสร้าง RESTful Service ที่ส่งอีเมล์ได้ ด้วย Spring Boot + Spring Email + Thymleaf กัน
Create Project
เราจะใช้ start.spring.io ในการสร้าง project โดยเลือก dependency เป็น Spring Web
, Java Mail Sender
และ Thymeleaf
หลังจากที่ generate project แล้วก็ใช้ IDE อย่าง IntelliJ เปิด project
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
....
</dependencies>
ใน pom.xml
จะเห็นได้ว่ามี dependency spring-boot-starter-mail
สำหรับ Spring Email และ spring-boot-starter-thymeleaf
สำหรับ Thymeleaf
Email Config
หลังจากสร้าง project แล้ว สำหรับการส่งเมล์จะต้องสร้าง configuration สำหรับ Java Mail Sender ของ Spring Email ซึ่งสามารถทำได้ 2 แบบคือ
Java Config
ใช้ JavaMailSenderImpl สำหรับกำหนดค่าต่างๆ ของ SMTP ซึ่งในที่นี้ใช้ SMTP ของ Gmail จำเป็นต้องตั้งค่า password จาก App Passwords และกำหนด properties ต่างๆ ที่จำเป็น mail.smtp.auth
และ mail.smtp.starttls.enable
Properties Config
Email Template
ในบทความนี้จะสร้างระบบส่งอีเมล์ที่ส่งอีเมล์สำหรับ สมัครสมาชิก (Subscription) ซึ่งจะมีข้อความของ email ดังนี้
Hi John DoeYou have been successfully subscribed to the Hello newsletter on 2020-02-04Your hobbies are:
- reading
- writingRegards,
Hello Team
ดังนั้นสามารถสร้าง template สำหรับ Thymeleaf template engine ได้ เพื่อที่จะรับข้อมูลต่างๆ มาสร้างเป็นข้อความของอีเมล์
โดยที่ข้อมูลจะประกอบด้วย greeting
เป็นข้อความทักทาย date
เป็นวันที่ที่สมัคร และรายการของ hobbies
เป็นงานอดิเรกของผู้สมัคร และ save เป็นชื่อของ template ไว้ใน resources/templates
email-subscription.html เพื่อใช้สำหรับสร้างข้อความของอีเมล์
Email Service
สร้าง Email service สำหรับกำหนดข้อมูลต่างๆ ให้กับ Thymeleaf template และส่งอีเมล์ให้ผู้รับ โดยที่ inject JavaMailSender
ที่ได้จาก Email configuration และ TemplateEngine
ที่ได้จาก auto configuration ของ Spring Boot
ซึ่งมี method send
ที่รับค่า name
, email
และ hobbies
มาสร้างเป็นข้อความและส่งอีเมล์ โดยเริ่มแรกจะต้องสร้าง Context
ของ Thymeleaf ด้วยค่าพารามิเตอร์ ที่จะนำไปประมวลผลใน Template Engine ด้วย template ให้เป็นข้อความอีเมล์
และสร้าง MimeMessage
จาก JavaMailSender
โดยระบุชื่อของอีเมล์ และที่อยู่อีเมล์ที่ต้องการส่งไปถึง
Controller/Service
เนื่องจากบทความนี้จะสร้าง RESTful Web Service ง่ายๆ โดยที่ 1 endpoint ที่รับค่าจาก User และส่งเมล์ไปหาตามที่อยู่อีเมล์ที่ระบุมา โดยใช้ Email Service
และ Subscription Service ที่เรียกใช้ Email Service
DTO ของ Subscription เพื่อรับค่าจาก Request Body
TEST
หลังจากที่สร้าง RESTful Web Service เรียบร้อยก็ run ด้วยคำสั่ง mvn spring-boot:run
แล้วก็ใช้ POSTMAN ในการทดสอบ endpoint ว่าหลังจากเรียกไปแล้วจะส่งอีเมล์ไปหาอีเมล์ที่ระบุไว้ใน Body หรือไม่
เมื่อส่ง request ไปที่ /subscriptions
endpoint และได้รับ response กลับมาก็ตรวจดูใน email inbox ก็จะเห็นว่าอีเมล์ถูกส่งมาตามข้อมูลที่ระบุใน request body
สรุป
จากการได้ทดลองใช้ Spring Email มาส่งเมล์นั้นทำได้ไม่ยาก และด้วยการใช้ template engine อย่าง Thymeleaf มาช่วยสร้างข้อความอีเมล์ก็ทำให้เราสามารถสร้างระบบที่ส่งอีเมล์ได้อย่าง dynamic ตามข้อมูลต่างๆ กันได้ แต่ Thymeleaf ยังสามารถประมวลผล template ที่เป็นข้อความ (Text) อย่างเดียวได้ ซึ่งจะต้องกำหนด Template Resovlver ขึ้นมาเองและใช้ Text Mode ซึ่งจะไม่ต้องยุ่งยากกับ tag HTML แต่ก็มีข้อจำกัดมาก ซึ่งการใช้ HTML Mode จะยืดหยุ่นที่สุด