상세 컨텐츠

본문 제목

[SES] AWS Simple Email Service 맞춤형 이메일 보내기 (Java)

프로그래밍/AWS

by jisooo 2019. 8. 11. 10:43

본문

 
[SES] AWS Simple Email Service 맞춤형 이메일 보내기 (Java)
2019. 3. 4. 13:42

 

 

 

AWS의 많은 서비스를 spring boot 프로젝트에 연동하여 사용중인데,
오늘은 SES 서비스를 이용하여 맞춤형 이메일 보내기에 대해 포스팅을 한다.

 

정형화된 메일 템플릿 형식으로 예를들어 회원가입, 주문안내, 인증메일 같은 메일을 보내야하는 상황들이 많다.

 

 

 

우선, AWS SES 서비스는 일정 수준까지 프리티어 용량이 있다.
 
 
 
 
 
 
Amazon EC2에 호스팅된 애플리케이션에서 이메일을 발송
매월 이메일 발송 62,000건까지는 0 USD, 이후 1,000건당 0.10 USD.
발송된 첨부 파일의 GB당 0.12 USD와 EC2 사용에 대한 추가 요금.
이메일 클라이언트 또는 다른 소프트웨어 패키지에서 이메일 발송
이메일 발송 1,000건당 0.10 USD.
발송된 첨부 파일의 GB당 0.12 USD.
이메일 수신
매월 이메일 수신 1,000건까지는 0 USD, 이후 1,000건당 0.10 USD.
이메일 청크 수신 1,000건까지 0.09 USD(자세한 내용은 요금 내역 참조).
 
EC2 인스턴스 내 서버에서 62000건 전송까지는 무료다!

 

 

 

우선, SES는 국내 서비스를 지원하지 않는다.

 

1. 지역 선택하기.
필자는 미국 서부(오레곤) 지역을 선택해서 서비스를 이용한다.
 

 

2. 발신자용 이메일 인증하기.

 

지역을 먼저 선택하고 위와같이 Email Address 메뉴에 들어간다.

 

여기서는 SES 서비스를 통해 발신자를 설정해야한다.
이곳에서 verify된 이메일 주소를 통해서만 메일을 발신할 수 있다.

 

위 "Verify a New Email Address" 버튼을 클릭하여,
발신자용 이메일 주소를 입력하면

 

해당 이메일 주소로 AWS 로부터 인증 메일이 전송된다.

 

인증메일에서 인증을 완료해주면, 해당 메일이 발신자 메일로 추가된 것을 확인할 수 있다.
 
 

 

 

3. 메일 템플릿 추가하기.

 

발신자 메일 인증까지 완료되면,
(회원가입 환영, 주문확인, 비밀번호 찾기, 회원탈퇴 인증.....etc) 등등
다양한 상황에 맞는 html 메일 템플릿을 작성해서 추가해줘야 한다.

 

메일 템플릿에서는 유동적으로 회원에 따라 특정 데이터 부분을 변수로 넘겨줘야할 상황이 있다.
이런 템플릿 코드를 예시로 작성해보겠다.
 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>비밀번호 찾기 안내 메일</title>
</head>
<body>
  ...
  ...
  ...
                    <p>안녕하세요, {{member_name}}님</p>
                    <p>비밀번호 변경 안내드립니다.</p>
                </div>
                <div>
                    <a href="{{password_url}}">
                        <div>비밀번호 변경하기</div>
                    </a>
                </div>
              
            </div>
        </div>
    </div>
</div>
</body>
</html>
위와 같이 전달시킬 변수는 {{변수명}} 과 같이 표현한다.

 

위 템플릿을 이용하여 메일을 전송할 때,
API 상에서 위에서 선언된 변수 데이터를 같이 전달해줘야한다.
 
 
 
 

 

 

 

 

4. SES API 연결 (템플릿 추가, 삭제 / 메일 전송)

 

필자는 위와 같이 메일 템플릿 추가, 삭제, 메일 전송 서비스를 Java API를 연동해서 사용하였다.

 

 

 

1) pom.xml 에서 AWS ses dependency를 추가한다.
 
 
 <!-- Amazonaws SES -->
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-ses</artifactId>
        </dependency>

 

 

 

2) Configuration 클래스에서
AWS Access key, Secret key 값을 이용해서 credential 자격 증명 Bean (AWSCredentials 타입)을 추가한다.

 

 
 
 
@PropertySource("classpath:aws.properties")
@Configuration
public class AmazonWebServiceConfig {
	
	@Value("${accesskey}")
	private String ACCESS_KEY;
	
	@Value("${secretKey}")
	private String SECRET_KEY;
	
	@Value("${endPoint}")
	private String END_POINT;
	
	@Bean
	public AWSCredentials AWSCredentials() {
		AWSCredentials awsCredentials = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
		return awsCredentials;
	}
	
 

 

필자는 configuration 클래스에서 AWS의 accey key, secret key는 외부 프로퍼티 파일에 작성하고,
해당 프로퍼티 값을 변수에 주입하는 방식을 사용하였다.
위 두 값을 이용하여 AWSCredentials Bean을 추가한다.

 

 

 

3) 위의 Configuration 클래스에서 AmazonSimpleEmailService 빈도 추가해준다.
 
 
	@Bean
	public AmazonSimpleEmailService AmazonSimpleEmailService() {
		AmazonSimpleEmailService client = AmazonSimpleEmailServiceClientBuilder.standard()
				.withCredentials(new AWSStaticCredentialsProvider(AWSCredentials()))
				.withRegion("us-west-2")
				.build();
		return client;
	}
 

 

 

