✏️ 절차
- Google 에서 앱 비밀번호 설정 → Google 메일 설정
✏️ Google 환경설정
📍 앱 비밀번호 설정하기
- google → 계정관리 → 보안 → 2단계 인증 → 앱 비밀번호 설정
- 앱 선택 : 메일
- 기기선택 : 비밀번호
- 16자리 기기용 앱 비밀번호를 저장해준다.
📍 GMail 환경 설정
- Gmail → 우측상단 톱니바퀴 → 모든 설정 보기 → 전달 및 POP/MAP
- POP 다운로드 : 모든 메일에 POP 사용하기
- IMAP 엑세스 : IMAP 사용
- 나머지는 기본값으로 변경사항 저장
✏️ Spring Boot 환경설정
📍 Dependencies
- 아래 두개는 타임리프를 사용할 때만 추가하면 된다.
implementation 'org.springframework.boot:spring-boot-starter-mail'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
📍 application yml
- username
- aaa@gmail.com 일 경우 aaa 를 적으면 됨
- password
spring:
mail:
host: smtp.gmail.com
port: 587
username: 유저네임
password: 비밀번호
properties:
mail:
smtp:
auth: true
timeout: 5000
starttls:
enable: true
📍 Security 설정
- 인증을 완료해도 POST 요청을 보낼경우 403 에러가 발생할 수 있다.
- 이 문제를 방지하기 위해 http 객체에 설정을 추가해준다.
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http
...
.csrf().disable()
.build();
}
✏️ Mail 기능 구현
📍 DTO 생성
import lombok.Data;
@Data
public class MailDto {
private String address;
private String subject;
private String text;
}
📍 Servcie 계층
FROM_ADDRESS
- 보내는 사람의 email 주소를 입력하면 된다.
SimpleMailMessage
- dto 에서 받아온 내용을 꺼내서 set 해준다.
import lombok.AllArgsConstructor;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
@Service
@AllArgsConstructor
public class EmailService {
private JavaMailSender sender;
private static final String FROM_ADDRESS = "aaa@gmail.com";
public void mailSend(MailDto dto) {
SimpleMailMessage msg = new SimpleMailMessage();
msg.setTo(dto.getAddress());
msg.setSubject(dto.getSubject());
msg.setText(dto.getText());
sender.send(msg);
}
}
📍 Controller 계층
- Service 의 method 를 호출하고,
endpoint 에 요청을 보내면 완료
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequiredArgsConstructor
public class EmailTestController {
private final EmailService service;
@PostMapping("/mail")
public String execMail(@RequestBody @Valid MailDto dto) {
log.info("요청확인");
service.mailSend(dto);
log.info("전송완료");
return "good";
}
}