Amazon Simple Email Service(SES) 란?
Amazon Simple Email Service(Amazon SES)를 사용하면 Simple Mail Transfer Protocol(SMTP) 이메일 서버를 온프레미스에 유지하지 않고도 Amazon SES API 또는 SMTP 인터페이스를 사용하여 고객과 안전하게 소통할 수 있습니다.
실제로 Spring 에서 email 을 보내기 위해 라이브러리를 사용했던적이 있습니다. ( 네이버 이메일로 작업했습니다 )
implementation 'org.springframework.boot:spring-boot-starter-mail'
하지만 AWS 에서도 이메일 서버 API 지원을 해주는것이 있고, 가격도 저렴하여 써보기로 하였습니다.
- 위와 같이 3개의 선택이 있지만 전송 도메인 확인으로 DNS 공급자를 추가하여 자격 증명하는 방법을 선택하였습니다.
- 여기서 도메인을 선택합니다
- 이런식으로 뜨게 되고, 도메인에 현재 쓰고 있는 도메인을 입력합니다. 그리고 다른 설정을 안 건들인채 자격 증명 생성하면 됩니다. ( 리전지역이 서울인것을 확인하고 작업해주세요 )
- 그리고 왼쪽 메뉴에 자격 증명을 클릭하면 됩니다.
- 이런식으로 나오게 됩니다. 다만 보안 인증 상태가 확인됨이 아니여야 합니다. ( 미리 설정해놨기 때문에 확인됨 이라고 표시된겁니다 ) 도메인을 클릭하고 아래에 내려다보면 DNS 레코드 게시 라는것이 있을겁니다 눌러주세요!
- 그러면 위와 같이 3개의 CNAME 의 유형인 Name, Value 값이 나오게 됩니다.
이걸 Router S3 이나 cloudflare 에 추가 하면 아까 봤던 보안 인증 상대에 확인됨 이라고 표시가 된다면 성공입니다.
( 설정 바꾸는데에 5~10분 더 걸릴수 있으므로 조금 기달려 주시면 됩니다 )
- 이런식으로 뜨게 됩니다. 하지만 저는 AWS 에 있는 고객센터에 승인을 해줘야 가능하다고 해서 문의를 따로 남겨놔서 모자이크 처리 하였습니다. 이제 IAM 작업과 Spring 작업만 하면 됩니다!
- 여기에 SMTP 보안 인증 생성을 눌러주시면 됩니다.
- 이런식으로 사용자가 자동으로 생성하게 되어 있습니다.
- 생성하게 되면 accessKey 와 secretKey 가 나오게 되는데 이거는 반드시 따로 적어놓으셔야 합니다!
나중에 정책을 바꾸시면 됩니다.
저는 이런식으로 정책을 바꿔놨습니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ses:SendRawEmail",
"ses:SendEmail"
],
"Resource": [
"arn:aws:ses:ap-northeast-2:계정ID:identity/도메인",
"arn:aws:ses:ap-northeast-2:계정ID:configuration-set/도메인"
],
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"허용할 IP/32"
]
}
}
}
]
}
위와 같이 등록한 도메인과 허용할 IP 를 적어주고 아래 그림처럼 계정ID 를 통해 맞게 정책을 설계후 사용자에 정책을 적용해주시면 됩니다. 기존꺼는 삭제해주세요
Spring 에서 AWS SES 통해 이메일 전송
private void sendEmail(String to, String subject, String body) throws UnsupportedEncodingException, MessagingException {
Properties props = System.getProperties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.port", PORT);
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(email, fromName));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
msg.setSubject(subject, StandardCharsets.UTF_8.name());
msg.setText(body, StandardCharsets.UTF_8.name(), "html");
Transport transport = session.getTransport();
try {
transport.connect(HOST, accessKey, secretKey);
transport.sendMessage(msg, msg.getAllRecipients());
} catch (Exception ex) {
System.out.println("Error message: " + ex.getMessage());
} finally {
transport.close();
}
}
위의 코드처럼 쓰게 되면 이메일이 발송하게 됩니다.
HOST : email-smtp.ap-northeast-2.amazonaws.com
PORT : 587
를 쓰고 있고,
accessKey 와 secretKey 는 아까 SES 에서 준 키를 복붙하시면 됩니다.
공식문서
'AWS' 카테고리의 다른 글
AWS Cloud9 IDE (0) | 2023.09.19 |
---|---|
LoadBalancer (1) | 2023.08.31 |
ElastiCache - Redis 설정 (0) | 2023.08.29 |
AWS scale-up (0) | 2023.08.24 |
Swap (0) | 2023.08.18 |