ส่ง email ด้วย Spring Email + Thymeleaf

Phayao Boonon
3 min readFeb 4, 2020

--

Photo by Muukii on Unsplash

หลากหลาย 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
- writing
Regards,
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 จะยืดหยุ่นที่สุด

--

--

Phayao Boonon

Software Engineer 👨🏻‍💻 Stay Hungry Stay Foolish