云開(kāi)發(fā) 云函數(shù)發(fā)郵件

2020-07-21 17:55 更新

借助于第三方模塊Nodemailer,我們還可以實(shí)現(xiàn)使用云函數(shù)來(lái)發(fā)郵件。結(jié)合發(fā)郵件的功能,我們可以在用戶注冊(cè)了用戶,或者評(píng)論有人回復(fù),有重要的活動(dòng)信息需要通知時(shí)發(fā)送郵件通知用戶。用云函數(shù)這全套用戶通知的流程實(shí)現(xiàn)起來(lái)也很簡(jiǎn)單。

技術(shù)文檔:Nodemailer Github地址、Nodemailer官方文檔

一、用云函數(shù)發(fā)郵件

1、開(kāi)啟SMTP服務(wù)

自己搭建郵件服務(wù)器是非常麻煩的,我們可以借助于QQ郵箱、Gmail、163個(gè)人郵件系統(tǒng)或企業(yè)郵件系統(tǒng)開(kāi)啟IMAP/SMTP服務(wù),IMAP是互聯(lián)網(wǎng)郵件訪問(wèn)協(xié)議,通過(guò)這種協(xié)議可以從郵件服務(wù)器獲取郵件的信息、下載郵件,也就是接收郵件;SMTP也就是簡(jiǎn)單郵件傳輸協(xié)議,通過(guò)它可以控制郵件的中轉(zhuǎn)方式,幫助計(jì)算機(jī)在發(fā)送或中轉(zhuǎn)信件時(shí)找到下一個(gè)目的地,也就是發(fā)送郵件。這里我們只介紹如何使用云函數(shù)來(lái)發(fā)送郵件,所使用的就主要是smtp服務(wù)。

不同的郵件系統(tǒng)有著不同的smtp發(fā)送郵件服務(wù)器,端口號(hào)也會(huì)有所不同,這些都可以去相應(yīng)的郵箱的設(shè)置里看到相關(guān)的說(shuō)明的,這里僅以QQ郵箱為例,登錄QQ郵箱,在郵件設(shè)置-賬戶開(kāi)啟SMTP服務(wù),QQ郵箱的發(fā)送郵件服務(wù)器:smtp.qq.com,使用SSL,端口號(hào)465或587。

QQ開(kāi)啟SMTP服務(wù)之后會(huì)獲取到郵件授權(quán)碼(郵件授權(quán)碼不是郵箱密碼),這個(gè)后面會(huì)用得到。

2、使用云函數(shù)發(fā)送郵件

使用開(kāi)發(fā)者工具創(chuàng)建一個(gè)云函數(shù),比如nodemail,然后在package.json增加nodemailer最新版latest的依賴,并右鍵云函數(shù)目錄選擇在終端中打開(kāi)輸入命令npm install安裝依賴:

"dependencies": {
    "nodemailer": "latest"
}

然后再在index.js里輸入以下代碼,并根據(jù)你的實(shí)際情況來(lái)修改一下里面的參數(shù),如:

  • auth里面的郵箱賬號(hào)和郵箱密碼(不同的郵件系統(tǒng)可能機(jī)制不一樣,QQ郵箱為郵箱授權(quán)碼

  • message里面的 from 和 to 參數(shù),分別為你的發(fā)件郵箱以及收件方的郵箱地址,你還可以填寫cc和bcc,抄送或密送給指定郵箱;

  • host、port,這里為QQ郵箱的SMTP服務(wù)器地址和相應(yīng)的端口,你如果使用的是其他郵件系統(tǒng)的,要注意修改;

  • nodemailer支持發(fā)送text文字內(nèi)容、html網(wǎng)頁(yè)內(nèi)容以及附件的形式,附件的格式支持String、Buffer或Stream(各種文件),不過(guò)文件大小不同的郵箱是有限制的,也不宜過(guò)大,會(huì)影響云函數(shù)執(zhí)行時(shí)間,建議大文件使用云存儲(chǔ)鏈接;

const cloud = require('wx-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV,
})
exports.main = async (event, context) => {
  const nodemailer = require("nodemailer");
  let transporter = nodemailer.createTransport({
    host: "smtp.qq.com", //SMTP服務(wù)器地址
    port: 465, //端口號(hào),通常為465,587,25,不同的郵件客戶端端口號(hào)可能不一樣
    secure: true, //如果端口是465,就為true;如果是587、25,就填false
    auth: {
      user: "3441****02@qq.com",  //你的郵箱賬號(hào)
      pass: "你的QQ郵箱授權(quán)碼"   //郵箱密碼,QQ的需要是獨(dú)立授權(quán)碼,不是QQ郵箱的密碼
    }
  });
  let message = {
    from: '來(lái)自李東bbsky <888888@qq.com>',   //你的發(fā)件郵箱
    to: '你要發(fā)送給誰(shuí)', //你要發(fā)給誰(shuí)
    // cc:'',  支持cc 抄送
    // bcc: '', 支持bcc 密送
    subject: '歡迎大家參與云開(kāi)發(fā)技術(shù)訓(xùn)練營(yíng)活動(dòng)',
    //支持text純文字,html代碼
    text: '歡迎大家',
    html:
      '<p><b>你好:</b><img src="https://hackwork-1251009918.cos.ap-shanghai.myqcloud.com/handbook/html5/weapp.jpg" rel="external nofollow" /></p>' + '<p>歡迎歡迎<br/></p>',
    attachments: [  //支持多種附件形式,可以是String, Buffer或Stream
      {
        filename: 'image.png',
        content: Buffer.from( 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/' + '//+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U' + 'g9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC',
'base64'),
      },
    ],
  };
  let res = await transporter.sendMail(message);
  return res;
}

