ํ๋ฆฌ๋ง์ปค ํ ํ๋ฆฟ์ผ๋ก ์ด๋ฉ์ผ ๋ฐ์กํ๊ธฐ
ํ์ฌ ์กฐ์ง์์๋ ์คํ๋ง ๋ถํธ์ ๊ธฐ๋ณธ ํ ํ๋ฆฟ ์์ง์ธ ํ์๋ฆฌํ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์ด๋ฉ์ผ ๋ฐ์ก์๋ ํ๋ฆฌ๋ง์ปค ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํด์ ๋ณํํ HTML ํ์์ ์ด๋ฉ์ผ์ ์ ๋ฌํฉ๋๋ค.
ํ๋ฆฌ๋ง์ปค ํ ํ๋ฆฟ ์์ง
์ผ๋ฐ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ ํ ํ๋ฆฟ ์์ง์ ํ์๋ฆฌํ์ด๊ธฐ๋ ํ์ง๋ง ์ฌ์ฉํ๊ธฐ ์ด๋ ค์ด ๋ฌธ๋ฒ๊ณผ ๋ค๋ฅธ ํ ํ๋ฆฟ ์์ง๊ณผ์ ๋ ๋๋ง ์ฑ๋ฅ ๋ฌธ์ ๋ก ์ธํ์ฌ ์ด๋ฉ์ผ ๋ฐ์ก์ฒ๋ผ ๋๋์ผ๋ก ๋ ๋๋งํ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ฉด FreeMarker ๋๋ Mustache ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ๋ฆฌ๋ง์ปค ์คํํฐ
์คํ๋ง ๋ถํธ ํ๋ฆฌ๋ง์ปค ์คํํฐ ์์กด์ฑ์ ํตํด ํ๋ฆฌ๋ง์ปค ํ ํ๋ฆฟ์ผ๋ก ์ด๋ฉ์ผ์ ๋ฐ์กํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ฐธ์กฐํฉ๋๋ค.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-freemarker'
implementation 'org.springframework.boot:spring-boot-starter-mail'
}
SMTP ๋ฉ์ผ ์๋ฒ
์ด๋ฉ์ผ์ ๋ฐ์กํ๊ธฐ ์ํด์๋ SMTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ ๋ฉ์ผ ์๋ฒ๊ฐ ํ์ํฉ๋๋ค. ๋ง์ ๋ฌด๋ฃ ๋ฉ์ผ ์๋ฒ ์๋ฃจ์ ์ด ์์ผ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ ๊ตฌ๊ธ์ด๋ ๋ค์ด๋ฒ ์ด๋ฉ์ผ ๊ณ์ ์ ๋ช๊ฐ์ง ์ค์ ์ ํตํด์ SMTP ๋ฉ์ผ ์๋ฒ๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
Gmail SMTP
์ง๋ฉ์ผ ๊ณ์ ์ผ๋ก ๋ฐ์ ๋ฉ์ผ ์๋ฒ๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ์ธ์ฆ ์ต์ ๊ณผ ํจ๊ป SSL(465) ๋๋ TLS(587)์ฉ ํฌํธ๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
spring.mail.protocol=smtp
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=username@gmail.com
spring.mail.password=password
spring.mail.properties.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.test-connection=true
์ง๋ฉ์ผ ๊ณ์ ์ธ์ฆ ์ค๋ฅ
๋ฉ์ผ ์๋ฒ ์ฐ๊ฒฐ ์ ๋ค์๊ณผ ๊ฐ์ด ์ธ์ฆ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋ณด์ ์์ค์ด ๋ฎ์ ์ฑ์ ์ก์ธ์ค๋ฅผ ํ์ฉํด์ผํฉ๋๋ค.
Caused by: java.lang.IllegalStateException: Mail server is not available
...
Caused by: javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted. Learn more at
๋ณด์ ์ ์ฑ ๋ณ๊ฒฝ์ ๋ฐ๋ผ 2022๋ 5์ 30์ผ๋ถํฐ๋ ์ง๋ฉ์ผ ๊ณ์ ์ผ๋ก SMTP ์๋ฒ๋ฅผ ์ด์ฉํ ์ ์์ ์ ์์ต๋๋ค.
์๋ฐ ์ด๋ฉ์ผ ๋ฐ์ก
์ง๋ฉ์ผ ๊ณ์ ์ผ๋ก SMTP ์๋ฒ์ ์ธ์ฆ๊น์ง ์๋ฃํ๋ค๋ฉด ์ค์ ๋ก ์ด๋ฉ์ผ์ ๋ฐ์กํ ์ ์๋์ง ํ ์คํธ ํด๋ณด์์ผ ํฉ๋๋ค.
@SpringBootTest
class GmailSmtpTests {
@Autowired
private JavaMailSenderImpl javaMailSender;
@Test
void sendMail() {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, StandardCharsets.UTF_8.name());
mimeMessageHelper.setFrom("Mambo <kdevkr.gmail.com>");
mimeMessageHelper.setTo("kdevkr@gmail.com");
mimeMessageHelper.setSubject("Java Mail Test");
mimeMessageHelper.setText("<h5>Hello World</h5>", true);
javaMailSender.send(mimeMessage);
}
}
ํ๋ฆฌ๋ง์ปค ํ ํ๋ฆฟ ์ ์ฉํ๊ธฐ
ํ๋ฆฌ๋ง์ปค ํ ํ๋ฆฟ ํ์ผ์ ์์ฑํ๊ณ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํด์ HTML ํ์์ ๋ฌธ์์ด์ ์ด๋ฉ์ผ ๋ด์ฉ์ผ๋ก ์ ๋ฌํ์ฌ ๋ฐ์กํ๋๋ก ๊ตฌํํ๋ฉด ๋ฉ๋๋ค. ์ ๋ HTML Email Template ๋ง๋ค๊ธฐ๋ผ๋ ๊ธ์ ์ฐธ๊ณ ํ์ฌ ํ ํ๋ฆฟ์ ์์ฑํ์์ต๋๋ค.
@SpringBootTest
class GmailSmtpTests {
@Autowired
private JavaMailSenderImpl javaMailSender;
@Autowired
private FreeMarkerConfigurationFactoryBean configurationFactoryBean;
@Test
void sendMail() {
Configuration configuration = configurationFactoryBean.createConfiguration();
Template template = configuration.getTemplate("email.ftlh");
Map<String, Object> model = new HashMap<>();
model.put("title", "Java Mail Test");
model.put("content", "Hello World");
String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, StandardCharsets.UTF_8.name());
mimeMessageHelper.setFrom("Mambo <kdevkr.gmail.com>");
mimeMessageHelper.setTo("kdevkr@gmail.com");
mimeMessageHelper.setSubject("Java Mail Test with FreeMarker");
mimeMessageHelper.setText(content, true);
javaMailSender.send(mimeMessage);
}
}
๊ธฐ๋ณธ ํ๋ฆฌ๋ง์ปค ํ ํ๋ฆฟ ํด๋๋ ํด๋์คํจ์ค์ templates ์ ๋๋ค.
spring.freemarker.template-loader-path=classpath:/templates/
๊ฐ์ฌํฉ๋๋ค.