golang qq郵件發(fā)送驗證碼功能
驗證碼的使用場景
- 注冊/登錄:使用驗證碼可以有效減少垃圾賬號注冊和惡意登錄;
- 短信接口保護:高效減少防止短信接口被刷情況;
- 提交/投票:有效減少惡意刷單、惡意提交、惡意投票等情況;
- 密碼找回:用于找回密碼、修改手機等需要校驗用戶屬于本人操作的情況;
- 支付驗證:用戶付款時驗證手機號,保障用戶資金安全。
例子:golang發(fā)送qq郵件
第一步:拿到授權碼
通過編碼的方式發(fā)送郵件,就是調(diào)用qq郵箱提供的接口來進行郵件的發(fā)送,我們在編寫該功能前,需要拿到qq郵箱的POP3/SMTP服務的授權碼。
我們開啟SMTP/IMAP服務,生成授權碼,保存一下授權碼,后面要用到。
第二步:下載依賴包
go get gopkg.in/gomail.v2
這個例子中我使用的是 gopkg.in/gomail.v2 包,發(fā)送郵件也可以用 github.com/jordan-wright/email 包。
第三步:寫代碼
注意要點:
驗證碼有效時間兩次發(fā)送驗證碼的間隔時間一個驗證碼只能使用一次
因為涉及到數(shù)據(jù)庫,所以我省略掉了這部分的代碼,讀者自行添加
將項目中的發(fā)送郵件的內(nèi)容抽取出來得到以下簡略代碼:
package main import ( "fmt" "gopkg.in/gomail.v2" "math/rand" "time" ) // RandomGenerateVerificationCode 隨機生成長度為 l 的數(shù)字字母混合驗證碼 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() // 設置郵件消息的頭部字段(例如發(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)建一個新的郵件撥號器對象,用于通過指定的 SMTP 服務器發(fā)送郵件。 // 四個參數(shù): // host:SMTP 服務器的主機地址。例如 "smtp.qq.com"。 // port:SMTP 服務器的端口號。例如 587。 // username:SMTP 服務器的用戶名(通常是你的郵箱地址)。 // password:SMTP 服務器的密碼(或者授權碼)。 d := gomail.NewDialer("smtp.qq.com", 587, from, authorizeCode) // 通過撥號器對象發(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 := "驗證碼" body := fmt.Sprintf("你的驗證碼為 %s,有效時間為 %s\n", code, "5分鐘") authorizeCode := "XXXXXXXXXXXX" // 授權代碼 err := sendEmail(from, to, subject, body, authorizeCode) if err != nil { fmt.Println("err = ", err) return } // 從數(shù)據(jù)庫中檢驗密碼(注意密碼加密)...... }
結(jié)果:
如果想要發(fā)送的結(jié)果更好看一點,我們可以添加html代碼,將main函數(shù)里面的body修改為:
body := fmt.Sprintf(` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>驗證碼</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>你的驗證碼</h1> <p class="code">%s</p> <p>有效時間為 5 分鐘</p> <div class="footer">如果您沒有請求此驗證碼,請忽略此郵件。</div> </div> </body> </html> `, code)
再次運行代碼,結(jié)果如下:
當然除此之外還有行為驗證碼,圖片驗證碼,語音驗證碼...圖片如下:
到此這篇關于golang qq郵件發(fā)送驗證碼的文章就介紹到這了,更多相關golang qq郵件發(fā)送驗證碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
golang替換無法顯示的特殊字符(\u0000,?\000,?^@)
這篇文章主要介紹了golang替換無法顯示的特殊字符,包括的字符有\(zhòng)u0000,?\000,?^@等,下文詳細資料,需要的小伙伴可以參考一下2022-04-04Go語言反射reflect.Value實現(xiàn)方法的調(diào)用
本文主要介紹了Go語言反射reflect.Value實現(xiàn)方法的調(diào)用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05Golang使用archive/zip包實現(xiàn)ZIP壓縮與解壓
Golang?中的?archive/zip?包用于處理?ZIP?格式的壓縮文件,提供了一系列用于創(chuàng)建、讀取和解壓縮?ZIP?格式文件的函數(shù)和類型,使用起來非常方便,下面就跟隨小編一起了解一下具體使用方法吧2023-08-08