2019. 08. 11 수정

AWS SES는 이메일을 전송해주는 서비스입니다.

( SES 대한 자세한 내용은 여기를 참고해주세요 ! )

서비스를 운영할 때, 회원에게 프로모션을 발송한다든지, 아이디/비밀번호 찾기 할 때 이메일을 전송하기 위한 목적으로 이메일 전송 기능이 필요합니다.


이번 글에서는 회원이 비밀번호 찾기 버튼을 눌렀을 때 회원의 이메일로 임시 비밀번호를 전송하는 예제를 구현해보도록 하겠습니다.

예제에서 DB는 사용하지 않고 회원이 존재한다는 가정하에 진행하겠습니다.


또한 예제를 구현하기 위해서는 AWS 계정에서 sandbox 환경을 나가거나, verified email이 필요합니다. ( 위의 링크 참고 )





1. 준비작업

SES를 사용하기 위해서는 aws-sdk 모듈이 필요하며, AWS 계정의 Access Key, Secret Key가 필요합니다.

이 작업은 여기를 참고하여 진행해주세요.


위의 작업내용에서 SES 환경에 맞게 조금 수정합니다.

/routes/index.js

const express = require('express');
const router = express.Router();
const AWS = require("aws-sdk");
AWS.config.loadFromPath(__dirname + "/../config/awsconfig.json");
AWS.config.update({ region: "us-west-2" });

let ses = new AWS.SES();

router.get('/login', function(req, res, next) {
res.render('login');
});

module.exports = router;

SES는 서울 region이 없으므로 그나마 가까운 Oregon region을 이용해야 합니다.

환경 설정 파일( awsconfig.json )은 그대로 둔 상태에서 region을 수정하는 방법은 aws-sdk 모듈 객체에서 config의 update()메서드를 호출하면 됩니다.

AWS.config.update({ region: "us-west-2" });


그리고 aws-sdk 모듈 객체에서 생성자 함수로 SES 객체를 생성합니다.



이제 SES API를 사용할 준비가 끝습니다.





2. 뷰 페이지 작성

이메일을 보내기 위한 트리거 역할로 "비밀번호 찾기" 상황을 가정했습니다.

이에 대한 뷰페이지를 작성하면 다음과 같습니다.

/routes/login.ejs

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>로그인</h1><hr>
<h2>비밀번호를 잊으셨나요? </h2>
<form action="/pwdSearch" method="post">
<input type="submit" value="비밀번호 찾기">
</form>
</body>
</html>

대부분 "비밀번호 찾기"는 로그인 페이지 존재하므로 로그인 페이지라 가정을 하였습니다.

또한 이번 예제는 메일로 임시 비밀번호를 보내는 것이 목적이므로 DB는 사용하지 않을 것입니다.





3. 라우터 함수 작성

다음은 SES를 사용하는 방법에 대해 알아보겠습니다.

우선은 코드를 작성하면 다음과 같습니다.

( AWS SES에 대한 API 공식 문서는 여기를 참고해주세요. )


/routes/index.js

const express = require('express');
const router = express.Router();
const AWS = require("aws-sdk");
AWS.config.loadFromPath(__dirname + "/../config/awsconfig.json");
AWS.config.update({ region: "us-west-2" });

let ses = new AWS.SES();

let params = {
Destination: {
ToAddresses: ["foo@example.com"], // 받는 사람 이메일 주소
CcAddresses: [], // 참조
BccAddresses: [] // 숨은 참조
},
Message: {
Body: {
Text: {
Data: makeRandomStr(), // 본문 내용
Charset: "utf-8" // 인코딩 타입
}
},
Subject: {
Data: "SES 테스트 중입니당", // 제목 내용
Charset: "utf-8" // 인코딩 타입
}
},
Source: "foo@example.com", // 보낸 사람 주소
ReplyToAddresses: ["admin@help.me"] // 답장 받을 이메일 주소
}

function makeRandomStr(){
var randomStr = "";
var possible = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

for( let i = 0; i < 8; i++ ){
randomStr += possible.charAt(Math.floor(Math.random() * possible.length));
}
return randomStr;
}


router.post("/pwdSearch", function(req, res, next){
ses.sendEmail(params, function(err, data){
res.send(data)
})
});


router.get('/login', function(req, res, next) {
res.render('login');
});

module.exports = router;

1) post 요청 라우터 미들웨어

"비밀번호 찾기" 버튼을 누르면 실행되는 /pwdSearch 경로의 post 요청 라우터 미들웨어입니다.

  • 메일을 보내려면 ses.sendEmail() 메서드를 호출합니다.
  • 인자로 메일의 제목, 내용, 받는 사람 등을 정의한 객체를 전달합니다.
    • 이 객체를 정의한 부분이 params 변수입니다.
    • params 객체의 각 프로퍼티에 대한 설명은 주석으로 작성했으며, API명이 직관적이므로 쉽게 이해하실 수 있을 것입니다.



2) 샌드박스 환경 나가기

AWS 계정에서 샌드 박스 환경을 나가지 않았다면 아무에게나 메일을 보낼 수 없습니다.

이는 AWS 정책으로서 스팸 방지 목적이며, 이메일 수신을 동의한 이메일 계정에게만 이메일을 보낼 수 있으므로 샌드박스 환경을 나가시거나,

테스트 용으로 특정 이메일 계정을 verified 해주셔야 합니다.

( 실제 웹 서비스를 운영하시려면 샌드박스 환경을 나가셔야겠죠? )


보낸 사람 이메일 주소 역시 SES에서 확인된 이메일 계정만 보낼 수 있습니다.



3) 임시비밀번호 생성 함수

마지막으로 이번 예제는 "비밀번호 찾기" 버튼을 누르면 임시 비밀번호를 전송하는 것이 목적이였습니다.

그래서 makeRandomStr() 함수를 작성하였습니다.




이제 테스트를 진행하기 위해 브라우저에서 localhost:3000/login 를 요청하여 "비밀번호 찾기" 버튼을 눌러주세요.

그리고 실제로 메일이 왔는지 확인해보세요.




이상으로 AWS SES를 사용하여 메일을 보내는 기능을 구현해보았습니다.

소개한 API 외에 다른 API는 공식 문서 링크에서 확인하시길 바랍니다.