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") // 메일의 Email 템플릿 사용시 필요
  • 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 생성
import org.apache.commons.logging.LogFactory
import org.springframework.stereotype.Service
import org.thymeleaf.context.Context
import org.thymeleaf.spring5.SpringTemplateEngine
import software.amazon.awssdk.services.sesv2.SesV2Client
import software.amazon.awssdk.services.sesv2.model.*

@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 = this.templateEngine.process("index", this.createContext(variables)) // "index"는 thymeleaf html 파일 이름 index.html(/resource/templates/index.html)
        val toAddress = listOf( "수신자 이메일" ) 
        this.log.info(":::: Send Email Result ::::")
        try {
            this.sesV2Client.sendEmail(this.createSendEmailRequest(toAddress, "Send Test Title", content))
            this.log.info("Success Send Email : ${toAddress.size}")
        } catch (e:SesV2Exception) {
            this.log.error(e.awsErrorDetails().errorMessage())
        }
    }

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

    // 이메일 Request 생성
    private fun createSendEmailRequest(toAddress:List<String>,
                               title:String,
                               contentHtml:String) : SendEmailRequest {

        val destination: Destination = Destination.builder().toAddresses(toAddress).build()

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

        val content = Content.builder().data(contentHtml).build()
        val body = Body.builder().html(content).build()


        val msg = Message.builder()
            .subject(sub)
            .body(body)
            .build()

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

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

 

※ 위 코드 하여도 에러 가 뜰때 (정지된 계정 에러 / 400 에러)

* 아래 링크 3부의 리전을 설정 하면 메일이 보내진다.(아래 문제가 아닐수도 있다)
https://docs.aws.amazon.com/ko_kr/ses/latest/dg/monitoring-sender-reputation-pausing-account.html#monitoring-sender-reputation-pausing-account-part-3

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