[공작소] Spring Boot에서 이메일 전송하기 (1)

이정진·2024년 5월 1일
0

개발

목록 보기
9/21
post-thumbnail

이메일 전송

왜 도입하게 되었는가?

공작소 서비스를 개발하는 과정에서, 지원 취소 등 공고에 관련된 변경사항을 전달할 수 있는 방법으로 이메일을 선택했다.

웹 서비스는, 앱 서비스와 달리 실시간으로 알림을 전송하기 굉장히 어려운 편이다. Web Push Notification을 활용할 수 있지만, 실시간으로 알림이 가는 것의 우선순위가 높지 않아 이메일로 안내하는 것으로 결정했다.
(추후, Web Push Notification에 대해서도 정리 및 적용해볼 예정이다.)

Gmail 설정하기

Google 계정 설정

  1. 먼저, 구글계정으로 로그인하여, 우측 상단의 메뉴에서 계정을 클릭 후 접속한다.
  1. 좌측의 보안 탭을 클릭한다.

  2. 2단계 인증을 사용하고 있지 않다면, 사용하도록 변경한다.

  3. 앱 비밀번호를 생성한다.

    기존에는 보안 페이지에서 앱 비밀번호 생성 탭이 바로 노출되었지만, 패스키 등 보안 관련된 업데이트로 인해, 노출되지 않으므로 검색을 통해서 접근하는 것이 편리하다.

Gmail 설정

  1. Gmail에 접속하여 좌측 탭 리스트에서 라벨 관리를 클릭하여 설정 페이지에 접속한다.

  2. 전달 및 POP/IMAP에 접속한다.

  3. POP 사용 및 IMAP 사용으로 설정 후, 변경사항을 저장한다.

SMTP
보내는 메일(SMTP) 서버

POP
들어오는(POP) 서버

IMAP
수신 메일(IMAP) 서버

Spring Boot 개발

의존성 주입 및 환경 변수 설정

  1. dependency 추가
dependencies {
	...
	implementation 'org.springframework.boot:spring-boot-starter-mail'
    ...
}

일반적으로, Spring에서는 Java Mail Sender 인터페이스를 활용해서 이메일을 전송할 수 있다. spring-boot-starter-mail은 Java Mail Sender 인터페이스를 구현한 구현체를 직접적으로 활용할 수 있도록 제공하고 있기에, 해당 의존성을 주입하여 이메일을 전송할 수 있게 된다.

  1. yml 설정
spring:
  mail:
    host: smtp.gmail.com 
    port: 587
    username: ${mail.username}
    password: ${mail.password}
    properties:
      mail:
        smtp:
          auth: true
          timeout: 5000
          starttls:
            enable: true
  • host: SMTP 서버의 호스트 (Google이므로, smtp.gmail.com 기입)
  • port: SMTP 서버에서 활용하는 포트 (Google의 경우, 587)
  • username: SMTP 서버 로그인 ID (Gmail 계정 설정을 진행한 ID로, 뒤의 @gmail.com까지 모두 기입해주어야 한다.)
  • password: 설정한 앱 비밀번호
  • auth: 사용자에 대한 인증을 시도할 것인지 여부를 결정하는 것으로 default가 false이므로 이를 true로 설정하여 인증 후 메일이 발송될 수 있도록 한다.
  • timeout: default가 무한대로 설정되어, 연결 또는 응답을 무한정 기다리게 된다. 이 경우, 서비스 전체에 영향을 끼칠 수 있으므로 합리적인 값으로 설정하여 문제 발생 확률을 최소화한다.
  • starttls: SSL/TLS 기반으로 SMTP를 활용 여부를 선택하는 변수로, default가 false이므로 true로 변경하여 보안성을 높인다.

개발

Java Mail Sender에서는 SimeMailMessage와 MimeMessage 중 하나의 방식으로 메일을 전송할 수 있다.

SimpleMailMessage
본문은 문자열 형식의 text만 전송 가능

MimeMessage
MimeMessage는 아래의 MimeMessageHelper를 활용하여, html 형식의 본문 또한 보낼 수 있다.

EmailClient

@Slf4j
@Component
@RequiredArgsConstructor
public class EmailClient {

    private final JavaMailSender mailSender;

    public void sendOneEmail(String to) {
        try {
            MimeMessage mimeMessage = mailSender.createMimeMessage();

            // 수신자, 제목, 본문 등 설정
            String subject = "[공작소] 모집 공고 변동사항 안내";
            String body = "공작소 서비스 내의 모집 중이신 공고에서 지원자의 변동사항을 안내하기 위해 발송된 메일입니다.";

            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage);
            mimeMessageHelper.setTo(to);
            mimeMessageHelper.setSubject(subject);
            mimeMessageHelper.setText(body, true);

            // Email 전송
            mailSender.send(mimeMessage);

        } catch (MessagingException e){
            log.error("Error sending email", e);
        }

    }
}

레퍼런스


다음으로는 이메일 템플릿 디자인 및 html로 적용하여 이메일 내의 버튼 클릭 시, 우리 서비스로 연결되는 과정까지의 내용을 정리할 예정이다.

0개의 댓글