借助于第三方模塊Nodemailer,我們還可以實現(xiàn)使用云函數(shù)來發(fā)郵件。結(jié)合發(fā)郵件的功能,我們可以在用戶注冊了用戶,或者評論有人回復(fù),有重要的活動信息需要通知時發(fā)送郵件通知用戶。用云函數(shù)這全套用戶通知的流程實現(xiàn)起來也很簡單。
技術(shù)文檔:Nodemailer Github地址、Nodemailer官方文檔
自己搭建郵件服務(wù)器是非常麻煩的,我們可以借助于QQ郵箱、Gmail、163個人郵件系統(tǒng)或企業(yè)郵件系統(tǒng)開啟IMAP/SMTP服務(wù),IMAP是互聯(lián)網(wǎng)郵件訪問協(xié)議,通過這種協(xié)議可以從郵件服務(wù)器獲取郵件的信息、下載郵件,也就是接收郵件;SMTP也就是簡單郵件傳輸協(xié)議,通過它可以控制郵件的中轉(zhuǎn)方式,幫助計算機(jī)在發(fā)送或中轉(zhuǎn)信件時找到下一個目的地,也就是發(fā)送郵件。這里我們只介紹如何使用云函數(shù)來發(fā)送郵件,所使用的就主要是smtp服務(wù)。
不同的郵件系統(tǒng)有著不同的smtp發(fā)送郵件服務(wù)器,端口號也會有所不同,這些都可以去相應(yīng)的郵箱的設(shè)置里看到相關(guān)的說明的,這里僅以QQ郵箱為例,登錄QQ郵箱,在郵件設(shè)置-賬戶里開啟SMTP服務(wù),QQ郵箱的發(fā)送郵件服務(wù)器:smtp.qq.com,使用SSL,端口號465或587。
QQ開啟SMTP服務(wù)之后會獲取到郵件授權(quán)碼(郵件授權(quán)碼不是郵箱密碼),這個后面會用得到。
使用開發(fā)者工具創(chuàng)建一個云函數(shù),比如nodemail,然后在package.json增加nodemailer最新版latest的依賴,并右鍵云函數(shù)目錄選擇在終端中打開輸入命令npm install安裝依賴:
"dependencies": {
"nodemailer": "latest"
}
然后再在index.js里輸入以下代碼,并根據(jù)你的實際情況來修改一下里面的參數(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, //端口號,通常為465,587,25,不同的郵件客戶端端口號可能不一樣
secure: true, //如果端口是465,就為true;如果是587、25,就填false
auth: {
user: "3441****02@qq.com", //你的郵箱賬號
pass: "你的QQ郵箱授權(quán)碼" //郵箱密碼,QQ的需要是獨立授權(quán)碼,不是QQ郵箱的密碼
}
});
let message = {
from: '來自李東bbsky <888888@qq.com>', //你的發(fā)件郵箱
to: '你要發(fā)送給誰', //你要發(fā)給誰
// cc:'', 支持cc 抄送
// bcc: '', 支持bcc 密送
subject: '歡迎大家參與云開發(fā)技術(shù)訓(xùn)練營活動',
//支持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ù)之后,在小程序端或者云開發(fā)控制臺調(diào)用該云函數(shù)就能收到郵件啦,這個只是定向給某個發(fā)送郵件,只適合發(fā)給管理員進(jìn)行郵件通知的場景。
盡管郵件已經(jīng)沒落,但是郵箱幾乎是所有互聯(lián)網(wǎng)用戶都會使用的一個互聯(lián)網(wǎng)產(chǎn)品,用云函數(shù)結(jié)合郵件的發(fā)送可以拓展和傳統(tǒng)的后端一樣的發(fā)送郵件的能力。
結(jié)合云數(shù)據(jù)庫給指定的人發(fā)郵件
當(dāng)用戶在小程序端進(jìn)行一些業(yè)務(wù)操作時,我們可以結(jié)合數(shù)據(jù)庫定向給該用戶或目標(biāo)用戶發(fā)郵件,比如用戶綁定注冊或找回密碼,當(dāng)用戶A給用戶B寫的文章或留言評論時可以給B發(fā)郵件,當(dāng)用戶參與活動需要通知時,管理員可以給目標(biāo)用戶發(fā)郵件等。不同的業(yè)務(wù)場景接收郵件的人也會不同,郵件里面的內(nèi)容根據(jù)業(yè)務(wù)的需求也會有所不同,因此在郵件發(fā)送的過程中,數(shù)據(jù)庫扮演著非常重要的角色。
不過由于QQ郵箱是個人郵件系統(tǒng),每天只能發(fā)送幾百封郵件,不太適合用戶量比較大的小程序作為企業(yè)業(yè)務(wù)來進(jìn)行郵件的發(fā)送。
實現(xiàn)密碼校驗與郵件的定時發(fā)送
當(dāng)用戶在個人資料里綁定自己的郵箱時,可以發(fā)送郵件以及校驗碼,校驗碼可以是數(shù)據(jù)庫的一個字段,它的值可以是一些隨機(jī)生成的字符串,但是有一定的生命周期,比如半個小時之后會失效,這個自動失效的操作則需要使用到定時觸發(fā)器;郵件也可以是周報、日報的周期性定時發(fā)送,在每天或每周的某個時間點,批量收集當(dāng)天或當(dāng)周的數(shù)據(jù)自動發(fā)送給用戶,這個也是依賴定時觸發(fā)器,這個我們會在后面定時觸發(fā)器的章節(jié)進(jìn)行說明。
更多建議: