공부방/Spring

Spring google SMTP settings

soycrab 2023. 10. 29. 18:54

오늘 작업은 SMTP를 이용한 메일 발송이에요.

서비스를 만드는데 고객의 임시 비밀번호 발급을 위해 사용해야 하기에 

메모로 남겨두어요. 

 

 

1. 먼저 고객에게 메일을 발송할 Google 계정을 만들고, 보안 -> 2단계 인증까지 설정을 해줘요.

 

2.  다시 보안 -> 2단계 인증 -> 앱 비밀번호 화면으로 들어가서 앱 비밀번호 설정을 해주어요.

App name을 본인의 서비스 이름에 맞게 입력하면 비밀번호가 생성됩니다. 

생성된 비밀번호는 잠시 메모장에 기록해 주세요.

3. Gmail 서비스로 이동후 설정 -> 전달 및 POP/IMAP 탭으로 이동후 

- 모든 메일에 POP 사용하기

- IMAP 사용 

이 두 개를 모두 사용으로 바꿔주고 변경사항을 저장하세요. 

 

4. spring에 메일서버와 연결을 하기 위한 의존성 추가를 해주어요!
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail/3.1.5

gradle 

implementation 'org.springframework.boot:spring-boot-starter-mail'

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>3.1.5</version>
</dependency>

 

5. 

mail:
  host: smtp.gmail.com # SMTP 서버 호스트
  port: 587 # SMTP 서버 포트 (기본)
  username: sweet # google 아이디 (sweet@gmail.com 에서 sweet만 적으세요.)
  password: 12345678 # 앱 비밀번호 (위에서 메모에 두었던 비밀번호를 적어주세요.)
  properties:
    mail:
      smtp:
        auth: true # 사용자 인증 시도 여부
        timeout: 5000 # Socket Read Timeout
        starttls:
          enable: true # StartTLS 활성화 여부

 

6. 이제 실제 메일을 보낼 서비스를 만들어 볼까요? 

FindPasswordService.kt

package com.example.securityjwt.infrastructure.persistence.smtp

import jakarta.mail.MessagingException
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.mail.javamail.JavaMailSender
import org.springframework.mail.javamail.MimeMessageHelper
import org.springframework.stereotype.Service

@Service
class FindPasswordService {
    
    @Autowired
    private val javaMailSender: JavaMailSender? = null
    
    fun sendMail(email: String): Boolean {
        return try {
            val mimeMessage = javaMailSender!!.createMimeMessage()
            val mimeMessageHelper = MimeMessageHelper(mimeMessage, false, "UTF-8")
            mimeMessageHelper.setTo(email) // 메일 수신자
            mimeMessageHelper.setSubject("Test 임시 이메일 발송") // 메일 제목
            mimeMessageHelper.setText("테스트 이메일 발송", false) // 메일 본문 내용, HTML 여부
            javaMailSender.send(mimeMessage)
            true
        } catch (e: MessagingException) {
            throw RuntimeException(e)
        }
    }
}

 

Controller.kt

    @GetMapping("/find/password")
    @ResponseStatus(HttpStatus.OK)
    suspend fun findPassword(
        @RequestParam(required = false, value = "email") email: String?,
    ): AccountFindPasswordResponseDto {
        if(email?.isBlank() == true) return AccountFindPasswordResponseDto(false)
        findPasswordService.sendMail(email!!)
        return AccountFindPasswordResponseDto(true)
    }

 

7.  요청 ! 

8. 결과 

 

이메일 전달이 아주 잘 되었어요!!! 

이제 나머지 기능은 여러분의 능력에 맡길게요! 

반응형