如何使用Node.js發郵件?

電子郵件是—種用電子手段提供信息交換的通信方式,是互聯網應用最廣的服務。通過網絡的電子郵件系統,用戶可以以非常低廉的價格(不管發送到哪裏,都只需負擔網費)、非常快速的方式(幾秒鐘之內可以發送到世界上任何指定的目的地),與世界上任何一個角落的網絡用戶聯繫。

在很多項目中,我們都會遇到郵件註冊,郵件反饋等需求。在node中收發電子郵件也非常簡單,因爲強大的社區有各種各樣的包可以供我麼直接使用。Nodemailer包就可以幫助我們快速實現發送郵件的功能。

Nodemailer簡介

Nodemailer是Node.js應用程序的一個模塊,是一個簡單易用的Node.js郵件發送組件。可以輕鬆地發送電子郵件。該項目於2010年開始,當時沒有合理的選項來發送電子郵件消息,今天它是大多數Node.js用戶默認發送郵件的解決方案。

官網地址:https://nodemailer.com

GitHub地址:https://github.com/nodemailer/nodemailer

Nodemailer的主要特點包括:

  • 支持Unicode編碼
  • 支持Window系統環境
  • 支持HTML內容和普通文本內容
  • 支持附件(傳送大附件)
  • 支持HTML內容中嵌入圖片
  • 支持SSL/STARTTLS安全的郵件發送
  • 支持內置的transport方法和其他插件實現的transport方法
  • 支持自定義插件處理消息
  • 支持XOAUTH2登錄驗證

 準備工作

首先你需要準備一個郵箱!因爲我們要做的是發送郵件的功能。所以準備的郵箱就是作爲郵件發送方。

你可以這樣理解(僅作爲理解):Nodemailer 就是一個跑在你服務器上的程序,它的功能就是在一定條件發生時向某個郵箱發送郵件。因此需要註冊一個郵箱作爲發件方並把郵箱賬號密碼告訴Nodemailer (配置一個對象作爲參數)。當一定條件發生時,Nodemailer 會根據你配置的賬號密碼登陸這個郵箱(在觸發發郵件函數時,可以將接收方、郵件信息如標題、內容等作爲參數傳入),並根據傳進來的信息進行發件操作。但是,在實際操作時,卻沒有這麼直接。需要我們在配置賬號密碼之前,爲你準備的郵箱開啓POP3/SMTP服務。那麼問題來了,什麼是POP3/SMTP服務呢?

POP3 協議

POP 協議(Post Office Protocol,郵局協議)是一種允許用戶從郵件服務器收發郵件的協議。它有2種版本,即POP2和POP3,都具有簡單的電子郵件存儲轉發功能。POP2與POP3本質上類似,都屬於離線式工作協議,但是由於使用了不同的協議端口,兩者並不兼容。與 SMTP協議相結合,POP3是目前最常用的電子郵件服務協議。POP3除了支持離線工作方式外,還支持在線工作方式。

在離線工作方式下,用戶收發郵件時,首先通過POP3客戶程序登錄到支持POP3協議的郵件服務器,然後發送郵件及附件;接着,郵件服務器將爲該用戶收存的郵件傳送給POP3客戶程序,並將這些郵件從服務器上刪除;最後,郵件服務器將用戶提交的發送郵件,轉發到運行SMTP協議的計算機中,通過它實現郵件的最終發送。在爲用戶從郵件服務器收取郵件時,POP3是以該用戶當前存儲在服務器上全部郵件爲對象進行操作的,並一次性將它們下載到用戶端計算機中。一旦客戶的郵件下載完畢,郵件服務器對這些郵件的暫存託管即告完成。使用POP3,用戶不能對他們貯存在郵件服務器上的郵件進行部分傳輸。離線工作方式適合那些從固定計算機上收發郵件的用戶使用。當使用POP3在線工作方式收發郵件時,用戶在所用的計算機與郵件服務器保持連接的狀態下讀取郵件。用戶的郵件保留在郵件服務器上。

SMTP協議

SMTP協議是一組用於從源地址到目的地址傳輸郵件的規範,通過它來控制郵件的中轉方式。SMTP 協議屬於 TCP/IP 協議簇,它幫助每臺計算機在發送或中轉信件時找到下一個目的地。SMTP 服務器就是遵循 SMTP 協議的發送郵件服務器。   SMTP 認證,簡單地說就是要求必須在提供了賬戶名和密碼之後纔可以登錄 SMTP 服務器,這就使得那些垃圾郵件的散播者無可乘之機。增加 SMTP 認證的目的是爲了使用戶避免受到垃圾郵件的侵擾。

說了一大堆,還有有點不明所以?有些深入瞭解http的同學可能會知道,http協議只是TCP/IP協議族中的一個協議,同時https協議處於網絡模型的應用層。而應用層主要是提供網絡任意端上應用程序之間的接口而除了http/https,POP3/SMTP也處於應用層,除了這些還有DNS、FTP等協議。http協議我們都知道,是瀏覽器/客戶端同服務器進行交互的一種通信協議。而POP3/SMTP就是郵件收發服務器進行交互的一種通信協議。這裏就不展開了(其實再深入的我也不會),有興趣的同學可以研究下。

