본문 바로가기

백엔드

[Node.js] nodemailer로 이메일 인증 구현하기

nodemailer

Node.js에서 사용하는 이메일 전송 라이브러리이다. 이번 문서에서는 이메일로 인증코드를 보내 클라이언트에서 해당 인증 코드를 입력하면 회원가입이 계속해서 진행되는 예제를 다룬다.

 

구현과정

  1. 기본 셋업
  2. 구현

1. 기본 셋업

먼저 nodemailer 라이브러리와 dotenv, ejs를 설치해준다.

dotenv는 node 프로젝트에서 전역적으로 사용되는 변수를 정의할 수 있는 라이브러리이다. 여기에는 보통 중요 정보(비밀번호, 키값) 등이 저장되어 깃허브에서 추적하지 않게 .gitignore에 등록해야 한다. 그리고 ejs는 이메일로 전송될 내용이 담겨있다.

npm install dotenv nodemailer ejs

 

그리고 메일을 전송하는데에 사용할 계정에 대한 정보를 수정한다. 이번 문서에서는 gmail을 이용하여 전송할 것이다.

gmail->계정관리->보안->보안수준이 낮은 앱의 엑세스를 허용한다.

 

2. 구현

프로젝트 기본 폴더에 .env 폴더를 생성하여 다음과 같이 작성한다.

NODEMAILER_USER=메일 보내는 ID
NODEMAILER_PASS=비밀번호

 

그리고 프로젝트 기본 폴더에서 template 폴더를 생성하고 그 안에 authMail.ejs라는 파일을 생성하여 다음과 같이 작성한다.

<html>
<body>
  <div>
    <p style='color:black'>회원 가입을 위한 인증번호 입니다.</p>
    <p style='color:black'>아래의 인증 번호를 입력하여 인증을 완료해주세요.</p>
    <h2><%= authCode %></h2>
  </div>
</body>
</html>

 

그다음은 auth.js라는 이름의 라우터를 작성한다.

const express = require('express');
const router = express.Router();
const nodemailer = require('nodemailer');
const ejs = require('ejs');
const path = require('path');
var appDir = path.dirname(require.main.filename);


router.post('/mail', async(req, res) => {
    let authNum = Math.random().toString().substr(2,6);
    let emailTemplete;
    ejs.renderFile(appDir+'/template/authMail.ejs', {authCode : authNum}, function (err, data) {
      if(err){console.log(err)}
      emailTemplete = data;
    });

    let transporter = nodemailer.createTransport({
        service: 'gmail',
        host: 'smtp.gmail.com',
        port: 587,
        secure: false,
        auth: {
            user: process.env.NODEMAILER_USER,
            pass: process.env.NODEMAILER_PASS,
        },
    });

    let mailOptions = await transporter.sendMail({
        from: `곰방`,
        to: req.body.mail,
        subject: '회원가입을 위한 인증번호를 입력해주세요.',
        html: emailTemplete,
    });


    transporter.sendMail(mailOptions, function (error, info) {
        if (error) {
            console.log(error);
        }
        console.log("Finish sending email : " + info.response);
        res.send(authNum);
        transporter.close()
    });
});

module.exports=router;

위 코드를 간단하게 설명하면 랜덤한 번호를 생성하여 위에서 정의한 템플릿의 내용으로 메일을 보낸다. 메일이 성공적으로 보내지면 클라이언트 측으로 인증번호를 전송한다. 이후 클라이언트 측에서 받은 인증번호와 유저가 입력한 인증번호가 일치한다면 계속해서 회원가입 절차가 진행된다.

 

결과 화면