스프링부트에서 AWS Simple Email Service를 사용해서 이메일을 보내는 예제를 만들어보겠습니다~!
IntelliJ
Spring Boot
java 11
gradle
dependencies {
implementation 'com.amazonaws:aws-java-sdk-ses:1.12.188'
}
아마존에서 제공하는 라이브러리를 사용하기 위해 ses 의존성 추가해줌.
aws.ses.access-key=1
aws.ses.secret-key=2
AWS 보안자격증명에서 엑세스키를 발급받아 줍니다.
https://dev.classmethod.jp/articles/beginner-amazone-ses-send-email/
@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가 있는 지역을 써주시면 됩니다.
@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 타입으로 메일을 보내야하기 때문에 미리 세팅해주는 메서드를 만들어줍니다.
@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 메서드를 통해 이메일 전송.
@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.
미리 정보를 입력해주었음.
이메일 전송 완료~!