golang qq郵件發(fā)送驗(yàn)證碼功能
驗(yàn)證碼的使用場(chǎng)景
- 注冊(cè)/登錄:使用驗(yàn)證碼可以有效減少垃圾賬號(hào)注冊(cè)和惡意登錄;
- 短信接口保護(hù):高效減少防止短信接口被刷情況;
- 提交/投票:有效減少惡意刷單、惡意提交、惡意投票等情況;
- 密碼找回:用于找回密碼、修改手機(jī)等需要校驗(yàn)用戶屬于本人操作的情況;
- 支付驗(yàn)證:用戶付款時(shí)驗(yàn)證手機(jī)號(hào),保障用戶資金安全。
例子:golang發(fā)送qq郵件
第一步:拿到授權(quán)碼
通過(guò)編碼的方式發(fā)送郵件,就是調(diào)用qq郵箱提供的接口來(lái)進(jìn)行郵件的發(fā)送,我們?cè)诰帉?xiě)該功能前,需要拿到qq郵箱的POP3/SMTP服務(wù)的授權(quán)碼。
我們開(kāi)啟SMTP/IMAP服務(wù),生成授權(quán)碼,保存一下授權(quán)碼,后面要用到。
第二步:下載依賴包
go get gopkg.in/gomail.v2
這個(gè)例子中我使用的是 gopkg.in/gomail.v2 包,發(fā)送郵件也可以用 github.com/jordan-wright/email 包。
第三步:寫(xiě)代碼
注意要點(diǎn):
驗(yàn)證碼有效時(shí)間兩次發(fā)送驗(yàn)證碼的間隔時(shí)間一個(gè)驗(yàn)證碼只能使用一次
因?yàn)樯婕暗綌?shù)據(jù)庫(kù),所以我省略掉了這部分的代碼,讀者自行添加
將項(xiàng)目中的發(fā)送郵件的內(nèi)容抽取出來(lái)得到以下簡(jiǎn)略代碼:
package main import ( "fmt" "gopkg.in/gomail.v2" "math/rand" "time" ) // RandomGenerateVerificationCode 隨機(jī)生成長(zhǎng)度為 l 的數(shù)字字母混合驗(yàn)證碼 func RandomGenerateVerificationCode(l int) string { rand.Seed(time.Now().UnixNano()) const letters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" b := make([]byte, l) for i := range b { b[i] = letters[rand.Intn(len(letters))] } return string(b) } // sendEmail from 給 to 發(fā)送指定的郵件消息 func sendEmail(from string, to string, subject string, body string, authorizeCode string) error { m := gomail.NewMessage() // 設(shè)置郵件消息的頭部字段(例如發(fā)件人、收件人、主題等)。 m.SetHeader("From", from) // 發(fā)送人 m.SetHeader("To", to) // 接收人 // m.SetAddressHeader("Cc", "xxx@qq.com", "xiaozhujiao") // 抄送人 m.SetHeader("Subject", subject) // 主題 m.SetBody("text/plain", body) // 正文的內(nèi)容。text/plain表示純文本,"text/html" 表示 HTML 內(nèi)容。 // m.Attach("myIpPic.png") // 附件 // gomail.NewDialer():創(chuàng)建一個(gè)新的郵件撥號(hào)器對(duì)象,用于通過(guò)指定的 SMTP 服務(wù)器發(fā)送郵件。 // 四個(gè)參數(shù): // host:SMTP 服務(wù)器的主機(jī)地址。例如 "smtp.qq.com"。 // port:SMTP 服務(wù)器的端口號(hào)。例如 587。 // username:SMTP 服務(wù)器的用戶名(通常是你的郵箱地址)。 // password:SMTP 服務(wù)器的密碼(或者授權(quán)碼)。 d := gomail.NewDialer("smtp.qq.com", 587, from, authorizeCode) // 通過(guò)撥號(hào)器對(duì)象發(fā)送指定的郵件消息 if err := d.DialAndSend(m); err != nil { return err } return nil } func main() { l := 6 code := RandomGenerateVerificationCode(l) from := "XXXXXXXXX@qq.com" to := "XXXXXXX@qq.com" subject := "驗(yàn)證碼" body := fmt.Sprintf("你的驗(yàn)證碼為 %s,有效時(shí)間為 %s\n", code, "5分鐘") authorizeCode := "XXXXXXXXXXXX" // 授權(quán)代碼 err := sendEmail(from, to, subject, body, authorizeCode) if err != nil { fmt.Println("err = ", err) return } // 從數(shù)據(jù)庫(kù)中檢驗(yàn)密碼(注意密碼加密)...... }
結(jié)果:
如果想要發(fā)送的結(jié)果更好看一點(diǎn),我們可以添加html代碼,將main函數(shù)里面的body修改為:
body := fmt.Sprintf(` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>驗(yàn)證碼</title> <style> body { font-family: Arial, sans-serif; } .container { padding: 20px; border: 1px solid #ddd; border-radius: 5px; } h1 { color: #333; } .code { font-size: 24px; font-weight: bold; color: #007bff; } .footer { margin-top: 20px; font-size: 12px; color: #888; } </style> </head> <body> <div class="container"> <h1>你的驗(yàn)證碼</h1> <p class="code">%s</p> <p>有效時(shí)間為 5 分鐘</p> <div class="footer">如果您沒(méi)有請(qǐng)求此驗(yàn)證碼,請(qǐng)忽略此郵件。</div> </div> </body> </html> `, code)
再次運(yùn)行代碼,結(jié)果如下:
當(dāng)然除此之外還有行為驗(yàn)證碼,圖片驗(yàn)證碼,語(yǔ)音驗(yàn)證碼...圖片如下:
到此這篇關(guān)于golang qq郵件發(fā)送驗(yàn)證碼的文章就介紹到這了,更多相關(guān)golang qq郵件發(fā)送驗(yàn)證碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言實(shí)現(xiàn)UDP協(xié)議及TCP通訊
這篇文章介紹了Go語(yǔ)言實(shí)現(xiàn)UDP協(xié)議及TCP通訊的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07golang替換無(wú)法顯示的特殊字符(\u0000,?\000,?^@)
這篇文章主要介紹了golang替換無(wú)法顯示的特殊字符,包括的字符有\(zhòng)u0000,?\000,?^@等,下文詳細(xì)資料,需要的小伙伴可以參考一下2022-04-04Go操作mongodb數(shù)據(jù)庫(kù)方法示例
這篇文章主要為大家介紹了Go操作mongodb數(shù)據(jù)庫(kù)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Go語(yǔ)言反射reflect.Value實(shí)現(xiàn)方法的調(diào)用
本文主要介紹了Go語(yǔ)言反射reflect.Value實(shí)現(xiàn)方法的調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05使用Go語(yǔ)言編寫(xiě)一個(gè)NTP服務(wù)器的流程步驟
NTP服務(wù)器【Network?Time?Protocol(NTP)】是用來(lái)使計(jì)算機(jī)時(shí)間同步化的一種協(xié)議,為了確保封閉局域網(wǎng)內(nèi)多個(gè)服務(wù)器的時(shí)間同步,我們計(jì)劃部署一個(gè)網(wǎng)絡(luò)時(shí)間同步服務(wù)器(NTP服務(wù)器),本文給大家介紹了使用Go語(yǔ)言編寫(xiě)一個(gè)NTP服務(wù)器的流程步驟,需要的朋友可以參考下2024-11-11goland中使用leetcode插件實(shí)現(xiàn)
本文主要介紹了goland中使用leetcode插件實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04關(guān)于Golang標(biāo)準(zhǔn)庫(kù)flag的全面講解
這篇文章主要介紹了關(guān)于Golang標(biāo)準(zhǔn)庫(kù)flag的全面講解,這個(gè)庫(kù)的代碼量只有1000行左右,卻提供了非常完善的命令行參數(shù)解析功能,更多相關(guān)內(nèi)容需要的朋友可以參考一下2022-09-09Golang使用archive/zip包實(shí)現(xiàn)ZIP壓縮與解壓
Golang?中的?archive/zip?包用于處理?ZIP?格式的壓縮文件,提供了一系列用于創(chuàng)建、讀取和解壓縮?ZIP?格式文件的函數(shù)和類型,使用起來(lái)非常方便,下面就跟隨小編一起了解一下具體使用方法吧2023-08-08