Spring Boot

[Spring Boot] 스프링 메일 전송 방법 ( + google Gmail SMTP 설정)

공대생안씨 2024. 3. 28. 16:40
  • 다양한 사이트에서 쉽게 볼 수 있는 회원가입 시 이메일 검증
  • 스프링 부트로 사용자에게 메일 전송 기능 구현

 

1. 구글 Gmail SMTP 사용 위한 설정

 

  • 구글 사이트 > 프로필 클릭 > Google 계정 관리

 

  • 검색창에 > "앱 비밀번호" 검색

 

  • 앱 이름 설정 > 만들기

 

  • 16자리의 앱 비밀번호가 생성됨

 

2. build.gradle

dependencies {

    // 메일 전송 위한 라이브러리 추가
    implementation 'org.springframework.boot:spring-boot-starter-mail'
    
    // 예제에서 확인을 위한 타임리프 추가 (필요하지 않다면 넣지 않아도 됨)
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
}

 

3. application.yml

spring:
  mail:
    host: smtp.gmail.com        # SMTP 서버 호스트
    port: 587                   # SMTP 서버 포트
    username:                   # SMTP 서버 로그인 아이디
    password:                   # SMTP 서버 로그인 비밀번호
    properties:
      mail:
        smtp:
          auth: true            # 사용자 인증 시도 여부
          starttls:
            enable: true        # starttls 활성화 여부
  • username : SMTP 설정을 완료한 gmail 아이디 (@gmail.com 은 제외하고 아이디만 기입)
  • password : SMTP 설정 시 발급 받은 16자리의 비밀번호 (띄어쓰기 없이 기입)

 

4. MailService

  • 메일 보내는 방식이 2가지 존재
    • 1. SimpleMailMessage 를 통한 간단한 텍스트 전송 방법
    • 2. MimeMessage 를 통한 html 반영 메일 전송 방법
  • 2가지 방식의 서비스 단 메서드 예제를 구현함
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

@Service
@Slf4j
@RequiredArgsConstructor
public class MailService {

    private final JavaMailSender javaMailSender;

    public void sendSimpleMailMessage() {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();

        try {
            // 메일을 받을 수신자 설정
            simpleMailMessage.setTo("chm2006@naver.com");
            // 메일의 제목 설정
            simpleMailMessage.setSubject("테스트 메일 제목");
            // 메일의 내용 설정
            simpleMailMessage.setText("테스트 메일 내용");

            javaMailSender.send(simpleMailMessage);

            log.info("메일 발송 성공!");
        } catch (Exception e) {
            log.info("메일 발송 실패!");
            throw new RuntimeException(e);
        }

    }

    public void sendMimeMessage() {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();

        try{
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, false, "UTF-8");

            // 메일을 받을 수신자 설정
            mimeMessageHelper.setTo("chm2006@naver.com");
            // 메일의 제목 설정
            mimeMessageHelper.setSubject("html 적용 테스트 메일 제목");

            // html 문법 적용한 메일의 내용
            String content = """
                    <!DOCTYPE html>
                    <html xmlns:th="http://www.thymeleaf.org">
                                        
                    <body>
                    <div style="margin:100px;">
                        <h1> 테스트 메일 </h1>
                        <br>
                                        
                                        
                        <div align="center" style="border:1px solid black;">
                            <h3> 테스트 메일 내용 </h3>
                        </div>
                        <br/>
                    </div>
                                        
                    </body>
                    </html>
                    """;
            
            // 메일의 내용 설정
            mimeMessageHelper.setText(content, true);

            javaMailSender.send(mimeMessage);

            log.info("메일 발송 성공!");
        } catch (Exception e) {
            log.info("메일 발송 실패!");
            throw new RuntimeException(e);
        }
    }

}

 

  • 메일을 받을 수신자가 여러명인 경우 (setTo 부분 수정)
// 문자열 배열 형태
String[] receivers = {"abcd@gmail.com", "efgh@gmail.com"};
simpleMailMessage.setTo(receivers);

// ArrayList의 경우 => 배열로 전환해줘야 함!
ArrayList<String> receiverList = new ArrayList<>(Arrays.asList("abcd@gmail.com", "efgh@gmail.com"));
      
String[] changeReceivers = receiverList.toArray(new String[receiverList.size()]);
simpleMailMessage.setTo(changeReceivers);

 

 

5. MailController

import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
public class MailController {

    private final MailService mailService;

    @GetMapping("/simple")
    public void sendSimpleMailMessage() {
        mailService.sendSimpleMailMessage();
    }

    @GetMapping("/html")
    public void sendMimeMessage() {
        mailService.sendMimeMessage();
    }
}

 

 

6. 실행 결과

  • @RestController 로 인해서 postman 으로 GET request를 전송하여 실행 결과 확인

 

  • http://localhost:8080/simple (GET) 전송 시

 

  • http://localhost:8080/html (GET) 전송 시