回到主題,對於要開啓POP3/SMTP服務你可以這樣理解(僅作爲理解):上面我們說過,當一定條件發生時,Nodemailer 會根據你配置的賬號密碼登陸這個郵箱。其實這樣描述只是爲了方便大家理解,Nodemailer  並沒有做登陸操作。現在我們需要將剛剛的理解稍微改變一下。當我們使用某個郵箱(比如QQ郵箱),發送一封郵件給163郵箱。當我們點擊發送按鈕之後,騰訊的發件服務器會遵循SMTP通訊協議發送這封郵件,而網易的郵件接收服務器會遵循POP3協議接受這封郵件。但是現在我們要使用 Nodemailer 發送郵件,也就是現在發件服務器變成了 Nodemailer 程序所在的服務器,因此 我們在使用 Nodemailer 發郵件之前也要把當前服務器發郵件時要遵循的通信協議變成SMTP。

聽起來很複雜有木有?但是實際操作起來卻很簡單。我們只需要設置下郵箱獲取下授權碼,並將其配置到 Nodemailer 中就好了。我準備的作爲發件箱的郵箱是QQ郵箱,具體操作步驟如下:

打開郵箱,設置裏找到:

點POP3/SMTP服務後面的開啓:

然後會讓你驗證,驗證通過後會給你一個授權碼:

記好這個授權碼,不要搞丟了。然後就需要在你的項目目錄下安裝 Nodemailer 。

npm install nodemailer -D

使用 nodemailer

首先在你的項目目錄下新建一個send.js,內容如下:

const nodemailer = require('nodemailer');  //引入nodemailer 
const transporter = nodemailer.createTransport({  //配置 nodemailer 服務
  // host: 'smtp.qq.com', // SMTP服務器地址
  service: 'qq', // 使用內置傳輸發送郵件,支持列表:https://nodemailer.com/smtp/well-known
  port: 465, // SMTP 端口,不能寫別的端口
  secureConnection: true, // 使用 SSL(安全方式,防止被竊取信息)
  auth: {
    user: '[email protected]',  //你準備作爲發件方的郵箱
    pass: 'xxxxxx',  // 這裏密碼不是qq密碼,是你設置的smtp授權碼
  }
});

let mailOptions = {  //設置郵件信息
  from: '[email protected]', //你準備作爲發件方的郵箱
  to: '[email protected]', // 收件箱
  subject: '郵件標題', // 郵件標題
  // 發送text或者html格式
  // text: 'I am the email body', // 文本格式的郵件內容
  html: '<p>hml格式的郵件內容</p>' // hml格式的郵件內容
};

// 發送郵件
transporter.sendMail(mailOptions, (error, info) => {
  if (error) {
    return console.log(error);
  }
  console.log('ok');
});


這裏我們需要注意,auth.pass 不是郵箱賬戶的密碼而是stmp的授權碼。

將上面的程序中的郵箱我的兩個郵箱。然後執行:

node send.js

就收到郵件了:

收到了,就是這麼簡單。

如果你要發送附件,則先把要發送的文件放入工程中,並修改上面代碼的附件的filename和path。

let mailOptions = {  //設置郵件信息
  from: '[email protected]', //你準備作爲發件方的郵箱
  to: '[email protected]', // 收件箱
  subject: '郵件標題', // 郵件標題
  // 發送text或者html格式
  // text: 'I am the email body', // 文本格式的郵件內容
  html: '<p>hml格式的郵件內容</p>' // hml格式的郵件內容
  attachments: [
    {
        filename: 'img1.png',            // 改成你的附件名
        path: 'public/images/img1.png',  // 改成你的附件路徑
        cid : '00000001'                 // cid可被郵件使用
    },
    {
        filename: 'img2.png',            // 改成你的附件名
        path: 'public/images/img2.png',  // 改成你的附件路徑
        cid : '00000002'                 // cid可被郵件使用
    },
  ]
}

如果你要發送附件,則先把要發送的文件放入工程中,並修改上面代碼的附件的filename和path。

從代碼中可以知道,要在郵件正文中添加圖片,可以設置圖片的cid,然後在img標籤的src中設置爲對應的cid即可。

注意,不建議在js代碼中直接嵌入HTML代碼,也不建議把圖片加到郵件正文中。

其他的一些細節

抄送

  • CC: Carbon Copy(抄送),用於通知相關的人,收件人可以看到都郵件都抄送給誰了。一般回報工作或跨部門溝通時,都會CC給收件人的領導一份
  • BCC:Blind Carbon Copy(暗抄送),也是用於通知相關的人,但是收件人是看不到郵件被密送給誰了。

更多配置項:https://nodemailer.com/message/

好看的HTML郵件

HTML Email 編寫指南: http://www.ruanyifeng.com/blog/2013/06/html_email.html

使用模板引擎

郵件信息一般都不是固定的,我們可以引入模板引擎對HTML內容進行渲染。當然這就不是本文的重點了。有興趣的同學可以自己瞭解嘗試下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章