위까지 작성하면 config 파일 작성은 끝이다.

 

이제 API를 연동해서 템플릿을 추가하는 코드를 보자.

 

필자는 Service 클래스에서 위 SES 빈을 주입해서 각 메소드를 호출하여 템플릿 추가, 삭제, 메일전송 같은 서비스를 사용하였다.

 

 

 
@Service
public class MailService {

...
...
	@Autowired
	AmazonSimpleEmailService amazonSESServiceClient;
 
 

 

 

템플릿을 추가하는 메소드를 별도로 작성해서, 컨트롤러에서 Service의 템플릿 추가 메소드를 호출하도록 작성하였다.
 
public void createTemplate(String subjectPart, String templateName, String textPart, String htmlPart) {
		Template template = new Template();
		template.setSubjectPart(subjectPart);
		template.setTemplateName(templateName);
		template.setTextPart(textPart);
		template.setHtmlPart(htmlPart);
		CreateTemplateRequest request = new CreateTemplateRequest().withTemplate(template);
		CreateTemplateResult result = amazonSESServiceClient.createTemplate(request);
	}
 
 
Template 객체를 보면 제목, 템플릿명, text 부분, html 부분을 설정할 수 있다.
일반적으로 메일 템플릿을 작성할 때, 순수 텍스트 말고 html을 이용하므로
일반적으로 메소드 호출할 때 textPart 부분은 null을 넘겨주고 htmlPart 부분에 html 코드만 전달한다.

 

 

 

* html을 추출하는 부분도 메소드로 따로 생성하여 Files.toString 메소드로 추출하였다.
 
 
public String get_html_content(String file_path) throws IOException {
		String content = Files.toString(new File(file_path), Charsets.UTF_8);
		return content;
}
 

 

위처럼 템플릿을 추가해주면,
 
AWS SES console 창의 Email Templates 메뉴에서 금방 생성한 템플릿명이 추가된 것을 확인할 수 있다.
(위 캡쳐화면은 그냥 빈화면. 메뉴 화면 보여주려고 추가했다.)

 

 

 

 

기타 응용 메소드는 AWS SES API 공식 문서에 잘 정리되어 있으니 참고하고,

 

핵심인 템플릿용 전송 메일 메소드만 설명하겠다.
 
 
// 공용 템플릿으로 사용 가능한 메소드
	public void sendMail(Collection<String> destination, String sender, String template_name, Map<String, String> template_data) {
		SendTemplatedEmailRequest request = new SendTemplatedEmailRequest();
		Destination des = new Destination();
		des.setToAddresses(destination);

		request.setTemplate(template_name);
		request.setSource(sender);
		request.setDestination(des);
		
		String jsonString = new Gson().toJson(template_data);
		
		request.setTemplateData(jsonString);

		SendTemplatedEmailResult result = amazonSESServiceClient.sendTemplatedEmail(request);
	}
 
SendTemplatedEmailRequest 에서는 메일 요청 객체인데
수신자 이메일, 전송할 템플릿명, 발신자 이메일, 템플릿에서 동적으로 전달할 데이터 들을 설정한다.

 

먼저 발신자 이메일은 2번에서 설정된 verify된 메일로 설정하여야 오류가 나지 않는다.
또한 수신자 메일은 Collection<String> 타입으로 설정할 수 있어, 여러 명의 수신자를 설정할 수 있다.
전송할 템플릿명은 위에서 반드시 추가한 템플릿이여야 하며, 등록되지 않는 템플릿명을 입력할 경우 메일 전송이 되지 않는다.
마지막 template data는 메일 템플릿에서 {{member_name}} 과 같이 동적으로 변형시킬 데이터들을 추가해준다.

 

template data 타입은 Map<String, String> 타입인데
첫번째 String은 데이터 이름, 위 템플릿 예시에서는 "member_name" 이 되겠다.
두번째 String은 데이터의 값, 예시로 "Kim" 같이 값을 넣어주면 된다.
 
 
Map<String, String> data = new HashMap<String, String>();

data.add("member_name", "kim");
data.add("password_url", "https://www.....");
 
위 예시와 같이 템플릿코드에 표현된 변수들을 Map 객체에 모두 추가시키고,
해당 Map 객체를 한꺼번에 JSON으로 변환하여 SendTemplatedEmailRequest에 설정한다.

 

Map 타입을 JSON으로 변환하는 방법은, GSON 라이브러리를 통해 간단히 구현한다.
그러면 Map에서 모두 추가한 값들이 문자열 타입의 json으로 변환된다.
 
String jsonString = new Gson().toJson(data);

 

이제 SES Bean을 통해 sendTemplatedEmail 메소드를 호출해주면 메일 전송을 수행한다!

 

 

 

 

 

 

 

이외에 다른 기능들의 API도 공식문서에 잘 정리되어있으니
공식 문서를 잘 활용해서 작성해보도록 하자..
 
 
 

 

 

 
 

AWS SDK for Java를 사용하여 이메일 전송 - Amazon Simple Email Service

AWS SDK for Java를 사용하여 이메일 전송 다음 절차에서는 Eclipse IDE for Java EE Developers 및 AWS Toolkit for Eclipse를 사용하여 AWS SDK 프로젝트를 생성하고 Java 코드를 수정하여 Amazon SES를 통해 이메일을 전송하는 방법을 보여줍니다. 중요 이 시작 자습서에서는 수신 여부를 확인할 수 있도록 자신에게 이메일을 발송합니다. 추가적인 실험 또는 로드 테스트는 Amazon SES 메일

docs.aws.amazon.com

 

 

관련글 더보기

댓글 영역