發送郵件需要smtp協議

Nodemailer

可以透過node發送郵件的第三方模塊

npm install nodemailer -d 

引入nodemailer,用法

// controllers/auth.js
const nodemailer = require("nodemailer");
const transporter = nodemailer.createTransport({
  // 主機位置
  host: 'smtp.126.com',
  port: '465',
  secure: true,
  // 郵件授權內容,網易
  auth: {
    user: "[email protected]",
    pass: "ENJACZJKFUUIDQGW",
  }
})

進行顏建發送功能,transporter.sendMail()

https://nodemailer.com/message/

// controllers/auth.js
const email = req.body.email;

transporter.sendMail({
  from: "[email protected]",
  // 收件地址,動態生成
  to: email,
  subject: "註冊成功",
  html: "<b>歡迎新用戶註冊</b>"
})

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8465d84d-7bd2-4681-9349-d6821d11ce0f/_2021-07-05_6.09.03.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/b5daad8e-c525-486d-99db-4182f086c57c/_2021-07-05_6.10.29.png

重置密碼

crypto ⇒ node提供,隨機生成加密數組

// controllers/auth.js
// node提規模快 => 隨機生成加密數
const crypto = require("crypto");

crypto.randomBytes()

exports.postReset = (req, res, next) => {
  console.log("重置密碼");
  const email = req.body.email;
  // 生成隨機字符
  crypto.randomBytes(32, (err, buffer) => {
    if (err) {
      console.log("重設密碼err", err);
      return res.redirect("/reset");
    }
    // 十六進制轉換
    const token = buffer.toString("hex");
    User.findOne({ email })
    .then((user) => {
      if (!user) {
        req.flash("error", "該用戶帳號並不存在");
        return res.redirect("/reset");
      }
      user.resetToken = token;
      // 設置token過期時間
      user.resetTokenExpiration = Date.now() * 1000 * 60 * 60;
      return user.save().then(() => {
        res.redirect("/");
      });
    })
	});
};

設置user資料庫對應資料(resetToken,resetTokenExpiration)

// models/user
const userSchema = new mongoose.Schema({
  resetToken: String,
  resetTokenExpiration: Date,
)}

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/174be1a4-eaae-49ac-8df4-06ee9cad927e/_2021-07-12_4.32.21.png

對用戶進行重置郵件發送