• JavaScript_NodeJS. Nodemailer를 이용해 메일을 보내자.

    2020. 11. 22.

    by. KAEY

    https://nodemailer.com/about/
    공식 사이트에서 제공하는 NodeMailer의 특징.

    1. NodeMailer

    웹페이지를 개발할 때, 메일 전송 시스템은 아이디 및 비밀번호 찾기를 할 때도 쓰이고, 회원가입을 진행할 때 어뷰징을 방지하기 위해서 회원 개인의 이메일을 통해 중복 방지 등을 위해 사용하는 경우가 많다.

    이러한 시스템을 사용하기 위해 쓰는 NodeMailer는 Node 서버에서 메일을 전송할 수 있게 해주는 모듈이다. 단 구글 계정을 이용할 경우 일일 500개의 메일만을 보낼 수 있으므로 대규모의 사용자를 다루는 사이트에서 사용하기엔 적합하지 않다.

    그 외에 mailgun, AWS SES 등 다양한 모듈도 있지만, 간단하게 실습해볼 수 있는 NodeMailer를 실습하는 과정을 담아보겠다. 

     

    2. 설치 및 첨부

    npm install nodemailer

     

    const nodemailer = require('nodemailer');

     

     

    3. 예제

    해당 예제에서는 사용자에게 이메일 주소를 받지 않고, 내부 코드에서 지정한 메일로 전송될 수 있게 했다.

     

    views > index.html

    <!DOCTYPE html>
    <html>
    <head>
        <link rel='stylesheet' href='/stylesheets/style.css' />
    </head>
    <body>
    <form action="/index/post" method="post">
        <input type="submit" value="회원가입">
    </form>
    </body>
    </html>

    mailroutes > index.js

    const express = require('express');
    const nodemailer = require('nodemailer');
    const router = express.Router();
    const dotenv = require('dotenv');
    dotenv.config(); //dotenv파일에서 콘피그함수 호출.
    const crypto = require('crypto');
    
    router.post('/post', function(req, res, next){
      
      const transporter = nodemailer.createTransport({
        service: 'gmail',
        port: 465,
        secure: true,
        auth: {
            user: process.env.NODEMAILER_USER,
            pass: process.env.NODEMAILER_PASS,
        }
      });
    
      const mailOptions = {
        from: process.env.NODEMAILER_USER,    // 발송 메일 주소
        to: '받는 사람의 이메일 주소를 입력.' ,     // 수신 메일 주소
        subject: '인증 테스트',   // 제목
        html: ''
          // 내용
      };
    
      transporter.sendMail(mailOptions, function(error, info){
        if (error) {
          console.log(error);
        }
        else {
          console.log('Email sent: ' + info.response);
        }
      });
    
      res.redirect("/");
    })
    
    module.exports = router

    .env 

    NODEMAILER_USER= "전송할 주체가 될 계정의 아이디"
    NODEMAILER_PASS= "전송할 주체가 될 계정의 비밀번호"

     

    약간의 보안성이라도 높이기 위해  .env를 사용했으나 결국에는 유출될 가능성이 존재한다.

    그 외에 app.js에서의 서버 구동 내용은 [   ] 에서 확인할 수 있다.

     

    transporter = nodemailer.createTransport 의 객체는 transporter 에 대한 환경설정을  할 수 있는 부분이다.

    이곳의 환경설정을 마치면 메일을 전송할 수 있는 객체가 생성된다. 

     

    transporter.sendMail(mailOptions, function(error, info) 의 메서드를 호출하면 메일을 전송할 수 있게 된다. 첫 번째 정보인 mailOptions에서 설정한 메일의 관련된 내용을 담아서 전송한다. 그리고 두 번째 인자는 콜백으로 오류에 대한  정보를 담아 서버에서 확인할 수 있다.

     

    이렇게 하면 기본적인 Nodemailer의 예제를 다 작성하였다. 하지만 이렇게만 하여 실행하면 오류가 발생한다.

     

    이러한 오류가 발생한다.

    이는 구글뿐 아니라 네이버나 다른 웹사이트를 이용한다 하여도 발생하는데, 이는 보안상의 문제이다.

    구글의 예로 들을 것이지만, 네이버나 다른 웹사이트도 동일하게 사용자의 비밀번호를 원형 그대로 보관하는 것이 아니라 각자의 사이트 규정에 맞게 비밀번호를 가공하여 관리하는데, 우리가 입력한 비밀번호는 원형으로 제공하기 때문에, 충돌의 오류가 발생한다.

     

    이는 구글 계정의 설정으로 가서, 

     

     

    보안 > 보안 수준이 낮은 앱의 엑세스를 클릭.

    보안 수준이 낮은 앱 허용을 사용으로 바꾸면 올바르게 메일이 전송됨을 알 수 있다.

     

    테스트가 끝날 때 사용하는 주 계정이라면 보안상의 문제가 생길 수 있으므로, 해당 옵션을 반드시 꺼야한다.

     

    해당 테스트 계정의 이름으로 보내진 메일이 구글과 네이버에서 확인된다.

     

    댓글 (비로그인 댓글 허용하지 않습니다.)