Node.js發(fā)送電子郵件

image.png

電子郵件作為最廣泛使用的一種網(wǎng)絡(luò)服務(wù)和我們的工作學(xué)習(xí)生活已經(jīng)密不可分。接受信用卡的賬單,注冊網(wǎng)站,找回密碼等等都需要用到它。今天在就來學(xué)習(xí)下如何在node下來發(fā)送郵件,為當(dāng)前做的項目提供郵箱校驗的功能。

郵箱校驗的原理:當(dāng)我們在xxx網(wǎng)站注冊的時候,注冊信息中一般都會要求你填一個郵箱(作用:1、當(dāng)著登錄的用戶賬號,2、找回密碼),當(dāng)你注冊成功后系統(tǒng)就會向你填寫的郵箱中發(fā)送一封帶有特殊鏈接的郵件,要求你打開你的郵件去點擊,當(dāng)你進入郵箱點擊連接系統(tǒng)就會接受到一個get請求從而驗證郵箱是你本人的。

node發(fā)送郵件已經(jīng)有一些第三方的組件,這里我使用nodemailer這個帶三方組件來發(fā)郵件,如果不使用封裝好的第三方組件自己寫的話需要去熟悉和研究復(fù)雜的郵件協(xié)議來實現(xiàn),如果要開發(fā)一個郵件服務(wù)那么這是必要的,但是一個小小的郵件驗證我覺得這是非必要的。

創(chuàng)建本次郵箱校驗demo使用的數(shù)據(jù)庫的表

DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `username` varchar(20) NOT NULL COMMENT '用戶名',
  `password` varchar(255) NOT NULL COMMENT '用戶密碼',
  `email` varchar(255) NOT NULL COMMENT '郵箱',
  `code` varchar(255) NOT NULL COMMENT '郵箱驗證使用的code',
  `email_state` int(2) NOT NULL COMMENT '郵箱驗證狀態(tài)。 0:未驗證,1:已驗證',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

這就是本次郵箱校驗demo中用到的用戶信息表,其實還應(yīng)該有一張表存放每次發(fā)送郵箱驗證時候生成的一些數(shù)據(jù),比如code,過期時間等,在這里我就不校驗郵件的過期時間了,code也直接放在用戶信息表中了,如果你在正式系統(tǒng)中請新建一張表或者在緩存中來存放每次發(fā)送郵件生成的臨時數(shù)據(jù)。

nodemailder介紹及其使用

特性列表

  • 不依賴于其它模塊
  • 支持unicode編碼,包括emoji表情
  • 支持windows系統(tǒng)
  • 郵件內(nèi)容支持純文本和html
  • 支持添加附件
  • 郵件內(nèi)容如果是html還可以插入圖片
  • 支持除了默認(rèn)SMTP協(xié)議外的其它傳輸協(xié)議
  • 使用TLS / STARTTLS安全電子郵件傳遞
  • SMTP連接代理
  • 健全的oauth2認(rèn)證
  • DKIM消息簽名
  • 自定義插件支持處理消息
  • 支持es6語法

詳細(xì)文檔nodemailer官方地址

nodemailer配置

通過npm install nodemailer --save安裝這個模塊到項目。

當(dāng)前的nodemailer的版本是4.0.1

nodemailer使用

使用nodemailer發(fā)送一封郵件大概需要4步

1、在文件中引入nodemailer

    const nodemailer = require('nodemailer');

2、創(chuàng)建一個傳輸對象

    let transporter = nodemailer.createTransport({
        host: 'smtp.163.com',
        port: 465,
        secure: true,
        auth: {
        user: 'username@163.com', //郵箱的賬號
        pass: 'userpass'//郵箱的密碼
        }
    });

3、用unicode字符設(shè)置電子郵件數(shù)據(jù)

    let mailOptions = {
        from: '"Fred Foo ??" <username@163.com>', //郵件來源
        to: 'username@qq.com', //郵件發(fā)送到哪里,多個郵箱使用逗號隔開
        subject: 'Hello ?', // 郵件主題
        text: 'Hello world ?', // 存文本類型的郵件正文
        html: '<b>Hello world ?</b>' // html類型的郵件正文
    };

4、使用第二步定義的傳輸對象發(fā)送郵件

    transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
        return console.log(error);
        }
        console.log('Message %s sent: %s', info.messageId, info.response);
    });

發(fā)送帶有附件的郵件

    let mailOptions = {
        from: '"Fred Foo ??" <username@163.com>', //郵件來源
        to: 'username@qq.com', //郵件發(fā)送到哪里,多個郵箱使用逗號隔開
        subject: 'Hello ?', // 郵件主題
        html: '<b>Hello world ?</b>', // html類型的郵件正文
        attachments: [
        {
            filename: 'text.txt',//附件名稱
            path: './text.txt'//附件的位置
        }
        ]
    };

發(fā)送正文中帶有圖片的郵件

正文中帶有圖片,正文的類型必須是html類型,圖片的src值指向attachments對象中的cid的值就可以了。

    let mailOptions = {
        from: '"Fred Foo ??" <username@163.com>', //郵件來源
        to: 'username@qq.com', //郵件發(fā)送到哪里,多個郵箱使用逗號隔開
        subject: 'Hello ?', // 郵件主題
        html: '<b>Hello world ?![](cid:123456789)</b>', // html類型的郵件正文
        attachments: [
        {
            filename: 'a.jpg',//附件名稱
            path: './a.jpg',//附件的位置
            cid: '123456789' //為附件添加一個引用名稱
        }
        ]
    };

郵箱檢驗的demo

知道了郵箱校驗的原理和知道怎么通過node來發(fā)送郵件,代碼其實就簡單多了,博客中就不粘貼具體的代碼了,如果需要代碼請在node+express實現(xiàn)郵箱檢驗查看。

密碼找回

郵箱校驗其實是為了找回密碼服務(wù)的,而且他們的原理其實都差不多:很長一段時間當(dāng)你打開一個以前注冊的網(wǎng)站去登錄的時候發(fā)現(xiàn)密碼忘記了,點擊了密碼找回功能,系統(tǒng)會提示讓輸入一個注冊郵箱或者用戶名,然后會向這個郵箱發(fā)送一封帶有特殊鏈接的郵件,讓你登錄郵箱去驗證,成功登錄郵箱并且點擊連接就會跳轉(zhuǎn)到一個重置密碼的頁面讓你修改密碼,修改成功就可以通過新密碼登錄系統(tǒng)了。(溫馨提示:如果找回密碼的時候網(wǎng)站直接把你以前的密碼給你了,那么這個網(wǎng)站相對來說不安全,謹(jǐn)慎使用?。?/p>

后記

本文主要介紹了nodemailer的一些特性和基本使用方法和一些發(fā)郵件在具體項目中的應(yīng)用,通過nodemailer我們也可以快速的開發(fā)一個簡單的郵件發(fā)送客戶端。

本文如有誤,請不吝賜教!
原文標(biāo)題:Node發(fā)送電子郵件
原文鏈接:http://www.mengxiangjia.info/2017/06/20/node-post-mail/
版權(quán)聲明:自由轉(zhuǎn)載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容