[Spring Boot]E-mail 발송 기능 구현

한상욱·2024년 8월 1일
0

Spring Boot

목록 보기
17/19
post-thumbnail

들어가며

이 글은 Spring Boot를 공부하며 정리한 글입니다.

E-mail

여러가지 인증에 대한 기능을 구현할 때, 혹은 서비스 이용자에게 안내문을 전달하는 경우 유저의 이메일을 이용해서 전달할 수 있습니다.

그렇기에 이번에는 E-mail 발송 서비스를 제작해보겠습니다.

setup

기본적으로 gmail을 이용한 서비스를 구축해 볼것입니다. 따라서, 설정이 완료된 계정이 필요합니다. 앱 비밀번호와 E-mail 관련 설정을 해주셔야 합니다.

앱 비밀번호로 이용할 별칭을 지정한 후 생성된 앱 비밀번호를 안전한 곳에 보관합니다.

이후에 Gmail 설정에서 POP/IMAP 설정을 완료해주시면 됩니다. POP 사용과 IMAP 사용을 지정해주세요. 이제 모든 준비가 완료되었습니다.

의존성

Mail 서비스를 구축하기 위해서 아래와 같은 의존성을 추가해줍니다.

dependencies {
	...
	implementation("org.springframework.boot:spring-boot-starter-mail")
	...
}

application.yml

이제 아래와 같은 설정이 필요합니다. google 계정과 앱 비밀번호 및 기타 설정을 지정합니다.

spring:
	...
  mail:
    protocol: smtp
    port: 587
    username: [구글 계정]
    password: [앱 비밀번호]
    host: smtp.gmail.com
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

DTO

요청시에는 이메일을 전달할 이메일을 받도록 하겠습니다. 그리고 요청에는 성공 메시지를 담도록 DTO를 생성해주겠습니다. Validation은 생략하도록 하겠습니다.

data class EmailRequestDto(
    val email : String
)

data class EmailResponseDto(
    val message : String
)

EmailService

단순하게 테스트 용 이메일을 발송할 것입니다. 따라서, 내용과 제목은 임시로 지정하도록 하겠습니다.

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

이제 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
        )
    }
}

테스트를 통해 결과를 보겠습니다.

결과가 아주 잘 수행되는군요!

profile
자기주도적, 지속 성장하는 모바일앱 개발자가 되기 위해

0개의 댓글