본문 바로가기

개발/Spring

[SpringBoot] 이메일 전송(텍스트, html)

 

결제가 완료되면 결제 정보 및 신청 내역을 메일로 전송하려고 한다.

메일은 html 형식으로 보낸다.

gmail, thymeleaf와 spring-boot-starter-mail을 이용한다.

 

springboot 2.1.4

java 8

설정

의존성 추가

// email 발송
implementation 'org.springframework.boot:spring-boot-starter-mail'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
  • html 템플릿을 활용하기 위해 thymeleaf를 추가하였다.

 

yml

mail:
    default-encoding: UTF-8
    host: smtp.gmail.com
    port: 587
    username: <gmail address>
    password: <app password>
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
  • password는 gmail 계정에서 앱 비밀번호를 발급 받아 입력한다.

 

앱 비밀번호

원래 gmail에서 보안 수준이 낮은 앱의 액세스 권한을 허용해주고 직접 계정 비밀번호를 입력하면 됐는데 그 기능이 2022년 5월 30일부로 지원이 끝났다. 그래서 앱 비밀번호를 발급 받아 입력해주면 된다.

 

  1. 계정 > 보안 > 2단계 인증 > 앱 비밀번호
  2. 생성된 비밀번호를 mail.password 항목에 넣어주면 된다.

 

구현

텍스트 메일 보내기

public class EmailService {
    private final JavaMailSender javaMailSender;
    private final SpringTemplateEngine templateEngine;

    public void sendText(String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setText(content);
        message.setTo("test@test.test");
        message.setSubject(subject);

        javaMailSender.send(message);
    }
}
  • message.setCc() 등 메서드를 통해 메일 전송에 필요한 요소를 추가할 수 있다.

 

HTML 템플릿 이용하기

메일을 보내는 목적이 상담 신청을 했을 때 정보를 보내는 용도라서 데이터를 넣어서 보내야 한다. 그래서 thymeleaf를 사용하여 보내기로 한다.

EmailDto를 생성하여 공통된 객체를 받는다.

public class EmailDto {
    private String subject;
    private Map<String, Object> content;
    private String template;
}

 

EmailDto를 받아 데이터를 넣어주고 메일 전송

public void sendHTML(EmailDto emailDto) {
    MimeMessage message = javaMailSender.createMimeMessage();

    try {
        MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
        helper.setSubject(emailDto.getSubject());
        helper.setText(setContext(emailDto.getContent(), emailDto.getTemplate()), true);
        helper.setTo("test@test.test");
        javaMailSender.send(message);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private String setContext(Map<String, Object> content, String template) {
    Context context = new Context();
    context.setVariables(content);
    return templateEngine.process(template, context);
}
  • template 경로와 데이터를 map 형태로 받아서 재사용 할 수 있도록 만들었다.
  • 받는 사람이 고정되어 있어 따로 받지는 않았는데 필요하면 수신자, 발신자, 참조 등 필요한 정보도 함께 받으면 좋을 거 같다.
  • JavaMailSender.send() 메서드를 호출하면 MailException이 발생할 수 있어 에러 처리를 해줘야 한다.

 

template 사용 시 주의 사항

  • 스타일은 inline이나 html 파일 안에 작성하는 것이 좋다.
  • 이미지는 helper.addInline() 메서드를 이용하여 넣어주거나 아예 웹 주소로 넣어준다.
  • 메일로 보냈을 때 스타일이 깨지지 않게 하려면 table 형태로 레이아웃을 구성해야 한다.

 

 

참고

https://bright-landscape.tistory.com/222

https://born2bedeveloper.tistory.com/70

'개발 > Spring' 카테고리의 다른 글

WebMvcTest에서 Filter 제외하기  (0) 2023.09.08
[SpringBoot] MySQL 연결 에러  (0) 2023.09.06
[Querydsl] Querydsl 설정과 jsp 에러  (0) 2023.08.17
[Querydsl] 서브쿼리 사용하기  (0) 2023.07.03
[JPA] flush(), clear()  (0) 2023.03.28