借助于第三方模塊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官方文檔
自己搭建郵件服務(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ì)用得到。
使用開(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ù),如:
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)景。
盡管郵件已經(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ō)明。
更多建議: