AWS

[SES] AWS Simple Email Service & Spring Boot(Kotlin)

Raconer 2024. 10. 9. 12:44
728x90

SES 설정

1. AWS 설정

  1. SES 자격 증명
    • 발신자 Email 입력 후 Email 인증
  2. IAM
    • SES 사용키 발급 (access-key, secret-key)
    • 권한 : AmazonSESFullAccess

2. Spring Boot 설정

  • Dependency
    • implementation("software.amazon.awssdk:sesv2:2.28.16")
    • implementation("com.amazonaws:aws-java-sdk-ses:1.12.773") // 조만간 지원 X
    • implementation("org.springframework.boot:spring-boot-starter-thymeleaf") // 메일 템플릿 사용 시 필요
  • Config
    • SesConfig 설정
@Bean
fun sesV2Client(): SesV2Client {
    val credentials = AwsBasicCredentials.create(accessKey, secretKey)
    val provider = StaticCredentialsProvider.create(credentials)
    return SesV2Client.builder()
        .credentialsProvider(provider)
        .region(Region.AP_NORTHEAST_2)
        .build()
}

// thymeleaf 설정
@Bean
fun setTemplateEngine(springResourceTemplateResolver: SpringResourceTemplateResolver): TemplateEngine {
    val templateEngine = SpringTemplateEngine()
    templateEngine.addTemplateResolver(springResourceTemplateResolver)
    return templateEngine
}
  • Service 생성
@Service
class SesService(
    private val sesV2Client: SesV2Client,
    private val templateEngine: SpringTemplateEngine
) {
    private val log = LogFactory.getLog(SesService::class.java)
    private val from = "발신자 이메일"

    // 메일 전송
    fun sendEmail(variables: Map<String, Any>) {
        val content = templateEngine.process("index", createContext(variables))
        val toAddress = listOf("수신자 이메일")
        log.info(":::: Send Email Result ::::")

        try {
            sesV2Client.sendEmail(createSendEmailRequest(toAddress, "Send Test Title", content))
            log.info("Success Send Email : ${toAddress.size}")
        } catch (e: SesV2Exception) {
            log.error(e.awsErrorDetails().errorMessage())
        }
    }

    // 템플릿 생성
    private fun createContext(variables: Map<String, Any>): Context {
        return Context().apply { setVariables(variables) }
    }

    // 이메일 Request 생성
    private fun createSendEmailRequest(
        toAddress: List,
        title: String,
        contentHtml: String
    ): SendEmailRequest {
        val destination = Destination.builder()
            .toAddresses(toAddress)
            .build()

        val subject = Content.builder()
            .data(title)
            .build()

        val htmlContent = Content.builder()
            .data(contentHtml)
            .build()

        val body = Body.builder()
            .html(htmlContent)
            .build()

        val message = Message.builder()
            .subject(subject)
            .body(body)
            .build()

        val emailContent = EmailContent.builder()
            .simple(message)
            .build()

        return SendEmailRequest.builder()
            .destination(destination)
            .content(emailContent)
            .fromEmailAddress(from)
            .build()
    }
}

※ 위 코드 실행 시 에러 발생 (정지된 계정 또는 400 에러)

* 아래 링크 3부의 리전을 설정하면 메일이 정상 전송됩니다. AWS 400 에러 시 설정 문서

728x90

'AWS' 카테고리의 다른 글

로드밸런스 알고리즘 종류  (0) 2023.07.05
Simple Queue Service_Spring Boot 2.x  (0) 2023.04.16
Simple Queue Service_이론  (0) 2023.04.16
Spring Boot, Ubuntu, Nginx 배포 방법  (0) 2023.04.16