스프링에서 메일 보내기

공병주(Chris)·2022년 7월 23일
1
post-thumbnail

JavaMailSender

우아한테크코스 Level3 팀 프로젝트 기능 구현 중, Oauth를 사용하지 않고
SMTP(Simple Mail Transfer Protocol)을 통해 사용자에게 이메일 인증을 받는 기능을 구현해야 했습니다.

메일 설정

먼저, 메일을 발송할 주체의 계정이 필요합니다. 저희 팀은 Google Mail을 사용했습니다.

앱 비밀번호 만들기

https://support.google.com/mail/thread/166604101/smtp-서버를-통해-메일-보내기에서-인증실패가-나옵니다-이유를-알고-싶습니다?hl=ko

2022년 5월 30일부터 google의 보안정책이 바뀌어서, 위의 절차를 밟아야 메일을 전송할 수 있습니다.

Google 계정 > 보안 > Google에 로그인에서 2단계 인증을 설정하고, 앱 비밀번호를 발급받아야 합니다.

위의 단계를 마치셨다면, 이제 메일을 발송할 수 있는 계정 세팅이 완료가 되었습니다.

이제 Spring에서 메일을 보내는 방식을 알아보겠습니다.

yml 설정

spring:
  mail:
    host: {smtp 서버 호스트 ex : smtp.gmail.com}
    username: {이메일을 발송할 나의 이메일 계정}
    password: {2차 비밀번호}
    port: 587
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

먼저 mail을 보내기 위한 값들을 yml을 통해서 설정해줍니다.

spring.mail.password에 들어가는 값은 위에서 발급받은 앱 비밀번호입니다.

@Service
public class MailService {

    private final MailSender javaMailSender;

    public MailService(MailSender mailSender) {
        this.javaMailSender = mailSender;
    }

    public void sendEmail(String to, String title, String content) {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setTo(to);
        simpleMailMessage.setSubject(title);
        simpleMailMessage.setText(content);
        javaMailSender.send(simpleMailMessage);
    }
}

사용하려는 곳에서 MailSender 객체를 DI 받아서, 사용하면 됩니다.

상당히 간단합니다. 어떻게 가능할까요?

이마저도 AutoConfiguration 해주는 SpringBoot..❤️

SpringBoot가 실행될 때 위에서 설정해준 yml 파일을 통해 위의 설정 값이 위의 MailProperties 객체로 주입됩니다.

그 후, MailSenderPropertiesConfiguration에서 JavaMailSender의 구현체를 생성할 때
MailProperties의 값이 JavaMailSender에 설정됩니다. 따라서, 저희가 yml에서 지정한 값을 가진 JavaMailSender 객체를 사용할 수 있는 것이죠.

궁금하신 분들은 위의 두 객체에 Breakpoint를 찍어보고 값을 확인해보시면, yml에서 설정한 값들이 잘 들어가 있는 것을 확인하실 수 있습니다.

정말 Spring Boot의 AutoConfiguration은 너무 편합니다. 하지만, 항상 추상화된 것에 의존하려 노력하지 않는 것이 중요한 것 같습니다.
결론이 조금 이상하네요ㅋㅋㅋ... 무튼

끗!

2개의 댓글

comment-user-thumbnail
2022년 7월 24일

이마저도 정리해서 공유해주는 크리스..❤️

1개의 답글