nodemailer

前言

在很多日常生活中會常需要使用到,寄信通知、訂閱通知、或任何資料修改的寄信服務做為提醒。
在 node.js 中有 nodemailer 可以簡單的幫助我們達到這個目的地。

官網 docs 介紹 nodemailer

安裝

npm i nodemailer

使用步驟

安裝後引入

const nodemailer = require("nodemailer");

接著會有三個部分 tranport、mailOptions、sendMail

  • tranport: createTransport 會需要, email server、 auth(user、password)
  • mailOptions: from、to、subject、text,最少要這些資訊, 甚至在 text 可以改換使用 html 或者是 template 所呈現。
  • sendMail: 是一個語法 function,將前面兩個資訊都放到這個語法中,並回傳 callback。

example:

const transporter = nodemailer.createTransport({
server: "gmail",
auth: {
user: "mail@example.com",
pass: "yourpassword"
}
});

const mailOptions = {
from: "mail@example.com",
to: "friendsMail@example.com",
subject: "Title",
text: "string"
};

transporter.sendMail(mailOptions, (e, info) => {
if (e) {
console.log(e);
} else {
console.log(info.response);
}
});

使用 handlebars 和 template

在完成基本的使用後,我們會希望在不同的情境下可以程式碼可以幫助我們寄送不同的資訊,這時候設定 template 可以幫助我們減少重複的程式碼。

而 handlebars 可以幫助我們帶入不同的資訊,而且更容易的生成 email html。

為了節省時間,我是直接安裝另外一個套件 nodemailer-express-handlebars,日後有時間再回頭做詳細研究。

並且為 template 另外設置一個同名 template 資料夾。做為專案設置另外使用了 .env 環境設置。

而因為 gmail 更新的緣故和使用 template,也使用較為細節的設定。

const transporter = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 465,
secure: true,
auth: {
user: process.env.GMAIL_ACCOUNT,
pass: process.env.GMAIL_PASSWORD
}
});

// 必須額外設定 view engine 的選項
transporter.use(
"compile",
hbs({
viewEngine: {
defaultLayout: false,
partialsDir: "partials/" //以上兩項都是必須預設,即使沒有這個資料夾。
},
viewPath: "server/emailTemplate", //選用的資校夾位置。
extName: ".hbs" //使用 hbs 附屬檔名。
})
);

再寄送 email 的部分則是沒甚麼太大的變化,唯一的變化是在 mailOptions,加入 template 指定的檔案名稱、context 需要傳入的資訊。而我使用習慣上會對傳入的資訊做 obj 包裝命名成 emailInfo。

const emailInfo = {
email: 'friendEmail',
template: "templateName",
subject: "title",
}
const mailOptions = {
from: process.env.GMAIL_ACCOUNT,
to: emailInfo.email,
subject: emailInfo.subject,
template: emailInfo.template,
context: { emailInfo }
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log(error);
} else {
console.log("Email sent " + info.response);
}
})

email HTML

在寄信的時候,通常我們會希望傳送給別人的 email 可以被包裝的生動,而不是只有呈現文字,沒有排版的樣子,又或者是想呈現客製化字型。
但在這部分並不是每一個信箱都會全部支援的,在設計 HTML 樣板之前,應該確認好是否能呈現你所需要的樣式,像是在 gmail 的部分,就只開放最傳統的 HTML 樣式,甚至連動畫都不支援。

campaignmonitor 提供了不少資訊,可以供我們做參考。