티스토리 뷰

웹 애플리케이션 개발을 하다보면 메일발송을 구현해야 할 때가 있다. 그때 메일발송을 단순 텍스트가 아닌
HTML 템플릿 형태로 전송해야 될 경우가 있는데 예제코드와 함께 알아보자.

라이브러리 추가

<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>

thymeleaf 라이브러리와 Spring Boot에서 제공해주는 mail 라이브러리를 pom.xml에 추가하자

application.properties(yml) 파일에 발신자 정보 등록

발신자의 메일정보는 naver로 해두었다.

naver 이메일 환경설정 수정

발신자의 메일정보가 naver이니 해당 메일정보로 로그인후 메일함으로 이동하여 하단 환경설정 버튼을 클릭후
IMAP/STMP 탭을 클릭해서 사용버튼에 체크하고 확인버튼을 누르면된다.

 

메일전송을 하기위해서는 STMP 서버가 구축이 되어있어야 하는데 naver나 google에선 SMTP 서버를 제공해주니
제공되는걸 사용하면 된다.

Thymeleaf 설정추가

ThymeleafConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.templatemode.TemplateMode;

@Configuration
public class ThymeleafConfig {

    @Bean
    public TemplateEngine htmlTemplateEngine() {
        TemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.addTemplateResolver(springResourceTemplateResolver());

        return templateEngine;
    }

    @Bean
    public SpringResourceTemplateResolver springResourceTemplateResolver() {
        SpringResourceTemplateResolver springResourceTemplateResolver = new SpringResourceTemplateResolver();
        springResourceTemplateResolver.setOrder(1);
        springResourceTemplateResolver.setPrefix("classpath:templates/");
        springResourceTemplateResolver.setSuffix(".html");
        springResourceTemplateResolver.setTemplateMode(TemplateMode.HTML);
        springResourceTemplateResolver.setCharacterEncoding("UTF-8");
        springResourceTemplateResolver.setCacheable(false);

        return springResourceTemplateResolver;
    }
}

Thymeleaf 설정을 추가하였다.

템플릿 파일경로 설정

위 JAVA 설정에서 template파일의 prefix를 classpath의 templates 디렉토리 하위의 모든 디렉토리
suffix를 .html로 해놓았으며 template하위의 mail이란 폴더를 생성하고 mail.html 이라는 이름으로 템플릿을 생성했다.
mail이란 폴더명과 mail.html이란 파일명의 위치와 이름을 기억해두자.



템플릿 메일전송에 사용되는 샘플데이터이다.

Mail 유틸추가

MailUtils.java

import java.util.Map;

import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.mail.MailProperties;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

@Component
public class MailUtil {

    @Autowired
    private MailProperties mailProperties;

    @Autowired
    private TemplateEngine htmlTemplateEngine;

    public void sendTemplateMail(String toMail, String subject, String fromName, Map<String, Object> variables)
            throws Exception {
        Context context = new Context();
        context.setVariables(variables);

        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
        javaMailSender.setHost(mailProperties.getHost());
        javaMailSender.setPort(mailProperties.getPort());
        javaMailSender.setUsername(mailProperties.getUsername());
        javaMailSender.setPassword(mailProperties.getPassword());

        InternetAddress from = new InternetAddress(mailProperties.getUsername(), fromName);
        InternetAddress to = new InternetAddress(toMail);

        String htmlTemplate = htmlTemplateEngine.process("mail/mail", context);

        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, "UTF-8");

        messageHelper.setFrom(from);
        messageHelper.setTo(to);
        messageHelper.setSubject(subject);
        messageHelper.setText(htmlTemplate, true);

        javaMailSender.send(mimeMessage);
    }
}

사용자에게 메일을 보내는 기능을 구현하였다. 여기서 중요하게 봐야될부분은

htmlTemplateEngine.process("mail/mail", context); 이다

 

process 메서드의 첫번째 인자에는 템플릿 파일명이 오게된다. 상단에 템플릿 경로설정 하는부분에서
prefix와 suffix의 값을 지정해주었으니 템플릿 파일의 풀 경로는 prefix + main/main + suffix

즉 해당 템플릿 파일경로는 src/main/resources/templates/mail/mail.html 이다

 

위 JAVA 파일의 sendTemplateMail 메서드의 4번째 인자에 Map이 오게되는데 여기에는
실제 템플릿에 데이터를 바인딩하기위한 데이터를 key/value 구조로 넣어주면된다. 테스트를 해보자

mail.html 생성 + 테스트 코드작성

테스트 코드에서 상단에 샘플데이터 사진처럼 DB에서 List를 조회한 데이터를 넣어주고 title도 함께넣어줬다.

테스트

테스트는 정상적으로 수행되었다. 이제 메일이 정상적으로 전송되었는지 확인해보자.

 

 

보낸메일이 정상적으로 수신되었다.

위 테스트 사진에 시간을 강조한 이유는 테스트한 데이터가 실제로 정상적으로 발송이 된건지
이 블로그를 봐주시는 모든분들께 전해주고 싶어서이다

728x90

'Thymeleaf' 카테고리의 다른 글

[Thymeleaf] - Thymeleaf Util class 살펴보기  (0) 2020.12.18
[Thymeleaf] - Thymeleaf 기본문법  (1) 2020.12.15
[Thymeleaf ] - Thymeleaf 기본세팅  (0) 2020.12.13
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함