Node.js - 透過 Nodemailer 寄送 Email
試著實作一個簡單類似 gmail 信箱寄信的相關功能,且可以讓使用者利用類似 word 的輸入介面來寄信
實作目標
- 信件可含 HTML 內文
- 信件可以附加圖片
- 信件可夾帶檔案
安裝與設定
安裝:
1 | npm install --save nodemailer |
載入模組設定:mailManager.js
1 | const nodemailer = require("nodemailer"); |
實作
開啟信箱存取權限
開始實做之前,先將 mail 設定的 低安全性應用程式存取權限
打開,這邊以 gmail 為例,先登入自己帳號後,可透過以下連結直接開始做設定,如下圖原先是已關閉
將他打開變成 已開啟
發信服務的相關設定
透過 createTransport
物件設定發信的服務的對象與帳號密碼,這邊以 Gmail 為例,若不是 gmail 也可以透過host
、port
設定去修改 ,最後將相關設定存放於.env
裡
mailManager.js:
1 | let transporter = nodemailer.createTransport({ |
.env:
1 | MAIL_USER = abc@gmail.com |
傳送 HTML 內文並寄信
透過 html
參數寫入 html 格式內文,透過 sendMail
方法寄出信件
mailManager.js:
1 | mailOption = { |
信件可夾帶檔案
透過 attachments
參數設定夾帶的檔案
1 | mailOption = { |
加入線上編輯器 - summernote
基本上上面已經達到寄信功能,但希望讓使用者上能透過線上編輯器直接讓使用者在上方修改自己喜歡的樣式,類似 word 來編輯背後幫你轉成 html 格式與樣式,所以這邊就透過 summernote
來完成線上編輯的功能
設定與實作
1 | <link href="https://cdnjs.cloudflare.com/ajax/libs/summernote/0.8.12/summernote-bs4.css" rel="stylesheet"> |
html:
1 | <textarea id="summernote" name="editordata"></textarea> |
點選右上角的 summernote
裡的</>
(code view
) 就可即時看到目前使用者所輸入轉換成 html 和 css 的內容,就可以將使用者輸入的內容傳送到 Nodemailer
的 html 裡
html 內文夾帶圖片
直接利用summernote
裡的picture
插入圖片後並寄信試試看, mail 收到後卻沒有圖片?
mail:
利用nodemailer-plugin-inline-base64
套件解決這個問題,該套件可以將 base64 編碼圖像轉換成 mail 附件的形式(CID-referenced),但不讓圖片出現在附件裡.
連結:nodemailer-plugin-inline-base64
以 cid 方式設定為例如下:
1 | var mailOpt = { |
安裝:
npm install --save nodemailer-plugin-inline-base64
設定與實作:
1 | const inlineBase64 = require('nodemailer-plugin-inline-base64'); |
實作結果
這邊實作一個簡單寄信的界面,能夠在頁面上輸入信件內容與上傳檔案:
實際收到信件內容:
github 連結:https://github.com/Phxww/mail-manager
參考: