你知道如何用Node.js作郵箱驗證嗎

相信你們都知道登陸操做都會有一個接收驗證碼的過程,我以前一直對這個很是感興趣,常常問同窗手機驗證碼是怎麼搞的,可是如今咱們不用手機也照樣能夠實現這個功能。html

01 前言

其實對於手機驗證碼來講,通常都要收費的,免費的通常是比較少的,並且都會有數量的限制。既然咱們不能使用手機驗證碼來發送,那麼咱們就以曲線救國的方式來實現這個功能吧。node

其實很簡單,咱們只要安裝一個第三方的npm 包就能夠了,這個包能夠實現郵件的發送功能。這個包就是nodemailer,下面咱們就一塊兒來測試一下到底怎麼樣。git

02 安裝nodemailer

咱們隨便新建一個目錄,而後在根目錄下面初始化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

一部分服務
一部分服務

發送純文本text

這個就比較簡單了,咱們直接在mailOptions 下面的text寫上咱們要發送的文本便可,其餘的html和attachments都不用配置了。json

HTML模板發送

有同窗可能以爲這個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文件均可以。

03 驗證碼功能

咱們其實感興趣只是驗證碼部分,別急這就安排一下究竟是怎麼回事。咱們首先要想辦法生成一個驗證碼,通常4-6位都是能夠的,下面就介紹一種簡單的方法來生成一個吧。

let code = Math.random().toString().substr(24)//從第二位開始截取,截取4位(固然也能夠6位)
複製代碼

咱們就直接使用text這個字段進行發送就行了。code能夠在一開始生成一下就好。這樣其實咱們就能夠有一個驗證的功能了,讓用戶輸入的驗證碼與你生成對比的是否一致。

text: `您的驗證碼是${code},驗證碼在10分鐘內有效`
複製代碼

04 一些小問題

我在測試的時候其實有一些小問題,可是我也不知道是什麼緣由。

  • Error: Message failed: 554 DT:SPM 163

我去163的官網查了一下,得出的結論是:

DT:SPM 發送的郵件內容包含了未被許可的信息,或被系統識別爲垃圾郵件。請檢查是否有用戶發送病毒或者垃圾郵件

這是我在發送圖片的時候,就是個人二維碼圖片不行,可是我換一張普通的照片就能夠,無解。

  • 發送給多名用戶失敗

當我嘗試在to字段那裏寫兩個用戶的時候,發現只有一個是成功的,另外一個卻被退回了,我也不知道是怎麼回事。

05 小結

好了,以上就是本文的所有內容,想一想其實好像也沒什麼東西,以前以爲是很是牛的事情原來可使用很簡單的代碼就能夠實現了。

其實關於nodemailer還有不少屬性沒有說到,我只講關於郵件發送的核心部分,其實這在咱們的平常生活中也夠用了,特別是作一些登陸驗證操做的時候有用有效。

文章代碼:github地址

相關文章
相關標籤/搜索