기존에 node mvc 시리즈와 다른 프로젝트이긴 한데 전 프로젝트는 무기한 연기라 현재 공부겸 개발 중인 프로젝트 기준으로 계속 시리즈를 이어가 포스팅해보겠다!
현재 node.js 기반의 웹 프로젝트를 진행하고 있는데 대구, 경산권 카페관련 다양한 서비스를 제공하는 것을 목표로 하는 중이다. 그 중 기본이 될 사용자 관련 기능들을 추가 및 리팩토링 중이다.
회원가입 등에서 본인인증 용도로 사용하기 위해 이메일 인증 기능을 추가하고자 한다.
npm 라이브러리 중 nodemailer를 사용해 구현 예정이다. nodemailer 모듈의 대표적인 장점은 다음과 같다.
SMTP
를 기본으로 하지만, sendmail
, Amazon SES
, SMTP Pool
, Direct
등 다양한 전송 방식을 지원npm i nodemailer
아래의 링크를 따라 gmail api 연동을 신청한다.
https://iamiet.tistory.com/entry/Nodemailer-Gmail-OAuth20으로-이메일-발송기능-구현하기
참고로 test로 api 신청하면 일주일 뒤에 토큰이 만료됨!
위에 링크와 같이 자신의 gmail을 통해 OAtuh2 api 신청을 하면 clientId, cliendSecret, refreshToken의 값들을 발급 받을 수 있다.
config.js에 smtp와 관련 config 추가
const dotenv = require("dotenv");
dotenv.config();
const smtp_config = {
host: "smtp.gmail.com",
port: 587,
secure: false, // true for 465, false for other ports
auth: {
type: "OAuth2",
user: process.env.GMAIL_OAUTH_USER,
clientId: process.env.GMAIL_OAUTH_CLIENT_ID,
clientSecret: process.env.GAMIL_OAUTH_CLIENT_SECRET,
refreshToken: process.env.GAMIL_OAUTH_REFRESH_TOKEN,
},
from: "youremail",
};
이제 사용자의 요청이든 필요에 따라 각 api에서 사용 가능한 특정 이메일로 전송하는 service 구현 필요
async
, await
키워드를 통해 동기로 구현 가능하지만 node server 자체에서 email을 발송하지 않고 gmail api에 의탁해 대신 메일을 발송하므로 동기적으로 처리하면 gmail에게 response를 받을 때까지 wait하는 시간이 비효율적이라고 판단해 비동기적으로 구현
// service/emailService.js
const emailService = {
sendEmail(to, subject, text, html) {
const transporter = nodemailer.createTransport(config.smtp_config);
const mailOptions = {
from: config.smtp_config.from,
to: to,
subject: subject,
text: text,
html: html,
};
transporter.sendMail(mailOptions, (err) => {
if (err) console.error(err);
});
}
}