만약 이미 2단게 인증 설정을 완료했고, 앱 비밀번호를 발급 받았다면 3단계로 넘어가세요.
Gmail을 통해 메일을 발송하려면, 계정의 2단계 인증이 활성화 상태여야 해요. Google 계정 페이지의 좌측 사이드 바에서 보안 및 로그인 메뉴를 탭하고, 하단 2단계 인증을 활성화 시켜줍니다.

Google 계정 앱 비밀번호 페이지에서 앱 비밀번호를 설정해 줄 차례에요.

위 스크린샷 화면에서 아래 앱 이름 입력 란에 앱 이름을 입력해줍니다. 이후, 만들기 버튼이 활성화되면 클릭해 줍니다.

앱 비밀번호를 생성하면 위 화면과 같이 생성된 앱 비밀번호 Modal이 표시되는데, 이 비밀번호를 application.yml에서 사용할 것이기에 미리 다른 곳에 옮겨 적어줍니다.
Google Gmail 설정 페이지에서 전달 및 POP/IMAP 설정 메뉴로 이동해 줍니다. 만약 설정 페이지로 바로가지지 않는다면 Gmail 좌측 사이드 바에서 라벨 관리를 탭하여 설정 페이지로 이동할 수 있어요.

위 메뉴에서 아래의 내용을 설정해 주세요.
위 사항을 모두 설정했다면 변경사항 저장 버튼을 눌러 변경한 모든 사항에 대해 설정을 해줍니다.
Spring Boot에서는 Java Mail Sender 인터페이스를 활용해 이메일을 전송할 수 있어요. 아래에서 추가하는 spring-boot-starter-mail 의존성은 Java Mail Sender 인터페이스를 직접적으로 활용할 수 있도록 도와주는 의존성이에요. 그렇기에 해당 의존성을 추가해 이메일을 전송할 수 있고 그 방법에 대해서 알아볼게요.
build.gradle 파일의 dependencies에 아래의 의존성을 추가해 주세요.
dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter-mail'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
...
}
application.yml 설정application.yml 파일에 아래와 같은 설정을 추가해 주세요.
spring:
mail:
host: smtp.gmail.com
port: 587
username: (발신자 이메일 주소)
password: (발급받은 앱 비밀번호)
properties:
mail:
smtp:
auth: true
timeout: 5000
starttls:
enable: true
src/java/(packages)/mail/controller/MailController.java@RestController
@RequestMapping("/api/v1/mail")
@RequiredArgsConstructor
public class MailController {
private final MailService mailService;
@PostMapping("/test")
public void test(@RequestParam String email) {
mailService.sendMail(email);
}
}
/api/v1/mail/test에 POST 요청으로 Parameter 값에 email , 즉 이메일 주소를 보내면 mailService의 sendMail() 함수가 실행되게 구현했어요.
src/java/(packages)/mail/service/MailService.java@Service
@Slf4j
@RequiredArgsConstructor
public class MailService {
private final JavaMailSender mailSender;
private final SpringTemplateEngine templateEngine;
public void sendMail(String email) {
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, false, "UTF-8");
mimeMessageHelper.setTo(email);
mimeMessageHelper.setSubject("정보 처리 오류 안내");
mimeMessageHelper.setText(setContext("test", LocalDateTime.now().toString()), true);
mailSender.send(mimeMessage);
log.info("[MailService] 메일 전송 성공: {}", email);
} catch (MessagingException e) {
log.error("[MailService] 메일 전송 실패: {}", e.getMessage());
throw new RuntimeException(e);
}
}
private String setContext(String type, String code) {
Context context = new Context();
context.setVariable("code", code);
return templateEngine.process(type, context);
}
}
sendMail()JavaMailSender가 실제로 보내지는 이메일 내용을 담는 MimeMessage 객체를 생성해요.MimeMessage를 더 쉽게 구현할 수 있는 MimeMessageHelper 객체를 생성해요.new MimeMessageHelper(mimeMessage, false, "UTF-8") 는, 차례대로, MimeMessage 객체, MultiPart 사용 여부(첨부파일), 텍스트 인코딩이에요.setText() 가장 마지막에 있는 파라미터 true 는 HTML 템플릿을 적용한다는 뜻이에요.test는 이메일 본문 템플릿의 파일 명이에요. test.html이기에 test 로 설정해 주었어요.JavaMailSender를 이용해 이메일을 보내고, 성공 로그를 남겨요.setContext()Context는 Thymeleaf에서 사용할 변수들을 담는 객체에요.${code}를 사용할 수 있도록 값을 주입해요.SpringTemplateEngine을 이용해 템플릿을 렌더링하고, 값을 주입하고 HTML로 변환 해 반환해요resources/templates/test.html<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div style="margin:100px;">
<h1>이메일 전송 테스트</h1>
<p>이 이메일은 이메일 전송 테스트 목적으로 발송되었습니다.</p>
<br />
<p style="font-size:130%" th:text="${code}"></p>
<br/>
</div>
</body>
</html>
http://localhost:8080/api/v1/mail/test?email=${이메일주소}
위와 같이 만든 API의 파라미터 값에 이메일 주소를 넣고 요청을 보냈어요. 그러면 아래 사진과 같이 코드에서 작성했던 LocalDateTime.now() 값과 test.html 에 구현했던 템플릿을 이용해 이메일이 잘 발송했음을 확인할 수 있어요.

Spring Boot에서 Google Gmail을 이용해 이메일을 발송하는 방법에 대해 정리해 보았어요. 현재는 개인 도메인으로 설정된 이메일 서버가 없지만, 이후 메일 서버를 구축한다면 Gmail과 동일하게 설정하여 이메일을 발송할 수 있게 구현하고 싶다는 생각이 들고, 이메일을 전송하기 전에 email 값이 이메일 주소 형식인지 검증하는 로직을 추가한다면 오류 발생이 더 줄어들 것이라고 생각하고 이 부분을 서비스에 구현하려고 해요.