μ€νλ§ λμ μ΄λ©μΌ ν νλ¦Ώ
HR μ루μ μΈ κ·Έλ¦¬ν μ²λΌ μ¬μ©μκ° μ§μ μ΄λ©μΌ ν νλ¦Ώμ κ΄λ¦¬νλ 건 μμ€ν μ΄λ μλΉμ€λ§λ€ μꡬμ¬νμ΄ μκΈΈ μ μλ€. 그리ν μ΄λ©μΌμ κ²½μ° λ΄λΆμ μΈ ν νλ¦Ώμ μλΉμ€ μ체μμ κ΄λ¦¬νκ³ ν νλ¦Ώ λ³μλ₯Ό μ 곡νμ¬ μ΄λ©μΌ λ΄μ©λ§ μ λ ₯νλ ꡬμ±μ΄μ§λ§ B2B μλΉμ€(μ루μ )μ κ²½μ° μλΉμ€ μ¬μ μκ° μλ ν΄λΉ μ¬μ μ μ λ³΄λ‘ λ체νκ³ μΆμ κ³ κ°λ€μ΄ μκΈ΄λ€.
μ€νλ§ νλ μμν¬ κΈ°λ°μ μ ν리μΌμ΄μ μμ Thymeleaf, FreeMarker, Mustache μ κ°μ ν νλ¦Ώ μμ§μ μ½κ² μ¬μ©ν μ μμ΄μ μ΄λ©μΌ ν νλ¦Ώμ λ§λ€κ³ 컨ν μ€νΈ μ 보μ ν¨κ» HTMLλ‘ λ³ννμ¬ μ΄λ©μΌλ‘ λ°μ‘νλ 건 Sending email in Spring with Thymeleafμ κ°μ μμ λ 곡μ λμ΄μμ΄ κ΅¬ννλ건 κ°λ¨νλ€. μ¬μ©μκ° μ§μ ν νλ¦Ώμ κ΄λ¦¬νλ λ°©μμ νμ리ν ν νλ¦ΏμΌλ‘ μ΄μΌκΈ°ν΄λ³΄μλ©΄ StringTemplateResolver ν΄λμ€λ₯Ό ν΅ν΄ μλμ κ°μ΄ ν νλ¦Ώ νμΌ κ²½λ‘κ° μλ HTML λ¬Έμμ΄ μμ²΄λ‘ λ³νν μ μλ€.
@Slf4j
@AllArgsConstructor
@Service
public class MailService {
private final MessageSource messageSource;
private SpringTemplateEngine templateEngine;
@PostConstruct
public void init() {
templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(new StringTemplateResolver());
templateEngine.setTemplateEngineMessageSource(messageSource);
}
public String processTemplate(String template, Map<String, Object> variables) {
return processTemplate(template, variables, Locale.getDefault());
}
public String processTemplate(String template, Map<String, Object> variables, Locale locale) {
if (locale == null) {
locale = Locale.getDefault();
}
return templateEngine.process(template, new Context(locale, variables));
}
}
StringTemplateResolver
StringTemplateResolverλ StringTemplateResourceλ₯Ό ν΅ν΄ μΈλΆ νμΌμ΄λ 리μμ€μ μ‘μΈμ€νλκ² μλλΌ λ¬Έμμ΄μ ν νλ¦Ώ μμ²΄λ‘ κ°μ£Όνλ©° κΈ°λ³Έμ μΌλ‘λ μΊμν μ μλ€κ³ μ€μ λλ€. μλμ ν μ€νΈ μ½λλ ν΄λμ€ν¨μ€μ μμΉν λ©μΌ ν νλ¦Ώ μμμ λ¬Έμμ΄λ‘ λ³ννμ¬ μ²λ¦¬ν μ μμμ 보μ¬μ€λ€. μ€μ λ‘λ λ°μ΄ν°λ² μ΄μ€μ μ μ₯λ ν νλ¦Ώμ μ¬μ©νκ² λ κ²μ΄λ€.
@Test
void Test_sendEmail_from_TextTemplate_withHtml() {
Assertions.assertDoesNotThrow(() -> {
ClassPathResource resource = new ClassPathResource("templates/mail/2fa.html");
String html = FileCopyUtils.copyToString(new BufferedReader(new InputStreamReader(resource.getInputStream())));
// String html = """
// <h1>Two-Factor Authentication</h1>
// <h2>Hi, [[${name}]]</h2>
// <p>The two-step authentication code for the login request is as follows.</p>
// <p>Please enter it on the authentication screen within the time limit.</p>
// <p>Verification Code: <span style="font-size:20px;">[[${code}]]</span></p>
// """;
Map<String, Object> variables = new HashMap<>();
variables.put("name", "Mambo");
variables.put("code", 123456);
String htmlContent = mailService.processTemplate(html, variables, Locale.forLanguageTag("ko_KR"));
Recipient recipient = new Recipient("Mambo", "kdevkr@gmail.com", Message.RecipientType.TO);
Email email = mailService.prepare("[Auth] Requested Two Factor Authentication", htmlContent, recipient);
MimeMessage mimeMessage = mailService.convertTo(email);
mailService.send(mimeMessage);
});
}
μ μ½λμμλ μ£Όμμ ν΅ν΄ 2fa.html νμΌμ 2μ°¨ μΈμ¦μ μν μ΄λ©μΌ ν νλ¦Ώμ΄ μ΄λ»κ² μμ±λμλμ§λ₯Ό 보μ¬μ€λλ€.
ν μ€νΈ ν νλ¦Ώ λͺ¨λ
μ μμμμλ μΌλ°μ μΈ ν νλ¦Ώ ννμμ΄ μλλΌ ν μ€νΈ λͺ¨λμ ν νλ¦Ώ ννμμ μ¬μ©νλ€. νλ‘ νΈμλ κΈ°μ μ μν΄μ μ¬μ©μκ° μ΄λ©μΌ ν νλ¦Ώμ μ½κ² μμ±ν μ μκ² μ§μνλ©΄ μ’μ§λ§ κ·Έκ²μ΄ μ€λΉλκΈ° μ μλ μμ κ°μ΄ ν μ€νΈ λͺ¨λλ‘ μμ±νμ¬ μ‘°κΈμ λ μ½κ² ννν μ μλ€.