๐Ÿ’ซ Backend/Node

[Node.js] Nodemailer๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํšŒ์›๊ฐ€์ž…์‹œ ์ด๋ฉ”์ผ ์ธ์ฆ ๊ตฌํ˜„ํ•˜๊ธฐ

JJunGyo 2024. 5. 7. 01:15
๋ฐ˜์‘ํ˜•

 

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ํšŒ์›๊ฐ€์ž…์‹œ์— ์‚ฌ์šฉ์ž์—๊ฒŒ ์ด๋ฉ”์ผ ์ธ์ฆ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ์ฐพ์•„๋ณด๋˜์ค‘

 

Nodemailer๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐœ๊ฒฌํ•ด์„œ ์‚ฌ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

 

(Nodemailer๋Š” node.js์—์„œ email์„ ์‰ฝ๊ฒŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•ด์คŒ)

 

 

Nodemailer๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ด๋ฉ”์ผ์„ ๋ณด๋‚ผ gmail ๊ณ„์ •๊ณผ ํ•ด๋‹น gmail์˜ ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค!

 

 

 

Google ๊ณ„์ • => ๋ณด์•ˆ => 2๋‹จ๊ณ„ ์ธ์ฆ์„ ํ™œ์„ฑํ™”ํ•œ ํ›„ ๊ฒ€์ƒ‰์ฐฝ์— ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ฒ€์ƒ‰ํ•ด์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค

 

 

 

 

์ด๋ ‡๊ฒŒ gmail ๊ณ„์ •๊ณผ ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” .envํŒŒ์ผ์— ์ €์žฅํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

ํ„ฐ๋ฏธ๋„์— npm i nodemailer๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์ฃผ๊ณ  

const nodemailer = requiere("nodemailer")๋ฅผ ์ด์šฉํ•ด์„œ ๋ชจ๋“ˆ์„ importํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!

 

const nodemailer = require("nodemailer");
const dotenv = require("dotenv");
dotenv.config();
const { NODEMAILER_USER, NODEMAILER_PASS } = process.env;

// ๋ Œ๋ค code ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
const generateRandomNumber = (n) => {
  let code = "";
  for (let i = 0; i < n; i++) {
    code += Math.floor(Math.random() * 10);
  }
  return code;
};

const transporter = nodemailer.createTransport({
  service: "gmail",
  auth: {
    user: NODEMAILER_USER,
    pass: NODEMAILER_PASS,
  },
});

const sendEmail = (email, code) => {
  const mailOptions = {
    from: NODEMAILER_USER,
    to: email,
    subject: "Co-Code ํšŒ์›๊ฐ€์ž… ์ธ์ฆ ์ฝ”๋“œ", // ๋ฉ”์ผ์ œ๋ชฉ
    text: `Co-Code ํšŒ์›๊ฐ€์ž… ์ธ์ฆ ์ฝ”๋“œ: ${code}`, // ๋ฉ”์ผ ๋‚ด์šฉ
  };

  transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
      console.log(error);
    } else {
      console.log(`Email sent: ${info.response}`);
    }
  });

  return code;
};

module.exports = { generateRandomNumber, sendEmail };

 

๊ทธ ํ›„ ์ €๋Š” ์ด๋ ‡๊ฒŒ email.helper.js ๋ผ๋Š” ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค!

 

์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด

 

๋จผ์ € 6์ž๋ฆฌ ์ธ์ฆ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ Œ๋ค์œผ๋กœ 6์ž๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” generateRandomNumber ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๊ณ 

 

transporter์— createTransport ๋งค์„œ๋“œ๋ฅผ ์ด์šฉํ•ด gmail๋กœ service ํ•  ๊ฒƒ์ด๊ณ  .env์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธํ•˜์—ฌ ๋ฉ”์ผ์„ ๋ณด๋‚ผ ๊ฒƒ์ด๋ผ๊ณ  ์ •์˜ํ•ด์คฌ์Šต๋‹ˆ๋‹ค

 

