본문 바로가기
개발일지

Nodemailer로 사용자에게 메일보내기

by 개미는뚠뚠딴 2021. 1. 27.
반응형

오늘은 nodemailer라는 모듈을 이용해 nodejs코드로 사용자에게 메일을 보내는 방법에 대해서 공부했다.

보통은 사용자에게 인증메일을 보내 유효한 메일 계정인지를 확인하기 위해 사용된다.

일단 nodemailer를 프로젝트 파일에 install 해준다.

npm install nodemailer

 

그리고 보내는 사람에 해당하는 메일 계정을 준비한다. 

나는 gmail 계정을 사용해 gmail을 이용한 사용 방법에 대해서 공부했다.

구글의 경우 보안 수준이 낮은 웹을 허용해주어야 내 계정에 엑세스가 가능하므로 꼭 허용을 해주어야 한다.

(나는 구글 로그인의 2단계 인증을 사용하므로 앱 비밀번호를 설정해주어야 했다.
2단계 인증을 사용하지 않는다면 토글버튼으로 허용하기가 뜬다.
)

관련 도움말 주소 

보안 수준이 낮은 앱의 액세스

이렇게 뜬다면 구글 계정에 들어가서 보안탭에 앱 비밀번호를 클릭해 생성해주어야 한다.

보안탭에 앱 비밀번호

비밀번호를 생성하면 16자리의 알파벳이 나오는데 이 값을 복사해두고 구글 계정의 비밀번호 대신 사용하면 된다.

생성된 앱 비밀번호

(위의 비밀번호는 보안을 위해 삭제했다.)

이제 준비가 끝났으니 코드를 작성해주면 된다. 

구글 계정 주소와 비밀번호를 auth안에 넣어주면 된다. (2단계 인증 사용시 앱 비밀번호를 비밀번호에 넣어준다.)

const nodemailer = require('nodemailer');

module.exports = async (req, res, next) => {
  const { email, title, desc, username } = req.body; // 보낼 이메일 주소, 이메일 제목, 이메일 본문, 받는 사람 이름
  try {
  // 전송하기
    let transporter = nodemailer.createTransport({
      service: 'gmail',
      host: 'smtp.gmail.com', // gmail server 사용
      port: 587,
      secure: false,
      auth: {
        user: process.env.GOOGLE_MAIL, // 보내는 사람의 구글계정 메일 
        pass: process.env.GOOGLE_PASSWORD, // 보내는 사람의 구글계정 비밀번호 (또는 생성한 앱 비밀번호)
      },
    });
    
    // 보낼 메세지
    let message = {
      from: process.env.GOOGLE_MAIL, // 보내는 사람
      to: `${username}<${email}>`, // 받는 사람 이름과 이메일 주소
      subject: title, // 메일 제목
      html: `<div // 메일 본문 -> html을 이용해 꾸며서 보낼수 있다
      style='
      text-align: center; 
      width: 50%; 
      height: 60%;
      margin: 15%;
      padding: 20px;
      box-shadow: 1px 1px 3px 0px #999;
      '>
      <h2>${username} 님, 안녕하세요.</h2> <br/> <h2>제목: ${title}</h2> <br/>${desc} <br/><br/><br/><br/></div>`,
    };
    
    // 메일이 보내진 후의 콜백 함수
    transporter.sendMail(message, (err) => {
      if (err) next(err);
      else res.status(200).json({ isMailSucssessed: true});
    });
  } catch (err) {
    next(err);
  }
};

나는 메일을 보내줄 때 좀 더 이쁘게 보내주기 위해 html쪽에 css 속성도 넣어주었다.

해당 코드는 /mail url로 라우팅을 시켜주었고 post 요청으로 받을 수 있게 해 주었다.

const mailController = require('..') // 위의 메일 작성 코드의 파일 경로
router.post('/mail', mailController);

다음은 결과물이다. 

포스트맨 요청

 

받은 메일함 캡쳐

 

이렇게 원하는 형태로 메일이 온 것을 확인할 수 있다.

반응형

댓글