
기존에 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);
});
}
}