node-express 서버로 필요한 데이터 메일로 보내기

Hazel_Song·2020년 10월 25일
0

SERVER_EXPRESS

목록 보기
11/11

프로젝트를 진행하며, 비밀번호 찾기 기능을 구현하기로 하였고,
우선은 기본적으로 비밀번호 찾기 화면에서 주어진 정보가 있다면,
해당하는 비밀번호를 고객 데이터로 저장된 메일로 보내주는 것을 구현하고자 했다.

  • 우선 주어진 데이터를 바탕으로 비밀번호 찾는 쿼리문은, 아이디찾기 기능에서도 활용된 부분이고 자주 사용하는 sequelize 쿼리문이므로 메일 보내는 기능부터 본격적으로 정리하고자 한다.

비밀번호 찾고 메일 보내는 로직

  1. 프론트에서 비밀번호 찾기 화면으로 이동 후에, 필요한 정보
    (이땐 이메일과, 깃헙아이디)를 post 메소드로 서버로 보낸다.
  2. 서버에서는 주어진 정보 기준으로 데이터가 있으면, 데이터를 반환해주고,
    그 데이터에서 비번과 메일을 추출한다. 없으면 에러메시지 반환

비밀번호 찾은 후에 메일로 전송해주기

NODEMAILER 모듈 설치하기

nodemailer 관련 참고글

비밀번호 찾기 구현한 서버 코드

const { users } = require('../../models');
//우리가 사용자의 데이터를 저장해두고 찾는 테이블
const nodemailer = require('nodemailer');
//nodemailer 모듈 설치

const user = process.env.findpw_mail;
const password_send = process.env.findpw_pw;
//이건 저희 개별 계정으로 연습?하거나 흠 각자의 서버에 저장된 개인 메일이나 비번을 활용하는게 좋을거 같아서 환경변수 설정함.

module.exports = {
  post: (req, res, next) => {
    const { useremail, githubId } = req.body;
    users
      .findOne({
        where: {
          email: useremail,
          githubId: githubId,
        },
      })
      .then((data) => {
        if (!data) {
          res.status(400).send('informations are not matched or have to sign up ');
        } else {
          const useremail = data.email;
          const password = data.password;
          //이건 보내는 사람의 정보를 입력하는 것(즉 서비스 제공자)
          let transporter = nodemailer.createTransport({
            service: 'gmail',
            //지메일의 경우, 보내는 사용자의 계정이 보안수준이 낮은 접근 허용불가로 되어있으면 에러가 나는 경우가 있으므로 참고
            auth: {
              user: user,
              pass: password_send,
            },
          });
          //메일 보내는 실질적은 내용 구성
          let mailOptions = {
            from: user, //보내는 사람 메일주소
            to: useremail, //받는 사람 메일주소
            subject: 'S*FU Password 찾기',
            html: `<p>${useremail} 계정의 임시 비밀번호는 <strong>${password}<strong>입니다.</p>`, // 메일내용
          };
          transporter.sendMail(mailOptions, function (error, info) {
            if (error) {
              console.log(error);
              next(error);
            } else {
              console.log('Email sent: ' + info.response);
              return res.status(200).json({ success: true });
            }
          });
        }
      })
      .catch((err) => {
        res.status(500).send('err');
      });
  },
};

우와...엄청 복잡한 기능이라 생각했는데 진짜 간단했다 ㅠㅠ
모듈 만세...ㅠㅠ
이거 활용해서 엄청나게 많은 것들을 할 수 있을거 같아

profile
코드 한 줄로, 세상의 가치를 만들자🌟

0개의 댓글