이 글은 Spring Boot를 공부하며 정리한 글입니다.
여러가지 인증에 대한 기능을 구현할 때, 혹은 서비스 이용자에게 안내문을 전달하는 경우 유저의 이메일을 이용해서 전달할 수 있습니다.
그렇기에 이번에는 E-mail 발송 서비스를 제작해보겠습니다.
기본적으로 gmail을 이용한 서비스를 구축해 볼것입니다. 따라서, 설정이 완료된 계정이 필요합니다. 앱 비밀번호와 E-mail 관련 설정을 해주셔야 합니다.
앱 비밀번호로 이용할 별칭을 지정한 후 생성된 앱 비밀번호를 안전한 곳에 보관합니다.
이후에 Gmail 설정에서 POP/IMAP 설정을 완료해주시면 됩니다. POP 사용과 IMAP 사용을 지정해주세요. 이제 모든 준비가 완료되었습니다.
Mail 서비스를 구축하기 위해서 아래와 같은 의존성을 추가해줍니다.
dependencies {
...
implementation("org.springframework.boot:spring-boot-starter-mail")
...
}
이제 아래와 같은 설정이 필요합니다. google 계정과 앱 비밀번호 및 기타 설정을 지정합니다.
spring:
...
mail:
protocol: smtp
port: 587
username: [구글 계정]
password: [앱 비밀번호]
host: smtp.gmail.com
properties:
mail:
smtp:
auth: true
starttls:
enable: true
요청시에는 이메일을 전달할 이메일을 받도록 하겠습니다. 그리고 요청에는 성공 메시지를 담도록 DTO를 생성해주겠습니다. Validation은 생략하도록 하겠습니다.
data class EmailRequestDto(
val email : String
)
data class EmailResponseDto(
val message : String
)
단순하게 테스트 용 이메일을 발송할 것입니다. 따라서, 내용과 제목은 임시로 지정하도록 하겠습니다.
import ...
@Service
class EmailService(
private val javaMailSender : JavaMailSender
) {
/**
* 이메일 전송
*/
fun sendEmail(emailRequestDto: EmailRequestDto) : EmailResponseDto {
val message = getMailMessage(email = emailRequestDto.email)
javaMailSender.send(message)
val result = EmailResponseDto(
message = "이메일이 발송되었습니다!"
)
return result
}
/**
* 메일 메시지 생성 함수
*/
private fun getMailMessage(email : String) : SimpleMailMessage {
var message = SimpleMailMessage()
message.subject = "테스트 이메일"
message.text = "테스트 이메일"
message.setTo(email)
return message
}
}
이제 Controller를 제작하겠습니다. 단순히, 요청과 응답을 반환하도록 하겠습니다.
import ...
@RestController
@RequestMapping("/api/email")
class EmailController(
private val emailService : EmailService
) {
/**
* 테스트 이메일 발송 Api
*/
@PostMapping()
private fun sendEmail(@RequestBody emailRequestDto: EmailRequestDto)
: ResponseEntity<EmailResponseDto> {
val result = emailService.sendEmail(emailRequestDto)
return ResponseEntity.status(HttpStatus.OK).body(
result
)
}
}
테스트를 통해 결과를 보겠습니다.
결과가 아주 잘 수행되는군요!