AWS SES로 이메일 보내기 예제

TreeSick·2022년 4월 8일
0

아마존 AWS

목록 보기
1/2
post-custom-banner

스프링부트에서 AWS Simple Email Service를 사용해서 이메일을 보내는 예제를 만들어보겠습니다~!

소스코드

https://github.com/namusik/TIL-SampleProject/tree/main/AWS/Amazon%20SES/AWS%20SES%20%EC%8B%A4%EC%8A%B5%EC%98%88%EC%A0%9C

작업환경

IntelliJ
Spring Boot
java 11
gradle

build.gradle

dependencies {
    implementation 'com.amazonaws:aws-java-sdk-ses:1.12.188'
}

아마존에서 제공하는 라이브러리를 사용하기 위해 ses 의존성 추가해줌.

application.properties

aws.ses.access-key=1
aws.ses.secret-key=2

AWS 보안자격증명에서 엑세스키를 발급받아 줍니다.

https://dev.classmethod.jp/articles/beginner-amazone-ses-send-email/

AwsSesConfig

@Configuration
public class AwsSesConfig {

    @Value("${aws.ses.access-key}")
    private String accessKey;

    @Value("${aws.ses.secret-key}")
    private String secretKey;

    @Bean
    public AmazonSimpleEmailService amazonSimpleEmailService() {
        final BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(accessKey, secretKey);

        final AWSStaticCredentialsProvider awsStaticCredentialsProvider = new AWSStaticCredentialsProvider(basicAWSCredentials);

        return AmazonSimpleEmailServiceClientBuilder.standard().withCredentials(awsStaticCredentialsProvider).withRegion("us-east-1").build();
    }
}

보안이 필요한 정보들은 직접 적지않고 application.properties에 적은 후 @Value로 가져옵니다.
(application.properties는 gitignore해주기)

액세스 키를 가지고 Aws에 접근할 수 있는 설정을 해줍니다.

다른점은 .withRegion()에 현재 AWS SES Account가 있는 지역을 써주시면 됩니다.

EmailDto

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class EmailDto {
    //AWS SES에 등록된 도메인명과 일치해야함
    static final String FROM_EMAIL = "SES에 등록된 이메일"; // 보내는 사람

    private List<String> receiver; // 받는 사람
    private String subject; // 제목
    private String content; // 본문

    //SendEmailRequest 객체형태로 맞춰주기
    public SendEmailRequest toSendRequestDto() {
        //목적지 설정
        Destination destination = new Destination()
                .withToAddresses(this.receiver);

        //제목, 본문 설정
        Message message = new Message().withSubject(createContent(this.subject))
                .withBody(new Body().withHtml(createContent(this.content)));

        return new SendEmailRequest().withSource(FROM_EMAIL).withDestination(destination)
                .withMessage(message);
    }

    //본문 형식 설정
    private Content createContent(String text) {
        return new Content().withCharset("UTF-8").withData(text);
    }
}

이메일 정보를 담은 Dto를 만들어 줍니다.

주의할점은 FROM_EMAIL은 AWS SES에 등록된 Identity로 해야합니다.

그리고 AWS에서는 SendEmailRequest 타입으로 메일을 보내야하기 때문에 미리 세팅해주는 메서드를 만들어줍니다.

EmailService

@Service
@RequiredArgsConstructor
public class EmailService {

    private final AmazonSimpleEmailService amazonSimpleEmailService;

    //이메일 전송하기
    public void send(String subject, String content, List<String> receivers) {

        //이메일 정보를 담은 객체 생성
        EmailDto emailSenderDto = new EmailDto(receivers, subject, content);

        //EmailSenderDto를 SendEmailRequest형태로 바꿔준후 이메일 전송.
        SendEmailResult sendEmailResult = amazonSimpleEmailService.sendEmail(emailSenderDto.toSendRequestDto());

        System.out.println(sendEmailResult.getSdkResponseMetadata().toString());
    }
}

이메일 전송을 위한 Service.

이메일 전송을 위한 AmazonSimpleEmailService 생성자 주입.

Controller에서 넘겨준 정보들을 가지고 EmailDto를 생성.

EmailDto에 만들어둔 메서드로 SendEmailRequest 타입으로 만들어준 후, sendEmail 메서드를 통해 이메일 전송.

EmailController

@RestController
@RequiredArgsConstructor
public class EmailController {

    private final EmailService sendEmailService;

    //이메일 전송 API
    @PostMapping("api/sendEmail")
    public String sendEmail() throws Exception {
        //받는이
        List<String> receivers = new ArrayList<>();
        receivers.add("wsnam0418@gmail.com");
        //제목
        String subject = "SES Test";
        //본문
        String content = "이메일 전송 테스트";

        sendEmailService.send(subject, content, receivers);
        return "true";
    }
}

이메일 전송을 위한 Controller.

미리 정보를 입력해주었음.

실행결과

이메일 전송 완료~!

참고

https://shinsunyoung.tistory.com/112

profile
깃헙에 올린 예제 코드의 설명을 적어놓는 블로그
post-custom-banner

0개의 댓글