[Back-end] Node.js에서 메일 전송하기 (feat. Nodemailer & Gmail)

조성철 (JoSworkS)·2020년 5월 1일
11
post-thumbnail

WDMA를 이용하기 위해서는 직원이 사용하는 이메일을 인증하는 과정이 필요하며, 이메일이 인증된 계정에 한해 관리자 등록(계정 생성)이 가능하다.

이에 따라, 사용하려는 이메일이 실제로 직원이 이용하는 실제 계정인지를 인증하기 위해 인증번호를 메일로 보내는 방식을 적용하기로 하였다.

그러면 Node.js에서 이메일 전송 모듈로 유명한 Nodemailer를 이용한 인증번호 전송 과정을 알아보도록 하겠다.

Nodemailer

Nodemailer is a module for Node.js applications to allow easy as cake email sending. The project got started back in 2010 when there was no sane option to send email messages, today it is the solution most Node.js users turn to by default.
출처: https://nodemailer.com/about/

노드메일러는 위에 문장처럼 Node.js에서 메일 전송을 가능하게 해주는 모듈이며, 가장 일반적으로 사용되고 있다고 한다.

특징으로는 기본적으로 SMTP 외에도 다양한 전송 방식을 지원하고 있으며, Unicode 인코딩을 지원하여 이모지를 사용하는 것도 가능하다.

지원하는 전송 방식

  • sendmail – for piping messages to the sendmail command
  • SES – is a Nodemailer wrapper around aws-sdk to send mail using AWS SES
  • stream – is just for returning messages, most probably for testing

Gmail을 이용한 메일 전송 방법

0. 메일 전송용 Gmail 설정하기

웹 서버에서 유저에게 메일 전송하는데 사용할 Gmail을 먼저 설정하는 방법에 대해 알아보도록 하겠다.

보안 수준이 낮은 앱 엑세스 허용
'Google 계정 관리 -> 보안 -> 보안 수준이 낮은 앱의 액세스' 를 사용으로 변경

내 Google 계정에 대한 액세스 허용
아래 링크에 접속하여 '계속' 클릭
https://accounts.google.com/DisplayUnlockCaptcha

1. 모듈 설치하기

$ npm i nodemailer

먼저, npm을 이용하여 Nodemailer 모듈을 설치한다.

2. 프로젝트로 불러오기

const nodemailer = require('nodemailer');

사용하고자 하는 서버 API에 설치한 모듈을 Require를 통해 모듈을 불러온다.

3. 전송 옵션 설정하기

  let transporter = nodemailer.createTransport({
    // 사용하고자 하는 서비스, gmail계정으로 전송할 예정이기에 'gmail'
    service: 'gmail',
    // host를 gmail로 설정
    host: 'smtp.gmail.com',
    port: 587,
    secure: false,
    auth: {
      // Gmail 주소 입력, 'testmail@gmail.com'
      user: process.env.NODEMAILER_USER,
      // Gmail 패스워드 입력
      pass: process.env.NODEMAILER_PASS,
    },
  });

createTransport 메소드를 이용하여 옵션을 설정한 후, 전송 기능을 담당하는 객체를 만든다.

각 옵션에 대한 자세한 설명은 아래 공식문서를 참고하면 도움이 된다.
출처: https://nodemailer.com/usage/

4. 메일 전송하기

  let info = await transporter.sendMail({
    // 보내는 곳의 이름과, 메일 주소를 입력
    from: `"WDMA Team" <${process.env.NODEMAILER_USER}>`,
    // 받는 곳의 메일 주소를 입력
    to: email,
    // 보내는 메일의 제목을 입력
    subject: 'WDMA Auth Number',
    // 보내는 메일의 내용을 입력
    // text: 일반 text로 작성된 내용
    // html: html로 작성된 내용
    text: generatedAuthNumber,
    html: `<b>${generatedAuthNumber}</b>`,
  });

3에서 설정한 전송 옵션을 바탕으로 만들어진 transport 객체에 보내는 곳, 받는 곳, 제목, 내용을 넣어 메일을 전송하는 부분이다.

샘플 소스코드

const main = async () => {
  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,
    },
  });

  // send mail with defined transport object
  let info = await transporter.sendMail({
    from: `"WDMA Team" <${process.env.NODEMAILER_USER}>`,
    to: email,
    subject: 'WDMA Auth Number',
    text: generatedAuthNumber,
    html: `<b>${generatedAuthNumber}</b>`,
  });

  console.log('Message sent: %s', info.messageId);
  // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>

  res.status(200).json({
    status: 'Success',
    code: 200,
    message: 'Sent Auth Email',
  });
};

main().catch(console.error);

작동 테스트

Postman을 이용하여 메일인증 서버 API로 이메일 주소를 담아 POST 메소드 Request 하였다.
설정한 Gmail 주소로 부터 제목, 내용 문제없이 메일이 오는 것을 확인할 수 있다.

참고 자료

0개의 댓글