회사에서 개발을 진행하는데 비밀번호 인증번호를 메일로 전송해야하는 상황이 생겼습니다.
Sprint Boot 로 개발을 해보려고 찾아보던중 간단하게 Mail을 전송하는 방법을 정리해보려고 합니다.
너무 많은 정보들 중에 꼭 필요한 부분만 처리해야하지만 복잡하게 설명이 되어있어 간략하게 진행해본뒤에 작성하는 글 입니다.
개발 환경은 Spring Boot 2.x + Gradle 입니다.
선행해야되는 부분은 발송설정을 Gmail 등록할땐 보안 수준이 낮은 앱의 액세서를 꼭 허용해야 합니다.
허용하지 않고 진행한다면 아래와같은 메일을 받으실 수 있습니다.
활동확인으로 보안수준이 낮은 앱 차단이 되고 있는지 알수 있습니다.
Google에서 액세스를 막고 있기 때문에 아래의 URL로 접속해서 허용을 해주시면 됩니다.
https://myaccount.google.com/lesssecureapps
build.gradle 에 mail 관련 의존성 주입
/// Mail
implementation 'org.springframework.boot:spring-boot-starter-mail'
application.yml 에서 mail 설정
Gmail 기준으로 작성해보았습니다.
host 는 고정값이며, port 는 465 or 587 로 사용가능합니다.
id에 @gmail.com 생략 가능하고 password 도 입력해주시면 됩니다.
Gmail 인증관련의 TLS 설정을 해줍니다.
# =============================== # = Email Config # =============================== spring: mail: # Gmail smtp host: smtp.gmail.com
# 465 또는 587 port: 587
# id username: 아이디
# password password: 비밀번호
# TLS properties: mail: smtp: auth: true starttls: enable: true |
cs |
Java 코드를 작성
EmailService 라는 class 를 생성해주었습니다.
@Service 어노테이션을 통해 Bean으로 등록해줍니다.
JavaMailSender 과 TemplateEngine 을 생성자로 의존성 주입을 받습니다.
받는 메일주소와 제목, 내용을 파라미터로 받고 MimeMessagePreparator 와 MimeMessageHelper 를 구현합니다.
build() 함수에서 Thymeleaf 파일경로를 잡아주고 Thymeleaf 에서 사용할 변수를 설정해줄 수 있습니다.
지금은 text 라는 변수만 생성해 주었으며 messageHelper.setText() 로 설정한 content 를 넣어주고 두번째 인자에선 html로 사용하겠다는 설정을 해주었습니다.
기본값은 text이기 때문에 <html> ... <html> 형태로 받게 되니 꼭 true 값을 넣어줍니다.
import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.mail.javamail.MimeMessagePreparator; import org.springframework.stereotype.Service; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context;
@Service public class EmailService {
// Java 메일 private JavaMailSender javaMailSender;
// Thymeleaf Template 사용 private TemplateEngine templateEngine;
public EmailService(JavaMailSender javaMailSender, TemplateEngine templateEngine) { this.javaMailSender = javaMailSender; this.templateEngine = templateEngine; }
public void sendSimpleMessage(String to, String subject, String text) { // Thymeleaf 사용 MimeMessagePreparator message = mimeMessage -> { String content = build(text);
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage); messageHelper.setTo(to); messageHelper.setSubject(subject); messageHelper.setText(content, true); }; javaMailSender.send(message); }
/* Thymeleaf 셋팅 */ private String build(String text) { Context context = new Context(); context.setVariable("text", text); return templateEngine.process("mail-template", context); } } |
cs |
메일을 전송했을때 보여주는 html 파일을 생성
Java에서 등록한 변수를 바로 사용할 수 있습니다.
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Mail Template</title> </head> <body>
<span th:text="${text}"></span> </body> </html> |
cs |
테스트 코드 작성
test package 에서 EmailSendTest 클래스를 생성하고 테스트를 진행해보면 됩니다.
테스트가 정상적으로 진행이 되면 메일을 확인할 수 있습니다.
import com.kcfinance.service.EmailService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class) @SpringBootTest public class EmailSendTest {
// 이메일 발송 테스트 @Autowired private EmailService emailService;
@Test public void sendEmail() { String to = "받는주소"; String subject = "메일 테스트"; String text = "메일 내용";
emailService.sendSimpleMessage(to, subject, text); } }
|
cs |
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] Thymeleaf Layout 상속 (0) | 2019.05.03 |
---|---|
[Spring] Spring Boot 2 Multiple DataSource (7) | 2019.04.30 |
[Spring] Spring Boot Hibernate dialect (0) | 2019.04.25 |
[Spring] Spring Boot 2.0 Gradle War 배포 (4) | 2019.04.25 |
[Spring] IntelliJ Lombok Plugin 설치 (0) | 2019.04.24 |