相信你們都知道登陸操做都會有一個接收驗證碼的過程,我以前一直對這個很是感興趣,常常問同窗手機驗證碼是怎麼搞的,可是如今咱們不用手機也照樣能夠實現這個功能。html
其實對於手機驗證碼來講,通常都要收費的,免費的通常是比較少的,並且都會有數量的限制。既然咱們不能使用手機驗證碼來發送,那麼咱們就以曲線救國的方式來實現這個功能吧。node
其實很簡單,咱們只要安裝一個第三方的npm 包就能夠了,這個包能夠實現郵件的發送功能。這個包就是nodemailer,下面咱們就一塊兒來測試一下到底怎麼樣。git
咱們隨便新建一個目錄,而後在根目錄下面初始化package.json文件(npm init),而後咱們就直接安裝nodemailer便可。github
npm install nodemailer --save
複製代碼
而後咱們再新建一個入口文件app.js,用於測試代碼。web
"use strict";
const nodemailer = require("nodemailer");
const fs = require("fs");
const path = require("path");
let transporter = nodemailer.createTransport({
// host: 'smtp.ethereal.email',
service: "qq", // 使用了內置傳輸發送郵件 查看支持列表:https://nodemailer.com/smtp/well-known/
// port: 465, // SMTP 端口
secureConnection: true, // 使用了 SSL
auth: {
user: "alanwu.hd@qq.com",
pass: "xxxxxxxxxxx", //受權碼,並不是QQ密碼
},
});
let mailOptions = {
from: '"alanwu" <alanwu.hd@qq.com>', // 發送地址
to: "157687xxxxx@163.com", // 接收列表(可多個)
subject: "Hello,this is alan from China!", // 主題
// 發送text或者html格式(任選一個)
text: 'Hello world!', // plain text body
//html: fs.createReadStream(path.resolve(__dirname,'index.html'))
html: '<img src="cid:01">',
attachments: [ //添加附件(可多個)
{
filename: "image",
path: path.resolve(__dirname, "2.jpg"),
cid: "01",//與上面的圖片cid對應
},
{
filename: "a.txt",
content: "hello world!",
},
{
filename: "b.txt",
path: "./text.txt",//根目錄新建便可
},
],
};
// 發送郵件 transporter.sendMail(mailOptions, (error, info) => { if (error) { return console.log(error); } console.log(info); }); 複製代碼
咱們先來看一下service這個字段,若是寫了這個就不用寫host和端口。你們能夠看一下官方的介紹,詳情戳此。它其實已經幫你封裝好了,很是方便。npm
這個就比較簡單了,咱們直接在mailOptions 下面的text寫上咱們要發送的文本便可,其餘的html和attachments都不用配置了。json
有同窗可能以爲這個text文本太low了,咱們應該寫一些比較華麗的網頁發送。沒問題,其實咱們還能夠自定義html網頁的,咱們不要使用text字段就好,改用html字段並且咱們要進行html文件的引入。app
咱們在根目錄新建index.html文件,用於發送此html文件給對方,這裏我就隨便拿了一個網頁。咱們要使用 fs.createReadStream(path.resolve(__dirname,'index.html'))
的方式進行引入便可。從新運行咱們就會接收到郵件了。dom
除了網頁以外咱們還可使用圖片的形式發送,咱們在html字段裏不要發送html文件,寫上html: '<img src="cid:01">'
以後,咱們在attachments裏面也寫上附件的地址,我這裏就直接在根目錄之下放置了一張圖片,cid要對應上。編輯器
這裏咱們就能夠添加一些文件了,好比這裏我添加了txt文件、docx文件、pdf文件、zip文件均可以。
咱們其實感興趣只是驗證碼部分,別急這就安排一下究竟是怎麼回事。咱們首先要想辦法生成一個驗證碼,通常4-6位都是能夠的,下面就介紹一種簡單的方法來生成一個吧。
let code = Math.random().toString().substr(2, 4)//從第二位開始截取,截取4位(固然也能夠6位)
複製代碼
咱們就直接使用text這個字段進行發送就行了。code能夠在一開始生成一下就好。這樣其實咱們就能夠有一個驗證的功能了,讓用戶輸入的驗證碼與你生成對比的是否一致。
text: `您的驗證碼是${code},驗證碼在10分鐘內有效`
複製代碼
我在測試的時候其實有一些小問題,可是我也不知道是什麼緣由。
Error: Message failed: 554 DT:SPM 163
我去163的官網查了一下,得出的結論是:
DT:SPM 發送的郵件內容包含了未被許可的信息,或被系統識別爲垃圾郵件。請檢查是否有用戶發送病毒或者垃圾郵件。
這是我在發送圖片的時候,就是個人二維碼圖片不行,可是我換一張普通的照片就能夠,無解。
發送給多名用戶失敗
當我嘗試在to字段那裏寫兩個用戶的時候,發現只有一個是成功的,另外一個卻被退回了,我也不知道是怎麼回事。
好了,以上就是本文的所有內容,想一想其實好像也沒什麼東西,以前以爲是很是牛的事情原來可使用很簡單的代碼就能夠實現了。
其實關於nodemailer還有不少屬性沒有說到,我只講關於郵件發送的核心部分,其實這在咱們的平常生活中也夠用了,特別是作一些登陸驗證操做的時候有用有效。
文章代碼:github地址