sendEmail ํ•จ์ˆ˜์—์„œ๋Š” ์ธ์ฆ ์ฝ”๋“œ๋ฅผ ๋ฐ›์„ user์˜ email ๊ณผ 6์ž๋ฆฌ ์ธ์ฆ์ฝ”๋“œ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ฉ”์ผ๋กœ ๋ณด๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

 

๊ทธ๋Ÿผ ์ด์ œ ๋ฌธ์ œ๋Š” ๋ฉ”์ผ๋กœ ๋ณด๋‚ธ ๋ Œ๋คํ•œ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ธ์ฆํ•˜๊ณ  ํšŒ์›๊ฐ€์ž…์„ ์‹œ์ผœ์ค„ ๊ฒƒ์ธ๊ฐ€์ž…๋‹ˆ๋‹ค

 

์ฒ˜์Œ์— ๊ณ ์•ˆํ–ˆ๋˜ ๋ฐฉ์‹์€

 

 

 

1. ํšŒ์›๊ฐ€์ž…์„ ๋ˆ„๋ฅด๋ฉด ์ธ์ฆ ์ฝ”๋“œ ๋ถ€๋ถ„์˜ ๊ธฐ๋ณธ๊ฐ’์„ NULL๋กœ ํ•˜์—ฌ ์šฐ์„ ์ ์œผ๋กœ ํšŒ์›๊ฐ€์ž…ํ•  ๊ณ ๊ฐ ์ •๋ณด๋ฅผ DB์— ์ €์žฅํ•˜๊ณ 

(์—ฌ๊ธฐ์„œ ์ค‘๋ณต ํšŒ์›๊ฐ€์ž… ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•ด์คŒ)


2. ์ธ์ฆ๋ฒˆํ˜ธ๋ฅผ ๋ฐœ์†กํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ ์š”์ฒญ์„ ํ•˜๋ฉด DB์— ํ•ด๋‹น ์ด๋ฉ”์ผ๋กœ ๊ฐ€์ž…๋œ ์ •๋ณด์—์„œ ์ €์žฅ๋œ code์™€ ๋น„๊ตํ•จ

 

=> ttl ์„ 5๋ถ„์œผ๋กœํ•˜์—ฌ 5๋ถ„๋’ค์— ์ธ์ฆ ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•œ column์˜ ๊ฐ’์€ ์ž๋™ ์‚ญ์ œ ์‹œ์ผœ์„œ ์ œํ•œ ์‹œ๊ฐ„์„ ๋’€์Œ

3. ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ธ์ฆ ์ฝ”๋“œ์™€ DB์— ์ €์žฅ๋œ ์ธ์ฆ ์ฝ”๋“œ ๊ฐ’์ด ์ผ์น˜ํ•˜๋ฉด DB์— ์ €์žฅ๋œ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ๋งŒ์•ฝ ์ผ์น˜ ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ์กด์— DB์— ์ €์žฅํ–ˆ๋˜ ์ •๋ณด๋ฅผ ์‚ญ์ œํ•ด์„œ ํšŒ์›๊ฐ€์ž…์ด ์•ˆ๋˜๊ฒŒ ํ•  ๊ฒƒ์ด์—ˆ๋‹ค..

 

 

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด DB ๊ณต๊ฐ„๋‚ญ๋น„, 5๋ถ„๋™์•ˆ์€ ์•„๋ฌด๋„ ํ•ด๋‹น userID๋กœ๋Š” ํšŒ์›๊ฐ€์ž…์„ ๋ชปํ•˜๋Š” (์ค‘๋ณต ๋ถˆ๊ฐ€) ์ด์Šˆ๊ฐ€ ์žˆ์–ด์„œ

 

 

 

์ด๋ ‡๊ฒŒ ๊ทธ๋ƒฅ ์ธ์ฆ ์ฝ”๋“œ๋ฅผ ํ”„๋ก ํŠธ๋กœ ๋ณด๋‚ด์ฃผ๊ณ  ํ”„๋ก ํŠธ์—์„œ ๊ฐ’์˜ ์ผ์น˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ๋กœ ๋งˆ๋ฌด๋ฆฌํ–ˆ๋‹ค!

๋ฐ˜์‘ํ˜•