NodeJS如何實現寄信
前言
Mail寄送功能使用 Gmail 當作郵件伺服器,所以需先開通權限,開通後,就可以慢慢新增寄信的功能,以及額外優化的部份。
nodemailer - 發信功能的介接
安裝
1 | $ npm install nodemailer --save |
範例
實現基本寄信的功能,步驟如下
- 載入 Mail模組
- 設定 SMTP 相關資料
- 撰寫Mail相關內容
- 發送郵件
不過在實際寄信的過程,有出現錯誤訊息為 self signed certificate in certificate chain,此錯誤訊息,將在後面小節額外說明。
1 | var express = require('express'); |
TLS - 傳輸層安全性協定
在實際寄信的過程,有出現錯誤訊息為 self signed certificate in certificate chain,
原因為Gmail為HTTPS協定,會發送的 CA 簽名的證書,
而Node.js 客戶機驗證CA 簽名的證書,方法是根據CA 的公用證書檢查CA 簽名的證書,
不過因為我們沒有 CA 的公用證書,所以我們需增加一個參數 rejectUnauthorized ,去忽略此驗證的動作。
1 | //設定 SMTP 相關資料 |
nodemailer 新增附件
擷取 撰寫Mail相關內容 這一部份,新增 attachments 參數,並且該如何正確取得伺服器電腦上的附件。
注意的點:
- 附件路徑需設定 完整路徑
- 可透過
process.cwd()
取得目前專案的目錄,在延伸至放附件的路徑,如:path: process.cwd() + '/public/attach/image.png'
- 另外可新增 cid 的值,可供 郵件html 渲染出附件檔案。
1 | //撰寫Mail相關內容 |
結果
CSURF - 阻擋跨站攻擊
為了預防 跨站請求偽造 的攻擊,所以我們使用 CSURF模組 來協助我們驗證是否為本伺服器所發出的請求,簡單來說,就是利用 後端session
和 前端cookie
的配合,達成此驗證功能。
安裝
1 | $ npm install csurf --save |
範例
- 載入模組後,建立CSURF驗證
- 在 get、post 之前,都需新增 middlewares 的卡控判斷。
- 在前端表單,新增一段 在 csrfToken的HTML,供驗證使用。
1 | var express = require('express'); |
1 | <form action="/contact/post" method="post"> |
dotenv - 環境變數設定
可以將一些比較機密性的資料(帳號、密碼…等),設置在環境變數裡,這樣的話,就算我們將專案上傳至github等公共環境,也不會將重要的資訊曝露在外。
安裝
1 | $ npm install dotenv --save |
範例
- 在專案根目錄新增檔案 .env,並在將機密資料設定於此。
- 修改後端app.js,機密資料 改取自 dotenv環境變數。
1 | gmailUser = Gmail帳號 |
1 | var express = require('express'); |
connect-flash - message的暫存器
簡單來說,flash是一個暫存器,而且暫存器裡面的值使用過一次即被清空,這樣的特性很方面用來做網站的提示信息。
安裝
1 | $ npm install connect-flash --save |
範例
注意:flash要配合session使用
1 | var express = require('express'); |
驗證欄位是否有填寫,若有卡控訊息,則紀錄在 flash 內,並傳入 render ,供前端渲染畫面。
1 | router.get('/', csrfProtection, function (req, res) { |
1 | <form action="/contact/post" method="post"> |