nodemailer 를 이용하여 메일 인증 보내기

윤성준·2023년 10월 15일
0

first react project

목록 보기
8/17
post-thumbnail

오늘은 nodemailer 모듈을 이용하여 메일 인증을 보내보려고 한다.

nodemailer는 node서버에서 메일을 보낼 수 있는 메일 전송 모듈이다.

나는 사용자가 비밀번호를 잊어버렸을때 사용자가 입력한 메일을 통해 임시 비밀번호를 받게 하고 그 임시 비밀번호로 로그인 하게끔 만들어 줄 것이다.

  1. nodemailer 를 설치해준다.
npm install nodemailer
  1. 사용자의 정보가 들어갈 config 폴더를 만들어주고 그 폴더 안에 senderInfo.js 파일을 만들어준다.
    사용자의 정보가 들어가 있는 파일이기 때문에 gitIgnore 파일에 추가시켜준다.(github에 올라가지 않게 하기 위해..)
config/senderInfo.js

{
  "user": "본인의 이메일",
  "pass": "이메일 비밀번호"
}
  1. routes 폴더 안에 mail.js 파일을 만들어준다.
// 메일발송 객체
const mailSender = {
    // 메일발송 함수
    sendGmail: function (param) {
        var transporter = nodemailer.createTransport({
            service: 'gmail',   // 메일 보내는 곳
            prot: 587,
            host: 'smtp.gmlail.com',
            secure: false,
            requireTLS: true,
            auth: {
                user: senderInfo.user,  // 보내는 메일의 주소
                pass: senderInfo.pass   // 보내는 메일의 비밀번호
            }
        });
        // 메일 옵션
        var mailOptions = {
            from: senderInfo.user, // 보내는 메일의 주소
            to: param.toEmail, // 수신할 이메일
            subject: param.subject, // 메일 제목
            text: param.text // 메일 내용
        };

        // 메일 발송    
        transporter.sendMail(mailOptions, function (error, info) {
            if (error) {
                console.log(error);
            } else {
                console.log('Email sent: ' + info.response);
            }
        });

    }
}

module.exports = mailSender;

구글의 정책 변경
구글의 정책 변경으로 인해 구글 메일을 보내려면 인증을 설정 해야 한다.

  1. 2차 인증을 켜야 한다.

2.앱 비밀번호를 생성해야한다.

  1. index.js 파일에 클라이언트에서 받아오는 api 코드를 짜도 되지만 나는 routes 폴더에서 api 파일을 짜고 있기 때문에 그대로 routes 폴더 안에 있는 mail.js 파일에 api 코드를 짰다.
router.post('/mail', async (req, res) => {
    try {
        const randomPw = Math.floor(Math.random() * 10000)
        const { email } = req.body;
        console.log('email: ', email);

        let emailParam = {
            toEmail: email,     // 수신할 이메일
            subject: '모두의 레시피에서 임시 비밀번호를 보내드립니다.',   // 메일 제목
            //메일 내용
            text:
                //임시 비밀번호 생성
                `임시 비밀번호 : ${randomPw}`
        };
        mailSender.sendGmail(emailParam);
        await User.update({ password: getHash(String(randomPw)) }, {
            where: {
                email: email,
            }
        })
        res.status(200).send("성공");
    }
    catch (err) {
        console.log('err: ', err);
    }
})

module.exports = router;

랜덤한 비밀번호 4자리를 받게하고 인증을 하고 비밀번호를 받자마자 DB의 비밀번호를 getHash 함수로 감싸주고 변경해주었다.

사용자가 클라이언트 화면에서 이메일 전송을 누르면 임시 비밀번호가 보내지게 된다.

profile
반갑습니다

0개의 댓글