部署上傳云函數(shù)之后,在小程序端或者云開(kāi)發(fā)控制臺(tái)調(diào)用該云函數(shù)就能收到郵件啦,這個(gè)只是定向給某個(gè)發(fā)送郵件,只適合發(fā)給管理員進(jìn)行郵件通知的場(chǎng)景。

二、郵箱功能的拓展與應(yīng)用

盡管郵件已經(jīng)沒(méi)落,但是郵箱幾乎是所有互聯(lián)網(wǎng)用戶都會(huì)使用的一個(gè)互聯(lián)網(wǎng)產(chǎn)品,用云函數(shù)結(jié)合郵件的發(fā)送可以拓展和傳統(tǒng)的后端一樣的發(fā)送郵件的能力。

結(jié)合云數(shù)據(jù)庫(kù)給指定的人發(fā)郵件

當(dāng)用戶在小程序端進(jìn)行一些業(yè)務(wù)操作時(shí),我們可以結(jié)合數(shù)據(jù)庫(kù)定向給該用戶或目標(biāo)用戶發(fā)郵件,比如用戶綁定注冊(cè)或找回密碼,當(dāng)用戶A給用戶B寫的文章或留言評(píng)論時(shí)可以給B發(fā)郵件,當(dāng)用戶參與活動(dòng)需要通知時(shí),管理員可以給目標(biāo)用戶發(fā)郵件等。不同的業(yè)務(wù)場(chǎng)景接收郵件的人也會(huì)不同,郵件里面的內(nèi)容根據(jù)業(yè)務(wù)的需求也會(huì)有所不同,因此在郵件發(fā)送的過(guò)程中,數(shù)據(jù)庫(kù)扮演著非常重要的角色。

不過(guò)由于QQ郵箱是個(gè)人郵件系統(tǒng),每天只能發(fā)送幾百封郵件,不太適合用戶量比較大的小程序作為企業(yè)業(yè)務(wù)來(lái)進(jìn)行郵件的發(fā)送。

實(shí)現(xiàn)密碼校驗(yàn)與郵件的定時(shí)發(fā)送

當(dāng)用戶在個(gè)人資料里綁定自己的郵箱時(shí),可以發(fā)送郵件以及校驗(yàn)碼,校驗(yàn)碼可以是數(shù)據(jù)庫(kù)的一個(gè)字段,它的值可以是一些隨機(jī)生成的字符串,但是有一定的生命周期,比如半個(gè)小時(shí)之后會(huì)失效,這個(gè)自動(dòng)失效的操作則需要使用到定時(shí)觸發(fā)器;郵件也可以是周報(bào)、日?qǐng)?bào)的周期性定時(shí)發(fā)送,在每天或每周的某個(gè)時(shí)間點(diǎn),批量收集當(dāng)天或當(dāng)周的數(shù)據(jù)自動(dòng)發(fā)送給用戶,這個(gè)也是依賴定時(shí)觸發(fā)器,這個(gè)我們會(huì)在后面定時(shí)觸發(fā)器的章節(jié)進(jìn)行說(shuō)明。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)