[Node.js] Nodemailer๋ฅผ ์ฌ์ฉํ์ฌ ํ์๊ฐ์ ์ ์ด๋ฉ์ผ ์ธ์ฆ ๊ตฌํํ๊ธฐ
์ด๋ฒ ํ๋ก์ ํธ์์ ํ์๊ฐ์ ์์ ์ฌ์ฉ์์๊ฒ ์ด๋ฉ์ผ ์ธ์ฆ์ ๋ฐ๊ธฐ ์ํด ์ฐพ์๋ณด๋์ค
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๋ก๋ ํ์๊ฐ์ ์ ๋ชปํ๋ (์ค๋ณต ๋ถ๊ฐ) ์ด์๊ฐ ์์ด์
์ด๋ ๊ฒ ๊ทธ๋ฅ ์ธ์ฆ ์ฝ๋๋ฅผ ํ๋ก ํธ๋ก ๋ณด๋ด์ฃผ๊ณ ํ๋ก ํธ์์ ๊ฐ์ ์ผ์น ์ฌ๋ถ๋ฅผ ํ์ธํด์ ์ฒ๋ฆฌํด์ฃผ๊ธฐ๋ก ๋ง๋ฌด๋ฆฌํ๋ค!